8032832: Applet/browser deadlocks, when IIS integrated authentication is used
Reviewed-by: chegar, weijun
--- 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 <String, Boolean>();
cache = new HashMap <String, Negotiator>();