@@ -641,25 +641,26 @@ bool CNode::ReceiveMsgBytes(Span<const uint8_t> msg_bytes, bool& complete)
641641
642642 if (m_deserializer->Complete ()) {
643643 // 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 ) {
647647 // Message deserialization failed. Drop the message but don't disconnect the peer.
648648 // 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 ;
650650 continue ;
651651 }
652652
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 ()) {
657657 i = mapRecvBytesPerMsgCmd.find (NET_MESSAGE_COMMAND_OTHER);
658+ }
658659 assert (i != mapRecvBytesPerMsgCmd.end ());
659- i->second += result-> m_raw_message_size ;
660+ i->second += msg. m_raw_message_size ;
660661
661662 // push the message to the process queue,
662- vRecvMsg.push_back (std::move (*result ));
663+ vRecvMsg.push_back (std::move (msg ));
663664
664665 complete = true ;
665666 }
@@ -733,16 +734,18 @@ const uint256& V1TransportDeserializer::GetMessageHash() const
733734 return data_hash;
734735}
735736
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 )
737738{
739+ // Initialize out parameter
740+ reject_message = false ;
738741 // decompose a single CNetMessage from the TransportDeserializer
739- std::optional< CNetMessage> msg (std::move (vRecv));
742+ CNetMessage msg (std::move (vRecv));
740743
741744 // 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;
746749
747750 uint256 hash = GetMessageHash ();
748751
@@ -752,17 +755,15 @@ std::optional<CNetMessage> V1TransportDeserializer::GetMessage(const std::chrono
752755 // Check checksum and header command string
753756 if (memcmp (hash.begin (), hdr.pchChecksum , CMessageHeader::CHECKSUM_SIZE) != 0 ) {
754757 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 ,
756759 HexStr (Span<uint8_t >(hash.begin (), hash.begin () + CMessageHeader::CHECKSUM_SIZE)),
757760 HexStr (hdr.pchChecksum ),
758761 m_node_id);
759- out_err_raw_size = msg->m_raw_message_size ;
760- msg = std::nullopt ;
762+ reject_message = true ;
761763 } else if (!hdr.IsCommandValid ()) {
762764 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 ;
766767 }
767768
768769 // Always reset the network deserializer (prepare for the next message)
0 commit comments