# HG changeset patch # User alitvinov # Date 1396003297 -14400 # Node ID f273b57ed7e14c42945eb78d73ee47ad7c16bf80 # Parent 46d80fad2e484d8c12bcd9712a274b7bd4e79bac 8032832: Applet/browser deadlocks, when IIS integrated authentication is used Reviewed-by: chegar, weijun diff -r 46d80fad2e48 -r f273b57ed7e1 jdk/src/share/classes/sun/net/www/protocol/http/NegotiateAuthentication.java --- a/jdk/src/share/classes/sun/net/www/protocol/http/NegotiateAuthentication.java Wed Mar 26 17:01:22 2014 +0400 +++ b/jdk/src/share/classes/sun/net/www/protocol/http/NegotiateAuthentication.java Fri Mar 28 14:41:37 2014 +0400 @@ -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.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 @@ class NegotiateAuthentication extends AuthenticationInfo { private static final long serialVersionUID = 100L; + private static final PlatformLogger logger = HttpURLConnection.getHttpLogger(); final private HttpCallerInfo hci; @@ -79,6 +81,31 @@ } /** + * 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 * is tried. The generated object will be cached under the name of ths @@ -89,7 +116,7 @@ * * @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 ();