diff -r 687fd7c7986d src/share/classes/javax/crypto/JceSecurity.java --- a/src/share/classes/javax/crypto/JceSecurity.java Tue Mar 04 11:51:53 2014 -0800 +++ b/src/share/classes/javax/crypto/JceSecurity.java Thu Oct 20 12:34:46 2016 -0400 @@ -54,15 +54,15 @@ private static CryptoPermissions defaultPolicy = null; private static CryptoPermissions exemptPolicy = null; - // Map of the providers we already have verified + // Map of the providers we already have verified // value == PROVIDER_VERIFIED is successfully verified // value is failure cause Exception in error case - private final static Map verificationResults = - new IdentityHashMap<>(); + private final static Map, Object> + verificationResults = new WeakHashMap<>(); - // Map of the providers currently being verified - private final static Map verifyingProviders = - new IdentityHashMap<>(); + // Map of the providers currently being verified + private final static Map, Object> + verifyingProviders = new HashMap<>(); // Set the default value. May be changed in the static initializer. private static boolean isRestricted = true; @@ -169,29 +169,30 @@ * Return null if ok, failure Exception if verification failed. */ static synchronized Exception getVerificationResult(Provider p) { - Object o = verificationResults.get(p); + Class c = p.getClass(); + Object o = verificationResults.get(c); if (o == PROVIDER_VERIFIED) { return null; } else if (o != null) { return (Exception)o; } - if (verifyingProviders.get(p) != null) { + if (verifyingProviders.get(c) != null) { // this method is static synchronized, must be recursion // return failure now but do not save the result return new NoSuchProviderException("Recursion during verification"); } try { - verifyingProviders.put(p, Boolean.FALSE); - URL providerURL = getCodeBase(p.getClass()); + verifyingProviders.put(c, Boolean.FALSE); + URL providerURL = getCodeBase(c); verifyProviderJar(providerURL); // Verified ok, cache result - verificationResults.put(p, PROVIDER_VERIFIED); + verificationResults.put(c, PROVIDER_VERIFIED); return null; } catch (Exception e) { - verificationResults.put(p, e); + verificationResults.put(c, e); return e; } finally { - verifyingProviders.remove(p); + verifyingProviders.remove(c); } }