diff --git a/ChangeLog b/ChangeLog index bb9824bf..d41675c0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-06-09 Tatsuhiro Tsujikawa + + Returns cached data only when the previous receiveHandshake() is called + with peek = true. + * src/PeerConnection.cc (receiveHandshake) + * src/PeerConnection.h (receiveHandshake) + 2008-06-09 Tatsuhiro Tsujikawa Changed default value of -s option from 1 to 5. diff --git a/src/PeerConnection.cc b/src/PeerConnection.cc index bec8c631..69a0e067 100644 --- a/src/PeerConnection.cc +++ b/src/PeerConnection.cc @@ -59,7 +59,8 @@ PeerConnection::PeerConnection(int32_t cuid, resbufLength(0), currentPayloadLength(0), lenbufLength(0), - _encryptionEnabled(false) + _encryptionEnabled(false), + _prevPeek(false) {} PeerConnection::~PeerConnection() {} @@ -130,15 +131,19 @@ bool PeerConnection::receiveMessage(unsigned char* data, size_t& dataLength) { bool PeerConnection::receiveHandshake(unsigned char* data, size_t& dataLength, bool peek) { + assert(BtHandshakeMessage::MESSAGE_LENGTH >= resbufLength); bool retval = true; - if(!peek && resbufLength) { + if(_prevPeek && !peek && resbufLength) { // We have data in previous peek. // There is a chance that socket is readable because of EOF, for example, // official bttrack shutdowns socket after sending first 48 bytes of // handshake in its NAT checking. // So if there are data in resbuf, return it without checking socket // status. + _prevPeek = false; + retval = BtHandshakeMessage::MESSAGE_LENGTH <= resbufLength; } else { + _prevPeek = peek; size_t remaining = BtHandshakeMessage::MESSAGE_LENGTH-resbufLength; if(remaining > 0 && !socket->isReadable(0)) { dataLength = 0; diff --git a/src/PeerConnection.h b/src/PeerConnection.h index cccf13c5..d543d4e8 100644 --- a/src/PeerConnection.h +++ b/src/PeerConnection.h @@ -68,6 +68,8 @@ private: SharedHandle _encryptor; SharedHandle _decryptor; + bool _prevPeek; + void readData(unsigned char* data, size_t& length, bool encryption); void sendData(const unsigned char* data, size_t length, bool encryption);