diff options
author | Benoit Foucher <benoit@zeroc.com> | 2016-03-31 08:38:29 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2016-03-31 08:38:29 +0200 |
commit | 04c83affba981565fcca3b3bfa2a3d96ca331c81 (patch) | |
tree | 8cf749969ff9209645130bb8e4433d837c77c6d6 /cpp/src/IceSSL/SecureTransportTransceiverI.cpp | |
parent | Merge remote-tracking branch 'origin/3.6' (diff) | |
parent | Fixed Glacier2 bug which would cause hang on shutdown (diff) | |
download | ice-04c83affba981565fcca3b3bfa2a3d96ca331c81.tar.bz2 ice-04c83affba981565fcca3b3bfa2a3d96ca331c81.tar.xz ice-04c83affba981565fcca3b3bfa2a3d96ca331c81.zip |
Merge remote-tracking branch 'origin/3.6'
Diffstat (limited to 'cpp/src/IceSSL/SecureTransportTransceiverI.cpp')
-rw-r--r-- | cpp/src/IceSSL/SecureTransportTransceiverI.cpp | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/cpp/src/IceSSL/SecureTransportTransceiverI.cpp b/cpp/src/IceSSL/SecureTransportTransceiverI.cpp index dc9d421b957..b043ef19713 100644 --- a/cpp/src/IceSSL/SecureTransportTransceiverI.cpp +++ b/cpp/src/IceSSL/SecureTransportTransceiverI.cpp @@ -407,17 +407,13 @@ IceSSL::TransceiverI::read(IceInternal::Buffer& buf) return _stream->read(buf); } - // - // Note: we assume that SecureTransport doesn't read more SSL records - // than necessary to fill the requested data and that the sender sends - // Ice messages in individual SSL records. - // - if(buf.i == buf.b.end()) { return IceInternal::SocketOperationNone; } + _stream->ready(IceInternal::SocketOperationRead, false); + size_t packetSize = std::min(static_cast<size_t>(buf.b.end() - buf.i), _maxRecvPacketSize); while(buf.i != buf.b.end()) { @@ -464,6 +460,18 @@ IceSSL::TransceiverI::read(IceInternal::Buffer& buf) packetSize = buf.b.end() - buf.i; } } + + // + // Check if there's still buffered data to read. In this case, set the read ready status. + // + size_t buffered = 0; + OSStatus err = SSLGetBufferedReadSize(_ssl, &buffered); + if(err) + { + errno = err; + throw SocketException(__FILE__, __LINE__, IceInternal::getSocketErrno()); + } + _stream->ready(IceInternal::SocketOperationRead, buffered > 0); return IceInternal::SocketOperationNone; } |