diff --git a/jdk/src/share/classes/sun/net/www/protocol/http/NegotiateAuthentication.java b/jdk/src/share/classes/sun/net/www/protocol/http/NegotiateAuthentication.java index 0c9bc24bec1..9e2a49a0380 100644 --- a/jdk/src/share/classes/sun/net/www/protocol/http/NegotiateAuthentication.java +++ b/jdk/src/share/classes/sun/net/www/protocol/http/NegotiateAuthentication.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,7 @@ import java.net.Authenticator.RequestorType; import java.util.Base64; import java.util.HashMap; import sun.net.www.HeaderParser; +import sun.util.logging.PlatformLogger; import static sun.net.www.protocol.http.AuthScheme.NEGOTIATE; import static sun.net.www.protocol.http.AuthScheme.KERBEROS; @@ -44,6 +45,7 @@ import static sun.net.www.protocol.http.AuthScheme.KERBEROS; class NegotiateAuthentication extends AuthenticationInfo { private static final long serialVersionUID = 100L; + private static final PlatformLogger logger = HttpURLConnection.getHttpLogger(); final private HttpCallerInfo hci; @@ -78,6 +80,31 @@ class NegotiateAuthentication extends AuthenticationInfo { return false; } + /** + * Find out if the HttpCallerInfo supports Negotiate protocol. + * @return true if supported + */ + public static boolean isSupported(HttpCallerInfo hci) { + ClassLoader loader = null; + try { + loader = Thread.currentThread().getContextClassLoader(); + } catch (SecurityException se) { + if (logger.isLoggable(PlatformLogger.Level.FINER)) { + logger.finer("NegotiateAuthentication: " + + "Attempt to get the context class loader failed - " + se); + } + } + + if (loader != null) { + // Lock on the class loader instance to avoid the deadlock engaging + // the lock in "ClassLoader.loadClass(String, boolean)" method. + synchronized (loader) { + return isSupportedImpl(hci); + } + } + return isSupportedImpl(hci); + } + /** * Find out if the HttpCallerInfo supports Negotiate protocol. In order to * find out yes or no, an initialization of a Negotiator object against it @@ -89,7 +116,7 @@ class NegotiateAuthentication extends AuthenticationInfo { * * @return true if supported */ - synchronized public static boolean isSupported(HttpCallerInfo hci) { + private static synchronized boolean isSupportedImpl(HttpCallerInfo hci) { if (supported == null) { supported = new HashMap (); cache = new HashMap ();