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

markt pushed a commit to branch 9.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/9.0.x by this push:
     new aa2c5bb162 Fix BZ 67929 - TLS config reload can trigger JVM crash
aa2c5bb162 is described below

commit aa2c5bb1628506bb641c77a902d45d503c85aeea
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Thu Nov 2 18:26:01 2023 +0000

    Fix BZ 67929 - TLS config reload can trigger JVM crash
---
 java/org/apache/tomcat/util/net/AbstractEndpoint.java      |  6 ++++++
 java/org/apache/tomcat/util/net/AbstractJsseEndpoint.java  |  5 +++++
 java/org/apache/tomcat/util/net/AprEndpoint.java           | 14 +++++++++-----
 java/org/apache/tomcat/util/net/SSLHostConfig.java         |  4 ++--
 .../apache/tomcat/util/net/SSLHostConfigCertificate.java   |  2 +-
 webapps/docs/changelog.xml                                 |  4 ++++
 6 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/java/org/apache/tomcat/util/net/AbstractEndpoint.java 
b/java/org/apache/tomcat/util/net/AbstractEndpoint.java
index 4424fda9c3..002c4b7da8 100644
--- a/java/org/apache/tomcat/util/net/AbstractEndpoint.java
+++ b/java/org/apache/tomcat/util/net/AbstractEndpoint.java
@@ -286,6 +286,9 @@ public abstract class AbstractEndpoint<S,U> {
         }
         if (replace) {
             SSLHostConfig previous = sslHostConfigs.put(key, sslHostConfig);
+            if (key.equals(getDefaultSSLHostConfigName())) {
+                setDefaultSslHostConfig(sslHostConfig);
+            }
             if (previous != null) {
                 unregisterJmx(sslHostConfig);
             }
@@ -376,6 +379,9 @@ public abstract class AbstractEndpoint<S,U> {
     protected abstract void createSSLContext(SSLHostConfig sslHostConfig) 
throws Exception;
 
 
+    protected abstract void setDefaultSslHostConfig(SSLHostConfig 
sslHostConfig);
+
+
     protected void logCertificate(SSLHostConfigCertificate certificate) {
         SSLHostConfig sslHostConfig = certificate.getSSLHostConfig();
 
diff --git a/java/org/apache/tomcat/util/net/AbstractJsseEndpoint.java 
b/java/org/apache/tomcat/util/net/AbstractJsseEndpoint.java
index 4732026c26..d4bbe68bcb 100644
--- a/java/org/apache/tomcat/util/net/AbstractJsseEndpoint.java
+++ b/java/org/apache/tomcat/util/net/AbstractJsseEndpoint.java
@@ -244,4 +244,9 @@ public abstract class AbstractJsseEndpoint<S,U> extends 
AbstractEndpoint<S,U> {
         }
         return null;
     }
+
+
+    protected void setDefaultSslHostConfig(SSLHostConfig sslHostConfig) {
+        // NO-OP for JSSE
+    }
 }
diff --git a/java/org/apache/tomcat/util/net/AprEndpoint.java 
b/java/org/apache/tomcat/util/net/AprEndpoint.java
index 87d1aa26b0..33e6278551 100644
--- a/java/org/apache/tomcat/util/net/AprEndpoint.java
+++ b/java/org/apache/tomcat/util/net/AprEndpoint.java
@@ -113,9 +113,9 @@ public class AprEndpoint extends 
AbstractEndpoint<Long,Long> implements SNICallB
 
 
     /**
-     * SSL context.
+     * Default SSL context. SNI callback may select a different SSL context.
      */
-    protected long sslContext = 0;
+    protected volatile long sslContext = 0;
 
 
     private int previousAcceptedPort = -1;
@@ -437,9 +437,7 @@ public class AprEndpoint extends 
AbstractEndpoint<Long,Long> implements SNICallB
                 throw new 
IllegalArgumentException(sm.getString("endpoint.noSslHostConfig",
                         getDefaultSSLHostConfigName(), getName()));
             }
-            Long defaultSSLContext = defaultSSLHostConfig.getOpenSslContext();
-            sslContext = defaultSSLContext.longValue();
-            SSLContext.registerDefault(defaultSSLContext, this);
+            setDefaultSslHostConfig(defaultSSLHostConfig);
 
             // For now, sendfile is not supported with SSL
             if (getUseSendfile()) {
@@ -504,6 +502,12 @@ public class AprEndpoint extends 
AbstractEndpoint<Long,Long> implements SNICallB
     }
 
 
+    protected void setDefaultSslHostConfig(SSLHostConfig sslHostConfig) {
+        Long ctx = sslHostConfig.getOpenSslContext();
+        sslContext = ctx.longValue();
+        SSLContext.registerDefault(ctx, this);
+    }
+
 
     @Override
     public boolean isAlpnSupported() {
diff --git a/java/org/apache/tomcat/util/net/SSLHostConfig.java 
b/java/org/apache/tomcat/util/net/SSLHostConfig.java
index af320dfbb6..fcd42b4191 100644
--- a/java/org/apache/tomcat/util/net/SSLHostConfig.java
+++ b/java/org/apache/tomcat/util/net/SSLHostConfig.java
@@ -73,11 +73,11 @@ public class SSLHostConfig implements Serializable {
 
     private String hostName = DEFAULT_SSL_HOST_NAME;
 
-    private transient Long openSslConfContext = Long.valueOf(0);
+    private transient volatile Long openSslConfContext = Long.valueOf(0);
     // OpenSSL can handle multiple certs in a single config so the reference to
     // the context is here at the virtual host level. JSSE can't so the
     // reference is held on the certificate.
-    private transient Long openSslContext = Long.valueOf(0);
+    private transient volatile Long openSslContext = Long.valueOf(0);
 
     private boolean tls13RenegotiationAvailable = false;
 
diff --git a/java/org/apache/tomcat/util/net/SSLHostConfigCertificate.java 
b/java/org/apache/tomcat/util/net/SSLHostConfigCertificate.java
index 68a6d2d378..4b7b2a4c70 100644
--- a/java/org/apache/tomcat/util/net/SSLHostConfigCertificate.java
+++ b/java/org/apache/tomcat/util/net/SSLHostConfigCertificate.java
@@ -53,7 +53,7 @@ public class SSLHostConfigCertificate implements Serializable 
{
     // OpenSSL can handle multiple certs in a single config so the reference to
     // the context is at the virtual host level. JSSE can't so the reference is
     // held here on the certificate.
-    private transient SSLContext sslContext;
+    private transient volatile SSLContext sslContext;
 
     // Common
     private final SSLHostConfig sslHostConfig;
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index fe85d9e322..cb43155501 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -169,6 +169,10 @@
         than the combinations supported by the JVM by default. Specifically,
         support the OpenSSL default of HmacSHA256 and DES-EDE3-CBC. (markt)
       </fix>
+      <fix>
+        <bug>67927</bug>: Reloading TLS configuration can cause the Connector 
to
+        refuse new connections or the JVM to crash. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Other">


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

Reply via email to