This is an automated email from the ASF dual-hosted git repository. remm pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/master by this push: new 436f7a3 Refactor read and write methods 436f7a3 is described below commit 436f7a3989e4edf79dd8bd5ca36826a561d7c9c9 Author: remm <r...@apache.org> AuthorDate: Mon Mar 15 10:31:58 2021 +0100 Refactor read and write methods Remove static to allow including the OpenSSL call error checking on all <= 0 results, as this is much less error prone this way. --- .../tomcat/util/net/openssl/OpenSSLEngine.java | 55 +++++++++++++--------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java b/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java index 99720f3..a12074a 100644 --- a/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java +++ b/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java @@ -234,8 +234,10 @@ public final class OpenSSLEngine extends SSLEngine implements SSLUtil.ProtocolIn * Write plain text data to the OpenSSL internal BIO * * Calling this function with src.remaining == 0 is undefined. + * @throws SSLException if the OpenSSL error check fails */ - private static int writePlaintextData(final long ssl, final ByteBuffer src) { + private int writePlaintextData(final long ssl, final ByteBuffer src) throws SSLException { + clearLastError(); final int pos = src.position(); final int limit = src.limit(); final int len = Math.min(limit - pos, MAX_PLAINTEXT_LENGTH); @@ -244,6 +246,9 @@ public final class OpenSSLEngine extends SSLEngine implements SSLUtil.ProtocolIn if (src.isDirect()) { final long addr = Buffer.address(src) + pos; sslWrote = SSL.writeToSSL(ssl, addr, len); + if (sslWrote <= 0) { + checkLastError(); + } if (sslWrote >= 0) { src.position(pos + sslWrote); return sslWrote; @@ -259,6 +264,9 @@ public final class OpenSSLEngine extends SSLEngine implements SSLUtil.ProtocolIn src.limit(limit); sslWrote = SSL.writeToSSL(ssl, addr, len); + if (sslWrote <= 0) { + checkLastError(); + } if (sslWrote >= 0) { src.position(pos + sslWrote); return sslWrote; @@ -277,13 +285,18 @@ public final class OpenSSLEngine extends SSLEngine implements SSLUtil.ProtocolIn /** * Write encrypted data to the OpenSSL network BIO. + * @throws SSLException if the OpenSSL error check fails */ - private static int writeEncryptedData(final long networkBIO, final ByteBuffer src) { + private int writeEncryptedData(final long networkBIO, final ByteBuffer src) throws SSLException { + clearLastError(); final int pos = src.position(); final int len = src.remaining(); if (src.isDirect()) { final long addr = Buffer.address(src) + pos; final int netWrote = SSL.writeToBIO(networkBIO, addr, len); + if (netWrote <= 0) { + checkLastError(); + } if (netWrote >= 0) { src.position(pos + netWrote); return netWrote; @@ -296,6 +309,9 @@ public final class OpenSSLEngine extends SSLEngine implements SSLUtil.ProtocolIn buf.put(src); final int netWrote = SSL.writeToBIO(networkBIO, addr, len); + if (netWrote <= 0) { + checkLastError(); + } if (netWrote >= 0) { src.position(pos + netWrote); return netWrote; @@ -313,8 +329,10 @@ public final class OpenSSLEngine extends SSLEngine implements SSLUtil.ProtocolIn /** * Read plain text data from the OpenSSL internal BIO + * @throws SSLException if the OpenSSL error check fails */ - private static int readPlaintextData(final long ssl, final ByteBuffer dst) { + private int readPlaintextData(final long ssl, final ByteBuffer dst) throws SSLException { + clearLastError(); if (dst.isDirect()) { final int pos = dst.position(); final long addr = Buffer.address(dst) + pos; @@ -323,6 +341,8 @@ public final class OpenSSLEngine extends SSLEngine implements SSLUtil.ProtocolIn if (sslRead > 0) { dst.position(pos + sslRead); return sslRead; + } else { + checkLastError(); } } else { final int pos = dst.position(); @@ -339,6 +359,8 @@ public final class OpenSSLEngine extends SSLEngine implements SSLUtil.ProtocolIn dst.put(buf); dst.limit(limit); return sslRead; + } else { + checkLastError(); } } finally { buf.clear(); @@ -351,8 +373,10 @@ public final class OpenSSLEngine extends SSLEngine implements SSLUtil.ProtocolIn /** * Read encrypted data from the OpenSSL network BIO + * @throws SSLException if the OpenSSL error check fails */ - private static int readEncryptedData(final long networkBIO, final ByteBuffer dst, final int pending) { + private int readEncryptedData(final long networkBIO, final ByteBuffer dst, final int pending) throws SSLException { + clearLastError(); if (dst.isDirect() && dst.remaining() >= pending) { final int pos = dst.position(); final long addr = Buffer.address(dst) + pos; @@ -360,6 +384,8 @@ public final class OpenSSLEngine extends SSLEngine implements SSLUtil.ProtocolIn if (bioRead > 0) { dst.position(pos + bioRead); return bioRead; + } else { + checkLastError(); } } else { final ByteBuffer buf = ByteBuffer.allocateDirect(pending); @@ -374,6 +400,8 @@ public final class OpenSSLEngine extends SSLEngine implements SSLUtil.ProtocolIn dst.put(buf); dst.limit(oldLimit); return bioRead; + } else { + checkLastError(); } } finally { buf.clear(); @@ -430,16 +458,12 @@ public final class OpenSSLEngine extends SSLEngine implements SSLUtil.ProtocolIn return new SSLEngineResult(SSLEngineResult.Status.BUFFER_OVERFLOW, handshakeStatus, 0, 0); } - clearLastError(); // Write the pending data from the network BIO into the dst buffer try { bytesProduced = readEncryptedData(networkBIO, dst, pendingNet); } catch (Exception e) { throw new SSLException(e); } - if (bytesProduced == 0) { - checkLastError(); - } // If isOutboundDone is set, then the data from the network BIO // was the close_notify message -- we are not required to wait @@ -461,16 +485,12 @@ public final class OpenSSLEngine extends SSLEngine implements SSLUtil.ProtocolIn } while (src.hasRemaining()) { - clearLastError(); // Write plain text application data to the SSL engine try { bytesConsumed += writePlaintextData(ssl, src); } catch (Exception e) { throw new SSLException(e); } - if (bytesConsumed == 0) { - checkLastError(); - } // Check to see if the engine wrote data into the network BIO pendingNet = SSL.pendingWrittenBytesInBIO(networkBIO); @@ -482,16 +502,12 @@ public final class OpenSSLEngine extends SSLEngine implements SSLUtil.ProtocolIn SSLEngineResult.Status.BUFFER_OVERFLOW, getHandshakeStatus(), bytesConsumed, bytesProduced); } - clearLastError(); // Write the pending data from the network BIO into the dst buffer try { bytesProduced += readEncryptedData(networkBIO, dst, pendingNet); } catch (Exception e) { throw new SSLException(e); } - if (bytesProduced == 0) { - checkLastError(); - } return new SSLEngineResult(getEngineStatus(), getHandshakeStatus(), bytesConsumed, bytesProduced); } @@ -553,17 +569,12 @@ public final class OpenSSLEngine extends SSLEngine implements SSLUtil.ProtocolIn } // Write encrypted data to network BIO - clearLastError(); int written = 0; try { written = writeEncryptedData(networkBIO, src); } catch (Exception e) { throw new SSLException(e); } - // OpenSSL can return 0 or -1 to these calls if nothing was written - if (written == 0) { - checkLastError(); - } // There won't be any application data until we're done handshaking // @@ -597,7 +608,6 @@ public final class OpenSSLEngine extends SSLEngine implements SSLUtil.ProtocolIn break; } - clearLastError(); int bytesRead; try { bytesRead = readPlaintextData(ssl, dst); @@ -606,7 +616,6 @@ public final class OpenSSLEngine extends SSLEngine implements SSLUtil.ProtocolIn } if (bytesRead == 0) { - checkLastError(); // This should not be possible. pendingApp is positive // therefore the read should have read at least one byte. throw new IllegalStateException(sm.getString("engine.failedToReadAvailableBytes")); --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org