diff --git a/src/share/classes/sun/security/ssl/SSLContextImpl.java b/src/share/classes/sun/security/ssl/SSLContextImpl.java index 9814f9f5010c01deee001c779d8b46b2e354145e..bb57a61f8283e4c7184ca16cc3b6735b3ffef224 100644 --- a/src/share/classes/sun/security/ssl/SSLContextImpl.java +++ b/src/share/classes/sun/security/ssl/SSLContextImpl.java @@ -267,12 +267,15 @@ public abstract class SSLContextImpl extends SSLContextSpi { // Get suported CipherSuiteList. CipherSuiteList getSuportedCipherSuiteList() { - // Clear cache of available ciphersuites. - clearAvailableCache(); - - if (supportedCipherSuiteList == null) { - supportedCipherSuiteList = - getApplicableCipherSuiteList(getSuportedProtocolList(), false); + // The maintenance of cipher suites needs to be synchronized. + synchronized (this) { + // Clear cache of available ciphersuites. + clearAvailableCache(); + + if (supportedCipherSuiteList == null) { + supportedCipherSuiteList = getApplicableCipherSuiteList( + getSuportedProtocolList(), false); + } } return supportedCipherSuiteList; @@ -280,20 +283,29 @@ public abstract class SSLContextImpl extends SSLContextSpi { // Get default CipherSuiteList. CipherSuiteList getDefaultCipherSuiteList(boolean roleIsServer) { - // Clear cache of available ciphersuites. - clearAvailableCache(); - if (roleIsServer) { - if (defaultServerCipherSuiteList == null) { - defaultServerCipherSuiteList = getApplicableCipherSuiteList( + // The maintenance of cipher suites needs to be synchronized. + synchronized (this) { + // Clear cache of available ciphersuites. + clearAvailableCache(); + + if (defaultServerCipherSuiteList == null) { + defaultServerCipherSuiteList = getApplicableCipherSuiteList( getDefaultProtocolList(true), true); + } } return defaultServerCipherSuiteList; } else { - if (defaultClientCipherSuiteList == null) { - defaultClientCipherSuiteList = getApplicableCipherSuiteList( + // The maintenance of cipher suites needs to be synchronized + synchronized (this) { + // Clear cache of available ciphersuites. + clearAvailableCache(); + + if (defaultClientCipherSuiteList == null) { + defaultClientCipherSuiteList = getApplicableCipherSuiteList( getDefaultProtocolList(false), true); + } } return defaultClientCipherSuiteList; @@ -364,8 +376,11 @@ public abstract class SSLContextImpl extends SSLContextSpi { * Clear cache of available ciphersuites. If we support all ciphers * internally, there is no need to clear the cache and calling this * method has no effect. + * + * Note that every call to clearAvailableCache() and the maintenance of + * cipher suites need to be synchronized with this instance. */ - synchronized void clearAvailableCache() { + private void clearAvailableCache() { if (CipherSuite.DYNAMIC_AVAILABILITY) { supportedCipherSuiteList = null; defaultServerCipherSuiteList = null;