Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=47744
authormarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Mon, 14 Dec 2009 14:53:00 +0000 (14:53 +0000)
committermarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Mon, 14 Dec 2009 14:53:00 +0000 (14:53 +0000)
Prevent medium term memory leak when ussing SSL with a security manager
Based on a patch by Greg Vanore

git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@890350 13f79535-47bb-0310-9956-ffa450edef68

java/org/apache/tomcat/util/net/jsse/JSSESupport.java

index 30c72ff..8087435 100644 (file)
@@ -23,6 +23,8 @@ import java.io.InputStream;
 import java.net.SocketException;
 import java.security.cert.Certificate;
 import java.security.cert.CertificateFactory;
+import java.util.Map;
+import java.util.WeakHashMap;
 
 import javax.net.ssl.HandshakeCompletedEvent;
 import javax.net.ssl.HandshakeCompletedListener;
@@ -53,6 +55,9 @@ class JSSESupport implements SSLSupport, SSLSessionManager {
     
     private static final org.apache.juli.logging.Log log =
         org.apache.juli.logging.LogFactory.getLog(JSSESupport.class);
+    
+    private static final Map<SSLSession,Integer> keySizeCache =
+        new WeakHashMap<SSLSession, Integer>();
 
     protected SSLSocket ssl;
     protected SSLSession session;
@@ -196,7 +201,12 @@ class JSSESupport implements SSLSupport, SSLSessionManager {
         SSLSupport.CipherData c_aux[]=ciphers;
         if (session == null)
             return null;
-        Integer keySize = (Integer) session.getValue(KEY_SIZE_KEY);
+        
+        Integer keySize = null;
+        synchronized(keySizeCache) {
+            keySize = keySizeCache.get(session);
+        }
+        
         if (keySize == null) {
             int size = 0;
             String cipherSuite = session.getCipherSuite();
@@ -207,7 +217,9 @@ class JSSESupport implements SSLSupport, SSLSessionManager {
                 }
             }
             keySize = new Integer(size);
-            session.putValue(KEY_SIZE_KEY, keySize);
+            synchronized(keySizeCache) {
+                keySizeCache.put(session, keySize);
+            }
         }
         return keySize;
     }