Skip to content

Commit 75a66e1

Browse files
committed
[fix] handle potential buffer overflow on write
1 parent eee1ad9 commit 75a66e1

File tree

1 file changed

+21
-10
lines changed

1 file changed

+21
-10
lines changed

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

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -674,22 +674,33 @@ public int write(ByteBuffer src, boolean blocking) throws SSLException, IOExcept
674674
final boolean blockingMode = channel.isBlocking();
675675
if ( ! blocking ) channel.configureBlocking(false);
676676

677+
int written = 0;
677678
try {
678-
if ( netWriteData.hasRemaining() ) {
679-
flushData(blocking);
680-
}
681-
netWriteData.clear();
682-
final SSLEngineResult result = engine.wrap(src, netWriteData);
683-
if ( result.getStatus() == SSLEngineResult.Status.CLOSED ) {
684-
throw getRuntime().newIOError("closed SSL engine");
679+
while (true) {
680+
if (netWriteData.hasRemaining()) flushData(blocking);
681+
else if (!src.hasRemaining()) break;
682+
683+
netWriteData.clear();
684+
final SSLEngineResult result = engine.wrap(src, netWriteData);
685+
netWriteData.flip();
686+
687+
switch (result.getStatus()) {
688+
case OK:
689+
written += result.bytesConsumed();
690+
break;
691+
case BUFFER_OVERFLOW:
692+
netWriteData = Utils.ensureCapacity(netWriteData, engine.getSession().getPacketBufferSize());
693+
netWriteData.position(netWriteData.limit());
694+
break;
695+
case CLOSED:
696+
throw getRuntime().newIOError("closed SSL engine"); // EOF?
697+
}
685698
}
686-
netWriteData.flip();
687-
flushData(blocking);
688-
return result.bytesConsumed();
689699
}
690700
finally {
691701
if ( ! blocking ) channel.configureBlocking(blockingMode);
692702
}
703+
return written;
693704
}
694705

695706
public int read(final ByteBuffer dst, final boolean blocking) throws IOException {

0 commit comments

Comments
 (0)