Skip to content

Commit 744b489

Browse files
committed
[fix] adjust write fix to revert regressions (hangs)
follow-up on 75a66e1 which would not work with the higher level syswrite usage
1 parent 68d4c2f commit 744b489

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -674,28 +674,32 @@ 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;
677+
boolean loop = false; int written = 0;
678678
try {
679-
while (true) {
680-
if (netWriteData.hasRemaining()) flushData(blocking);
681-
else if (!src.hasRemaining()) break;
682-
679+
if (netWriteData.hasRemaining()) flushData(blocking);
680+
do {
683681
netWriteData.clear();
684682
final SSLEngineResult result = engine.wrap(src, netWriteData);
685683
netWriteData.flip();
686684

687685
switch (result.getStatus()) {
688686
case OK:
687+
loop = flushData(blocking) && src.hasRemaining();
689688
written += result.bytesConsumed();
690689
break;
691690
case BUFFER_OVERFLOW:
692691
netWriteData = Utils.ensureCapacity(netWriteData, engine.getSession().getPacketBufferSize());
693692
netWriteData.position(netWriteData.limit());
693+
loop = true; // src.hasRemaining();
694+
if (netWriteData.hasRemaining()) flushData(blocking);
694695
break;
695696
case CLOSED:
696697
throw getRuntime().newIOError("closed SSL engine"); // EOF?
698+
case BUFFER_UNDERFLOW:
699+
debug("SSLSocket.write unexpected BUFFER_UNDERFLOW");
700+
return written;
697701
}
698-
}
702+
} while (loop);
699703
}
700704
finally {
701705
if ( ! blocking ) channel.configureBlocking(blockingMode);

0 commit comments

Comments
 (0)