@ -2681,100 +2681,100 @@ bool ProcessMessages(CNode* pfrom, CConnman& connman, const std::atomic<bool>& i
// this maintains the order of responses
// this maintains the order of responses
if ( ! pfrom - > vRecvGetData . empty ( ) ) return true ;
if ( ! pfrom - > vRecvGetData . empty ( ) ) return true ;
// 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 - > fPauseSend )
if ( pfrom - > fPauseSend )
return false ;
return false ;
std : : list < CNetMessage > msgs ;
std : : list < CNetMessage > msgs ;
{
{
LOCK ( pfrom - > cs_vProcessMsg ) ;
LOCK ( pfrom - > cs_vProcessMsg ) ;
if ( pfrom - > vProcessMsg . empty ( ) )
if ( pfrom - > vProcessMsg . empty ( ) )
return false ;
// Just take one message
msgs . splice ( msgs . begin ( ) , pfrom - > vProcessMsg , pfrom - > vProcessMsg . begin ( ) ) ;
pfrom - > nProcessQueueSize - = msgs . front ( ) . vRecv . size ( ) + CMessageHeader : : HEADER_SIZE ;
pfrom - > fPauseRecv = pfrom - > nProcessQueueSize > connman . GetReceiveFloodSize ( ) ;
fMoreWork = ! pfrom - > vProcessMsg . empty ( ) ;
}
CNetMessage & msg ( msgs . front ( ) ) ;
msg . SetVersion ( pfrom - > GetRecvVersion ( ) ) ;
// Scan for message start
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 ) ;
pfrom - > fDisconnect = true ;
return false ;
return false ;
}
// Just take one message
msgs . splice ( msgs . begin ( ) , pfrom - > vProcessMsg , pfrom - > vProcessMsg . begin ( ) ) ;
pfrom - > nProcessQueueSize - = msgs . front ( ) . vRecv . size ( ) + CMessageHeader : : HEADER_SIZE ;
pfrom - > fPauseRecv = pfrom - > nProcessQueueSize > connman . GetReceiveFloodSize ( ) ;
fMoreWork = ! pfrom - > vProcessMsg . empty ( ) ;
}
CNetMessage & msg ( msgs . front ( ) ) ;
msg . SetVersion ( pfrom - > GetRecvVersion ( ) ) ;
// Scan for message start
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 ) ;
pfrom - > fDisconnect = true ;
return false ;
}
// Read header
// Read header
CMessageHeader & hdr = msg . hdr ;
CMessageHeader & hdr = msg . hdr ;
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 ) ;
return fMoreWork ;
return fMoreWork ;
}
}
std : : string strCommand = hdr . GetCommand ( ) ;
std : : string strCommand = hdr . GetCommand ( ) ;
// Message size
unsigned int nMessageSize = hdr . nMessageSize ;
// Message size
// Checksum
unsigned int nMessageSize = hdr . nMessageSize ;
CDataStream & vRecv = msg . vRecv ;
const uint256 & hash = msg . GetMessageHash ( ) ;
if ( memcmp ( hash . begin ( ) , hdr . pchChecksum , CMessageHeader : : CHECKSUM_SIZE ) ! = 0 )
{
LogPrintf ( " %s(%s, %u bytes): CHECKSUM ERROR expected %s was %s \n " , __func__ ,
SanitizeString ( strCommand ) , nMessageSize ,
HexStr ( hash . begin ( ) , hash . begin ( ) + CMessageHeader : : CHECKSUM_SIZE ) ,
HexStr ( hdr . pchChecksum , hdr . pchChecksum + CMessageHeader : : CHECKSUM_SIZE ) ) ;
return fMoreWork ;
}
// Checksum
// Process message
CDataStream & vRecv = msg . vRecv ;
bool fRet = false ;
const uint256 & hash = msg . GetMessageHash ( ) ;
try
if ( memcmp ( hash . begin ( ) , hdr . pchChecksum , CMessageHeader : : CHECKSUM_SIZE ) ! = 0 )
{
fRet = ProcessMessage ( pfrom , strCommand , vRecv , msg . nTime , chainparams , connman , interruptMsgProc ) ;
if ( interruptMsgProc )
return false ;
if ( ! pfrom - > vRecvGetData . empty ( ) )
fMoreWork = true ;
}
catch ( const std : : ios_base : : failure & e )
{
connman . PushMessage ( pfrom , CNetMsgMaker ( INIT_PROTO_VERSION ) . Make ( NetMsgType : : REJECT , strCommand , REJECT_MALFORMED , std : : string ( " error parsing message " ) ) ) ;
if ( strstr ( e . what ( ) , " end of data " ) )
{
{
LogPrintf ( " %s(%s, %u bytes): CHECKSUM ERROR expected %s was %s \n " , __func__ ,
// Allow exceptions from under-length message on vRecv
SanitizeString ( strCommand ) , nMessageSize ,
LogPrintf ( " %s(%s, %u bytes): Exception '%s' caught, normally caused by a message being shorter than its stated length \n " , __func__ , SanitizeString ( strCommand ) , nMessageSize , e . what ( ) ) ;
HexStr ( hash . begin ( ) , hash . begin ( ) + CMessageHeader : : CHECKSUM_SIZE ) ,
HexStr ( hdr . pchChecksum , hdr . pchChecksum + CMessageHeader : : CHECKSUM_SIZE ) ) ;
return fMoreWork ;
}
}
else if ( strstr ( e . what ( ) , " size too large " ) )
// Process message
bool fRet = false ;
try
{
{
fRet = ProcessMessage ( pfrom , strCommand , vRecv , msg . nTime , chainparams , connman , interruptMsgProc ) ;
// Allow exceptions from over-long size
if ( interruptMsgProc )
LogPrintf ( " %s(%s, %u bytes): Exception '%s' caught \n " , __func__ , SanitizeString ( strCommand ) , nMessageSize , e . what ( ) ) ;
return false ;
if ( ! pfrom - > vRecvGetData . empty ( ) )
fMoreWork = true ;
}
}
catch ( const std : : ios_base : : failure & e )
else if ( strstr ( e . what ( ) , " non-canonical ReadCompactSize() " ) )
{
{
connman . PushMessage ( pfrom , CNetMsgMaker ( INIT_PROTO_VERSION ) . Make ( NetMsgType : : REJECT , strCommand , REJECT_MALFORMED , std : : string ( " error parsing message " ) ) ) ;
// Allow exceptions from non-canonical encoding
if ( strstr ( e . what ( ) , " end of data " ) )
LogPrintf ( " %s(%s, %u bytes): Exception '%s' caught \n " , __func__ , SanitizeString ( strCommand ) , nMessageSize , e . what ( ) ) ;
{
// Allow exceptions from under-length message on vRecv
LogPrintf ( " %s(%s, %u bytes): Exception '%s' caught, normally caused by a message being shorter than its stated length \n " , __func__ , SanitizeString ( strCommand ) , nMessageSize , e . what ( ) ) ;
}
else if ( strstr ( e . what ( ) , " size too large " ) )
{
// Allow exceptions from over-long size
LogPrintf ( " %s(%s, %u bytes): Exception '%s' caught \n " , __func__ , SanitizeString ( strCommand ) , nMessageSize , e . what ( ) ) ;
}
else if ( strstr ( e . what ( ) , " non-canonical ReadCompactSize() " ) )
{
// Allow exceptions from non-canonical encoding
LogPrintf ( " %s(%s, %u bytes): Exception '%s' caught \n " , __func__ , SanitizeString ( strCommand ) , nMessageSize , e . what ( ) ) ;
}
else
{
PrintExceptionContinue ( & e , " ProcessMessages() " ) ;
}
}
}
catch ( const std : : exception & e ) {
else
{
PrintExceptionContinue ( & e , " ProcessMessages() " ) ;
PrintExceptionContinue ( & e , " ProcessMessages() " ) ;
} catch ( . . . ) {
PrintExceptionContinue ( NULL , " ProcessMessages() " ) ;
}
}
}
catch ( const std : : exception & e ) {
PrintExceptionContinue ( & e , " ProcessMessages() " ) ;
} catch ( . . . ) {
PrintExceptionContinue ( NULL , " ProcessMessages() " ) ;
}
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 ) ;
}
}
LOCK ( cs_main ) ;
LOCK ( cs_main ) ;
SendRejectsAndCheckIfBanned ( pfrom , connman ) ;
SendRejectsAndCheckIfBanned ( pfrom , connman ) ;
return fMoreWork ;
return fMoreWork ;
}
}