This is an automated email from the ASF dual-hosted git repository.

remm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/main by this push:
     new 5294ebc7ba Rewrite some critical but optional code with Panama
5294ebc7ba is described below

commit 5294ebc7baaf33498f5ccc923963acef4fc2ec4d
Author: remm <r...@apache.org>
AuthorDate: Thu Jun 23 10:16:44 2022 +0200

    Rewrite some critical but optional code with Panama
    
    For some reason, this always caused problems before, now it seems to
    work (obviously no Java 17 backport for that reason).
    The code is optional since it won't be used if the connector uses direct
    buffers.
---
 .../util/net/openssl/panama/OpenSSLEngine.java     | 29 ++++++++--------------
 1 file changed, 10 insertions(+), 19 deletions(-)

diff --git 
a/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLEngine.java
 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLEngine.java
index 2af7b0947e..e93b0b7b9b 100644
--- 
a/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLEngine.java
+++ 
b/modules/openssl-foreign/src/main/java/org/apache/tomcat/util/net/openssl/panama/OpenSSLEngine.java
@@ -60,7 +60,6 @@ import static 
org.apache.tomcat.util.openssl.openssl_compat_h.*;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.buf.Asn1Parser;
-import org.apache.tomcat.util.buf.ByteBufferUtils;
 import org.apache.tomcat.util.net.Constants;
 import org.apache.tomcat.util.net.SSLUtil;
 import 
org.apache.tomcat.util.net.openssl.ciphers.OpenSSLCipherConfigurationParser;
@@ -337,6 +336,7 @@ public final class OpenSSLEngine extends SSLEngine 
implements SSLUtil.ProtocolIn
         clearLastError();
         final int pos = src.position();
         final int len = src.remaining();
+
         if (src.isDirect()) {
             final int netWrote = BIO_write(networkBIO, 
MemorySegment.ofBuffer(src), len);
             if (netWrote > 0) {
@@ -346,12 +346,10 @@ public final class OpenSSLEngine extends SSLEngine 
implements SSLUtil.ProtocolIn
                 checkLastError();
             }
         } else {
-            // This uses unsafe and does not need to be used: the connector 
should be configured with direct buffers
-            ByteBuffer buf = ByteBuffer.allocateDirect(len);
-            try {
-                buf.put(src);
-                buf.flip();
-                final int netWrote = BIO_write(networkBIO, 
MemorySegment.ofBuffer(buf), len);
+            try (var memorySession = MemorySession.openConfined()) {
+                MemorySegment bufSegment = 
memorySession.allocateArray(ValueLayout.JAVA_BYTE, len);
+                MemorySegment.copy(src.array(), pos, bufSegment, 
ValueLayout.JAVA_BYTE, 0, len);
+                final int netWrote = BIO_write(networkBIO, bufSegment, len);
                 if (netWrote > 0) {
                     src.position(pos + netWrote);
                     return netWrote;
@@ -359,9 +357,6 @@ public final class OpenSSLEngine extends SSLEngine 
implements SSLUtil.ProtocolIn
                     src.position(pos);
                     checkLastError();
                 }
-            } finally {
-                buf.clear();
-                ByteBufferUtils.cleanDirectBuffer(buf);
             }
         }
 
@@ -411,6 +406,7 @@ public final class OpenSSLEngine extends SSLEngine 
implements SSLUtil.ProtocolIn
     private int readEncryptedData(final MemoryAddress networkBIO, final 
ByteBuffer dst, final int pending) throws SSLException {
         clearLastError();
         final int pos = dst.position();
+
         if (dst.isDirect()) {
             final int bioRead = BIO_read(networkBIO, 
MemorySegment.ofBuffer(dst), pending);
             if (bioRead > 0) {
@@ -420,23 +416,18 @@ public final class OpenSSLEngine extends SSLEngine 
implements SSLUtil.ProtocolIn
                 checkLastError();
             }
         } else {
-            // This uses unsafe and does not need to be used: the connector 
should be configured with direct buffers
-            final ByteBuffer buf = ByteBuffer.allocateDirect(pending);
-            try {
-                final int bioRead = BIO_read(networkBIO, 
MemorySegment.ofBuffer(buf), pending);
+            try (var memorySession = MemorySession.openConfined()) {
+                MemorySegment bufSegment = 
memorySession.allocateArray(ValueLayout.JAVA_BYTE, pending);
+                final int bioRead = BIO_read(networkBIO, bufSegment, pending);
                 if (bioRead > 0) {
-                    buf.limit(bioRead);
                     int oldLimit = dst.limit();
                     dst.limit(pos + bioRead);
-                    dst.put(buf);
+                    dst.put(bufSegment.asSlice(0, 
bioRead).toArray(ValueLayout.JAVA_BYTE));
                     dst.limit(oldLimit);
                     return bioRead;
                 } else {
                     checkLastError();
                 }
-            } finally {
-                buf.clear();
-                ByteBufferUtils.cleanDirectBuffer(buf);
             }
         }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to