Skip to content

Commit 8f5e5e0

Browse files
committed
[fix] buffer overflow after wrap-ing data - wait
1 parent 6f155e7 commit 8f5e5e0

File tree

1 file changed

+11
-3
lines changed

1 file changed

+11
-3
lines changed

src/main/java/org/jruby/ext/openssl/SSLSocket.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -574,9 +574,8 @@ private IRubyObject doHandshake(final boolean blocking, final boolean exception)
574574
if (readAndUnwrap(blocking) == -1 && handshakeStatus != SSLEngineResult.HandshakeStatus.FINISHED) {
575575
throw new SSLHandshakeException("Socket closed");
576576
}
577-
// during initialHandshake, calling readAndUnwrap that results UNDERFLOW
578-
// does not mean writable. we explicitly wait for readable channel to avoid
579-
// busy loop.
577+
// during initialHandshake, calling readAndUnwrap that results UNDERFLOW does not mean writable.
578+
// we explicitly wait for readable channel to avoid busy loop.
580579
if (initialHandshake && status == SSLEngineResult.Status.BUFFER_UNDERFLOW) {
581580
sel = waitSelect(SelectionKey.OP_READ, blocking, exception);
582581
if ( sel instanceof IRubyObject ) return (IRubyObject) sel; // :wait_readable
@@ -589,6 +588,15 @@ private IRubyObject doHandshake(final boolean blocking, final boolean exception)
589588
assert !netData.hasRemaining();
590589
doWrap(blocking);
591590
flushData(blocking);
591+
assert status != SSLEngineResult.Status.BUFFER_UNDERFLOW;
592+
if (status == SSLEngineResult.Status.BUFFER_OVERFLOW) {
593+
netData.compact();
594+
netData.flip();
595+
if (handshakeStatus != SSLEngineResult.HandshakeStatus.NEED_UNWRAP || flushData(blocking)) {
596+
sel = waitSelect(SelectionKey.OP_WRITE, blocking, exception);
597+
if ( sel instanceof IRubyObject ) return (IRubyObject) sel; // :wait_writeable
598+
}
599+
}
592600
break;
593601
default:
594602
throw new IllegalStateException("Unknown handshaking status: " + handshakeStatus);

0 commit comments

Comments
 (0)