8141651: Deadlock in sun.security.ssl.SSLSocketImpl
authorxuelei
Wed, 09 Dec 2015 10:36:33 +0000
changeset 34528 279258fb670b
parent 34527 e3caf3a43d09
child 34529 3a49a6c8b989
8141651: Deadlock in sun.security.ssl.SSLSocketImpl Reviewed-by: weijun
jdk/src/java.base/share/classes/sun/security/ssl/SSLSocketImpl.java
--- a/jdk/src/java.base/share/classes/sun/security/ssl/SSLSocketImpl.java	Tue Dec 08 13:48:22 2015 -0800
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/SSLSocketImpl.java	Wed Dec 09 10:36:33 2015 +0000
@@ -766,17 +766,27 @@
         // records, so this also increases robustness.
         //
         if (length > 0) {
+            IOException ioe = null;
+            byte description = 0;    // 0: never used, make the compiler happy
             writeLock.lock();
             try {
                 outputRecord.deliver(source, offset, length);
             } catch (SSLHandshakeException she) {
                 // may be record sequence number overflow
-                fatal(Alerts.alert_handshake_failure, she);
+                description = Alerts.alert_handshake_failure;
+                ioe = she;
             } catch (IOException e) {
-                fatal(Alerts.alert_unexpected_message, e);
+                description = Alerts.alert_unexpected_message;
+                ioe = e;
             } finally {
                 writeLock.unlock();
             }
+
+            // Be care of deadlock. Please don't place the call to fatal()
+            // into the writeLock locked block.
+            if (ioe != null) {
+                fatal(description, ioe);
+            }
         }
 
         /*