summaryrefslogtreecommitdiff
path: root/java/ssl/jdk1.5/IceSSL/TransceiverI.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/ssl/jdk1.5/IceSSL/TransceiverI.java')
-rw-r--r--java/ssl/jdk1.5/IceSSL/TransceiverI.java25
1 files changed, 17 insertions, 8 deletions
diff --git a/java/ssl/jdk1.5/IceSSL/TransceiverI.java b/java/ssl/jdk1.5/IceSSL/TransceiverI.java
index ce59b5a7792..1cec3f88ec2 100644
--- a/java/ssl/jdk1.5/IceSSL/TransceiverI.java
+++ b/java/ssl/jdk1.5/IceSSL/TransceiverI.java
@@ -586,22 +586,31 @@ final class TransceiverI implements IceInternal.Transceiver
case NEED_UNWRAP:
{
//
- // The engine needs to receive a message. If we don't have any
- // data left in _netInput, then read some more.
+ // The engine needs more data. We might already have enough data in
+ // the _netInput buffer to satisfy the engine. If not, the engine
+ // responds with BUFFER_UNDERFLOW and we'll read from the socket.
//
_netInput.flip();
- if(!_netInput.hasRemaining())
- {
- _netInput.clear();
- read(timeout);
- _netInput.flip();
- }
result = _engine.unwrap(_netInput, _appInput);
_netInput.compact();
//
// FINISHED is only returned from wrap or unwrap, not from engine.getHandshakeResult().
//
status = result.getHandshakeStatus();
+ switch(result.getStatus())
+ {
+ case BUFFER_OVERFLOW:
+ assert(false);
+ break;
+ case BUFFER_UNDERFLOW:
+ assert(status == javax.net.ssl.SSLEngineResult.HandshakeStatus.NEED_UNWRAP);
+ read(timeout);
+ break;
+ case CLOSED:
+ throw new Ice.ConnectionLostException();
+ case OK:
+ break;
+ }
break;
}
case NEED_WRAP: