@@ -595,25 +595,33 @@ bool CNode::ReceiveMsgBytes(const char *pch, unsigned int nBytes, bool& complete
595
595
while (nBytes > 0 ) {
596
596
// absorb network data
597
597
int handled = m_deserializer->Read (pch, nBytes);
598
- if (handled < 0 ) return false ;
598
+ if (handled < 0 ) {
599
+ return false ;
600
+ }
599
601
600
602
pch += handled;
601
603
nBytes -= handled;
602
604
603
605
if (m_deserializer->Complete ()) {
604
606
// decompose a transport agnostic CNetMessage from the deserializer
605
- CNetMessage msg = m_deserializer->GetMessage (Params ().MessageStart (), time);
607
+ uint32_t out_err_raw_size{0 };
608
+ Optional<CNetMessage> result{m_deserializer->GetMessage (Params ().MessageStart (), time, out_err_raw_size)};
609
+ if (!result) {
610
+ // store the size of the corrupt message
611
+ mapRecvBytesPerMsgCmd.find (NET_MESSAGE_COMMAND_OTHER)->second += out_err_raw_size;
612
+ continue ;
613
+ }
606
614
607
615
// store received bytes per message command
608
616
// to prevent a memory DOS, only allow valid commands
609
- mapMsgCmdSize::iterator i = mapRecvBytesPerMsgCmd.find (msg. m_command );
617
+ mapMsgCmdSize::iterator i = mapRecvBytesPerMsgCmd.find (result-> m_command );
610
618
if (i == mapRecvBytesPerMsgCmd.end ())
611
619
i = mapRecvBytesPerMsgCmd.find (NET_MESSAGE_COMMAND_OTHER);
612
620
assert (i != mapRecvBytesPerMsgCmd.end ());
613
- i->second += msg. m_raw_message_size ;
621
+ i->second += result-> m_raw_message_size ;
614
622
615
623
// push the message to the process queue,
616
- vRecvMsg.push_back (std::move (msg ));
624
+ vRecvMsg.push_back (std::move (*result ));
617
625
618
626
complete = true ;
619
627
}
@@ -679,37 +687,36 @@ const uint256& V1TransportDeserializer::GetMessageHash() const
679
687
return data_hash;
680
688
}
681
689
682
- CNetMessage V1TransportDeserializer::GetMessage (const CMessageHeader::MessageStartChars& message_start, const std::chrono::microseconds time)
690
+ Optional< CNetMessage> V1TransportDeserializer::GetMessage (const CMessageHeader::MessageStartChars& message_start, const std::chrono::microseconds time, uint32_t & out_err_raw_size )
683
691
{
684
692
// decompose a single CNetMessage from the TransportDeserializer
685
- CNetMessage msg (std::move (vRecv));
693
+ Optional< CNetMessage> msg (std::move (vRecv));
686
694
687
695
// store state about valid header, netmagic and checksum
688
- msg. m_valid_header = hdr.IsValid (message_start);
689
- msg. m_valid_netmagic = (memcmp (hdr.pchMessageStart , message_start, CMessageHeader::MESSAGE_START_SIZE) == 0 );
696
+ msg-> m_valid_header = hdr.IsValid (message_start);
697
+ msg-> m_valid_netmagic = (memcmp (hdr.pchMessageStart , message_start, CMessageHeader::MESSAGE_START_SIZE) == 0 );
690
698
uint256 hash = GetMessageHash ();
691
699
692
- // store command string, payload size
693
- msg.m_command = hdr.GetCommand ();
694
- msg.m_message_size = hdr.nMessageSize ;
695
- msg.m_raw_message_size = hdr.nMessageSize + CMessageHeader::HEADER_SIZE;
700
+ // store command string, time, and sizes
701
+ msg->m_command = hdr.GetCommand ();
702
+ msg->m_time = time;
703
+ msg->m_message_size = hdr.nMessageSize ;
704
+ msg->m_raw_message_size = hdr.nMessageSize + CMessageHeader::HEADER_SIZE;
696
705
697
706
// We just received a message off the wire, harvest entropy from the time (and the message checksum)
698
707
RandAddEvent (ReadLE32 (hash.begin ()));
699
708
700
- msg.m_valid_checksum = (memcmp (hash.begin (), hdr.pchChecksum , CMessageHeader::CHECKSUM_SIZE) == 0 );
701
- if (!msg.m_valid_checksum ) {
709
+ if (memcmp (hash.begin (), hdr.pchChecksum , CMessageHeader::CHECKSUM_SIZE) != 0 ) {
702
710
LogPrint (BCLog::NET, " CHECKSUM ERROR (%s, %u bytes), expected %s was %s, peer=%d\n " ,
703
- SanitizeString (msg. m_command ), msg. m_message_size ,
711
+ SanitizeString (msg-> m_command ), msg-> m_message_size ,
704
712
HexStr (Span<uint8_t >(hash.begin (), hash.begin () + CMessageHeader::CHECKSUM_SIZE)),
705
713
HexStr (hdr.pchChecksum ),
706
714
m_node_id);
715
+ out_err_raw_size = msg->m_raw_message_size ;
716
+ msg = nullopt;
707
717
}
708
718
709
- // store receive time
710
- msg.m_time = time;
711
-
712
- // reset the network deserializer (prepare for the next message)
719
+ // Always reset the network deserializer (prepare for the next message)
713
720
Reset ();
714
721
return msg;
715
722
}
0 commit comments