From 128015584d69492806fd1700c8f840d78aa9c729 Mon Sep 17 00:00:00 2001 From: John Zhuge Date: Thu, 23 Mar 2017 13:56:19 -0700 Subject: [PATCH] HADOOP-14195. CredentialProviderFactory$getProviders is not thread-safe. Contributed by Vihang Karajgaonkar. --- .../alias/CredentialProviderFactory.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/alias/CredentialProviderFactory.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/alias/CredentialProviderFactory.java index 3c3f79f4c3d..d1e3eb5437b 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/alias/CredentialProviderFactory.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/alias/CredentialProviderFactory.java @@ -56,12 +56,16 @@ public static List getProviders(Configuration conf try { URI uri = new URI(path); boolean found = false; - for(CredentialProviderFactory factory: serviceLoader) { - CredentialProvider kp = factory.createProvider(uri, conf); - if (kp != null) { - result.add(kp); - found = true; - break; + // Iterate serviceLoader in a synchronized block since + // serviceLoader iterator is not thread-safe. + synchronized (serviceLoader) { + for (CredentialProviderFactory factory : serviceLoader) { + CredentialProvider kp = factory.createProvider(uri, conf); + if (kp != null) { + result.add(kp); + found = true; + break; + } } } if (!found) {