diff --git a/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java b/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java index 985f20397..30b7d21a7 100755 --- a/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java +++ b/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java @@ -26,6 +26,8 @@ import java.io.IOException; import java.net.URL; +import java.security.AccessController; +import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; @@ -44,6 +46,8 @@ import org.slf4j.helpers.Util; import org.slf4j.spi.SLF4JServiceProvider; +import javax.accessibility.AccessibleComponent; + /** * The LoggerFactory is a utility class producing Loggers for * various logging APIs, most notably for log4j, logback and JDK 1.4 logging. @@ -104,7 +108,7 @@ static List findServiceProviders() { // retain behaviour similar to that of 1.7 series and earlier. More specifically, use the class loader that // loaded the present class to search for services final ClassLoader classLoaderOfLoggerFactory = LoggerFactory.class.getClassLoader(); - ServiceLoader serviceLoader = ServiceLoader.load(SLF4JServiceProvider.class, classLoaderOfLoggerFactory); + ServiceLoader serviceLoader = getServiceLoader(classLoaderOfLoggerFactory); List providerList = new ArrayList<>(); Iterator iterator = serviceLoader.iterator(); while (iterator.hasNext()) { @@ -113,6 +117,18 @@ static List findServiceProviders() { return providerList; } + private static ServiceLoader getServiceLoader(final ClassLoader classLoaderOfLoggerFactory) { + ServiceLoader serviceLoader; + SecurityManager securityManager = System.getSecurityManager(); + if(securityManager == null) { + serviceLoader = ServiceLoader.load(SLF4JServiceProvider.class, classLoaderOfLoggerFactory); + } else { + final PrivilegedAction> action = () -> ServiceLoader.load(SLF4JServiceProvider.class, classLoaderOfLoggerFactory); + serviceLoader = AccessController.doPrivileged(action); + } + return serviceLoader; + } + private static void safelyInstantiate(List providerList, Iterator iterator) { try { SLF4JServiceProvider provider = iterator.next();