2626
2727import java .io .IOException ;
2828import java .net .URL ;
29+ import java .security .AccessController ;
30+ import java .security .PrivilegedAction ;
2931import java .util .ArrayList ;
3032import java .util .Arrays ;
3133import java .util .Enumeration ;
4446import org .slf4j .helpers .Util ;
4547import org .slf4j .spi .SLF4JServiceProvider ;
4648
49+ import javax .accessibility .AccessibleComponent ;
50+
4751/**
4852 * The <code>LoggerFactory</code> is a utility class producing Loggers for
4953 * various logging APIs, most notably for log4j, logback and JDK 1.4 logging.
@@ -104,7 +108,7 @@ static List<SLF4JServiceProvider> findServiceProviders() {
104108 // retain behaviour similar to that of 1.7 series and earlier. More specifically, use the class loader that
105109 // loaded the present class to search for services
106110 final ClassLoader classLoaderOfLoggerFactory = LoggerFactory .class .getClassLoader ();
107- ServiceLoader <SLF4JServiceProvider > serviceLoader = ServiceLoader . load ( SLF4JServiceProvider . class , classLoaderOfLoggerFactory );
111+ ServiceLoader <SLF4JServiceProvider > serviceLoader = getServiceLoader ( classLoaderOfLoggerFactory );
108112 List <SLF4JServiceProvider > providerList = new ArrayList <>();
109113 Iterator <SLF4JServiceProvider > iterator = serviceLoader .iterator ();
110114 while (iterator .hasNext ()) {
@@ -113,6 +117,18 @@ static List<SLF4JServiceProvider> findServiceProviders() {
113117 return providerList ;
114118 }
115119
120+ private static ServiceLoader <SLF4JServiceProvider > getServiceLoader (final ClassLoader classLoaderOfLoggerFactory ) {
121+ ServiceLoader <SLF4JServiceProvider > serviceLoader ;
122+ SecurityManager securityManager = System .getSecurityManager ();
123+ if (securityManager == null ) {
124+ serviceLoader = ServiceLoader .load (SLF4JServiceProvider .class , classLoaderOfLoggerFactory );
125+ } else {
126+ final PrivilegedAction <ServiceLoader <SLF4JServiceProvider >> action = () -> ServiceLoader .load (SLF4JServiceProvider .class , classLoaderOfLoggerFactory );
127+ serviceLoader = AccessController .doPrivileged (action );
128+ }
129+ return serviceLoader ;
130+ }
131+
116132 private static void safelyInstantiate (List <SLF4JServiceProvider > providerList , Iterator <SLF4JServiceProvider > iterator ) {
117133 try {
118134 SLF4JServiceProvider provider = iterator .next ();
0 commit comments