@@ -641,25 +641,26 @@ bool CNode::ReceiveMsgBytes(Span<const uint8_t> msg_bytes, bool& complete)
641
641
642
642
if (m_deserializer->Complete ()) {
643
643
// decompose a transport agnostic CNetMessage from the deserializer
644
- uint32_t out_err_raw_size{ 0 };
645
- std::optional< CNetMessage> result{ m_deserializer->GetMessage (time, out_err_raw_size)} ;
646
- if (!result ) {
644
+ bool reject_message{ false };
645
+ CNetMessage msg = m_deserializer->GetMessage (time, reject_message) ;
646
+ if (reject_message ) {
647
647
// Message deserialization failed. Drop the message but don't disconnect the peer.
648
648
// store the size of the corrupt message
649
- mapRecvBytesPerMsgCmd.find (NET_MESSAGE_COMMAND_OTHER)-> second += out_err_raw_size ;
649
+ mapRecvBytesPerMsgCmd.at (NET_MESSAGE_COMMAND_OTHER) += msg. m_raw_message_size ;
650
650
continue ;
651
651
}
652
652
653
- // store received bytes per message command
654
- // to prevent a memory DOS, only allow valid commands
655
- mapMsgCmdSize::iterator i = mapRecvBytesPerMsgCmd.find (result-> m_command );
656
- if (i == mapRecvBytesPerMsgCmd.end ())
653
+ // Store received bytes per message command
654
+ // to prevent a memory DOS, only allow valid commands
655
+ auto i = mapRecvBytesPerMsgCmd.find (msg. m_command );
656
+ if (i == mapRecvBytesPerMsgCmd.end ()) {
657
657
i = mapRecvBytesPerMsgCmd.find (NET_MESSAGE_COMMAND_OTHER);
658
+ }
658
659
assert (i != mapRecvBytesPerMsgCmd.end ());
659
- i->second += result-> m_raw_message_size ;
660
+ i->second += msg. m_raw_message_size ;
660
661
661
662
// push the message to the process queue,
662
- vRecvMsg.push_back (std::move (*result ));
663
+ vRecvMsg.push_back (std::move (msg ));
663
664
664
665
complete = true ;
665
666
}
@@ -733,16 +734,18 @@ const uint256& V1TransportDeserializer::GetMessageHash() const
733
734
return data_hash;
734
735
}
735
736
736
- std::optional< CNetMessage> V1TransportDeserializer::GetMessage (const std::chrono::microseconds time, uint32_t & out_err_raw_size )
737
+ CNetMessage V1TransportDeserializer::GetMessage (const std::chrono::microseconds time, bool & reject_message )
737
738
{
739
+ // Initialize out parameter
740
+ reject_message = false ;
738
741
// decompose a single CNetMessage from the TransportDeserializer
739
- std::optional< CNetMessage> msg (std::move (vRecv));
742
+ CNetMessage msg (std::move (vRecv));
740
743
741
744
// store command string, time, and sizes
742
- msg-> m_command = hdr.GetCommand ();
743
- msg-> m_time = time;
744
- msg-> m_message_size = hdr.nMessageSize ;
745
- msg-> m_raw_message_size = hdr.nMessageSize + CMessageHeader::HEADER_SIZE;
745
+ msg. m_command = hdr.GetCommand ();
746
+ msg. m_time = time;
747
+ msg. m_message_size = hdr.nMessageSize ;
748
+ msg. m_raw_message_size = hdr.nMessageSize + CMessageHeader::HEADER_SIZE;
746
749
747
750
uint256 hash = GetMessageHash ();
748
751
@@ -752,17 +755,15 @@ std::optional<CNetMessage> V1TransportDeserializer::GetMessage(const std::chrono
752
755
// Check checksum and header command string
753
756
if (memcmp (hash.begin (), hdr.pchChecksum , CMessageHeader::CHECKSUM_SIZE) != 0 ) {
754
757
LogPrint (BCLog::NET, " Header error: Wrong checksum (%s, %u bytes), expected %s was %s, peer=%d\n " ,
755
- SanitizeString (msg-> m_command ), msg-> m_message_size ,
758
+ SanitizeString (msg. m_command ), msg. m_message_size ,
756
759
HexStr (Span<uint8_t >(hash.begin (), hash.begin () + CMessageHeader::CHECKSUM_SIZE)),
757
760
HexStr (hdr.pchChecksum ),
758
761
m_node_id);
759
- out_err_raw_size = msg->m_raw_message_size ;
760
- msg = std::nullopt;
762
+ reject_message = true ;
761
763
} else if (!hdr.IsCommandValid ()) {
762
764
LogPrint (BCLog::NET, " Header error: Invalid message type (%s, %u bytes), peer=%d\n " ,
763
- SanitizeString (hdr.GetCommand ()), msg->m_message_size , m_node_id);
764
- out_err_raw_size = msg->m_raw_message_size ;
765
- msg.reset ();
765
+ SanitizeString (hdr.GetCommand ()), msg.m_message_size , m_node_id);
766
+ reject_message = true ;
766
767
}
767
768
768
769
// Always reset the network deserializer (prepare for the next message)
0 commit comments