@ -2453,36 +2453,43 @@ bool ProcessMessages(CNode* pfrom, CConnman& connman, std::atomic<bool>& interru
// (4) checksum
// (4) checksum
// (x) data
// (x) data
//
//
bool fOk = tru e ;
bool fMoreWork = fals e ;
if ( ! pfrom - > vRecvGetData . empty ( ) )
if ( ! pfrom - > vRecvGetData . empty ( ) )
ProcessGetData ( pfrom , chainparams . GetConsensus ( ) , connman , interruptMsgProc ) ;
ProcessGetData ( pfrom , chainparams . GetConsensus ( ) , connman , interruptMsgProc ) ;
if ( pfrom - > fDisconnect )
return false ;
// this maintains the order of responses
// this maintains the order of responses
if ( ! pfrom - > vRecvGetData . empty ( ) ) return fOk ;
if ( ! pfrom - > vRecvGetData . empty ( ) ) return true ;
auto it = pfrom - > vRecvMsg . begin ( ) ;
while ( ! pfrom - > fDisconnect & & it ! = pfrom - > vRecvMsg . end ( ) ) {
// Don't bother if send buffer is too full to respond anyway
// Don't bother if send buffer is too full to respond anyway
if ( pfrom - > nSendSize > = nMaxSendBufferSize )
if ( pfrom - > nSendSize > = nMaxSendBufferSize )
break ;
return false ;
// get next message
auto it = pfrom - > vRecvMsg . begin ( ) ;
CNetMessage & msg = * it ;
if ( it = = pfrom - > vRecvMsg . end ( ) )
return false ;
// end, if an incomplete message is found
// end, if an incomplete message is found
if ( ! msg . complete ( ) )
if ( ! it - > complete ( ) )
break ;
return false ;
// get next message
CNetMessage msg = std : : move ( * it ) ;
// at this point, any failure means we can delete the current message
// at this point, any failure means we can delete the current message
it + + ;
pfrom - > vRecvMsg . erase ( pfrom - > vRecvMsg . begin ( ) ) ;
fMoreWork = ! pfrom - > vRecvMsg . empty ( ) & & pfrom - > vRecvMsg . front ( ) . complete ( ) ;
msg . SetVersion ( pfrom - > GetRecvVersion ( ) ) ;
msg . SetVersion ( pfrom - > GetRecvVersion ( ) ) ;
// Scan for message start
// Scan for message start
if ( memcmp ( msg . hdr . pchMessageStart , chainparams . MessageStart ( ) , CMessageHeader : : MESSAGE_START_SIZE ) ! = 0 ) {
if ( memcmp ( msg . hdr . pchMessageStart , chainparams . MessageStart ( ) , CMessageHeader : : MESSAGE_START_SIZE ) ! = 0 ) {
LogPrintf ( " PROCESSMESSAGE: INVALID MESSAGESTART %s peer=%d \n " , SanitizeString ( msg . hdr . GetCommand ( ) ) , pfrom - > id ) ;
LogPrintf ( " PROCESSMESSAGE: INVALID MESSAGESTART %s peer=%d \n " , SanitizeString ( msg . hdr . GetCommand ( ) ) , pfrom - > id ) ;
fOk = fals e;
pfrom - > fDisconnect = tru e;
break ;
return false ;
}
}
// Read header
// Read header
@ -2490,7 +2497,7 @@ bool ProcessMessages(CNode* pfrom, CConnman& connman, std::atomic<bool>& interru
if ( ! hdr . IsValid ( chainparams . MessageStart ( ) ) )
if ( ! hdr . IsValid ( chainparams . MessageStart ( ) ) )
{
{
LogPrintf ( " PROCESSMESSAGE: ERRORS IN HEADER %s peer=%d \n " , SanitizeString ( hdr . GetCommand ( ) ) , pfrom - > id ) ;
LogPrintf ( " PROCESSMESSAGE: ERRORS IN HEADER %s peer=%d \n " , SanitizeString ( hdr . GetCommand ( ) ) , pfrom - > id ) ;
continue ;
return fMoreWork ;
}
}
string strCommand = hdr . GetCommand ( ) ;
string strCommand = hdr . GetCommand ( ) ;
@ -2506,7 +2513,7 @@ bool ProcessMessages(CNode* pfrom, CConnman& connman, std::atomic<bool>& interru
SanitizeString ( strCommand ) , nMessageSize ,
SanitizeString ( strCommand ) , nMessageSize ,
HexStr ( hash . begin ( ) , hash . begin ( ) + CMessageHeader : : CHECKSUM_SIZE ) ,
HexStr ( hash . begin ( ) , hash . begin ( ) + CMessageHeader : : CHECKSUM_SIZE ) ,
HexStr ( hdr . pchChecksum , hdr . pchChecksum + CMessageHeader : : CHECKSUM_SIZE ) ) ;
HexStr ( hdr . pchChecksum , hdr . pchChecksum + CMessageHeader : : CHECKSUM_SIZE ) ) ;
continue ;
return fMoreWork ;
}
}
// Process message
// Process message
@ -2515,7 +2522,9 @@ bool ProcessMessages(CNode* pfrom, CConnman& connman, std::atomic<bool>& interru
{
{
fRet = ProcessMessage ( pfrom , strCommand , vRecv , msg . nTime , chainparams , connman , interruptMsgProc ) ;
fRet = ProcessMessage ( pfrom , strCommand , vRecv , msg . nTime , chainparams , connman , interruptMsgProc ) ;
if ( interruptMsgProc )
if ( interruptMsgProc )
return true ;
return false ;
if ( ! pfrom - > vRecvGetData . empty ( ) )
fMoreWork = true ;
}
}
catch ( const std : : ios_base : : failure & e )
catch ( const std : : ios_base : : failure & e )
{
{
@ -2549,14 +2558,7 @@ bool ProcessMessages(CNode* pfrom, CConnman& connman, std::atomic<bool>& interru
if ( ! fRet )
if ( ! fRet )
LogPrintf ( " %s(%s, %u bytes) FAILED peer=%d \n " , __func__ , SanitizeString ( strCommand ) , nMessageSize , pfrom - > id ) ;
LogPrintf ( " %s(%s, %u bytes) FAILED peer=%d \n " , __func__ , SanitizeString ( strCommand ) , nMessageSize , pfrom - > id ) ;
break ;
return fMoreWork ;
}
// In case the connection got shut down, its receive buffer was wiped
if ( ! pfrom - > fDisconnect )
pfrom - > vRecvMsg . erase ( pfrom - > vRecvMsg . begin ( ) , it ) ;
return fOk ;
}
}
class CompareInvMempoolOrder
class CompareInvMempoolOrder