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

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


The following commit(s) were added to refs/heads/10.0.x by this push:
     new 834be80  Attempt to fix APR crash on shutdown.
834be80 is described below

commit 834be80289bf95a9ef21d3cac323ddaa7b231304
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Thu Nov 11 12:58:52 2021 +0000

    Attempt to fix APR crash on shutdown.
    
    These crashes have been observed with the new BuildBot CI system. Local
    testing indicates this fix addresses the issue but it might just be
    changing the timing.
---
 java/org/apache/tomcat/util/net/AprEndpoint.java | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/java/org/apache/tomcat/util/net/AprEndpoint.java 
b/java/org/apache/tomcat/util/net/AprEndpoint.java
index 9dda480..4445a97 100644
--- a/java/org/apache/tomcat/util/net/AprEndpoint.java
+++ b/java/org/apache/tomcat/util/net/AprEndpoint.java
@@ -714,11 +714,22 @@ public class AprEndpoint extends 
AbstractEndpoint<Long,Long> implements SNICallB
                     log.warn(sm.getString("endpoint.err.attach", 
Integer.valueOf(rv)));
                     return false;
                 }
-                if (SSLSocket.handshake(socket) != 0) {
-                    if (log.isDebugEnabled()) {
-                        log.debug(sm.getString("endpoint.err.handshake") + ": 
" + SSL.getLastError());
+
+                // Need to make sure the socket doesn't get closed while the
+                // handshake is in progress as that could trigger a JVM crash.
+                // Like stopInternal(), use the blocking status write lock as a
+                // proxy for a lock on writing to the socket.
+                WriteLock wl = ((AprSocketWrapper) 
socketWrapper).getBlockingStatusWriteLock();
+                wl.lock();
+                try {
+                    if (SSLSocket.handshake(socket) != 0) {
+                        if (log.isDebugEnabled()) {
+                            log.debug(sm.getString("endpoint.err.handshake") + 
": " + SSL.getLastError());
+                        }
+                        return false;
                     }
-                    return false;
+                } finally {
+                    wl.unlock();
                 }
 
                 if (negotiableProtocols.size() > 0) {

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

Reply via email to