26
26
27
27
import java .io .IOException ;
28
28
import java .net .URL ;
29
+ import java .security .AccessController ;
30
+ import java .security .PrivilegedAction ;
29
31
import java .util .ArrayList ;
30
32
import java .util .Arrays ;
31
33
import java .util .Enumeration ;
44
46
import org .slf4j .helpers .Util ;
45
47
import org .slf4j .spi .SLF4JServiceProvider ;
46
48
49
+ import javax .accessibility .AccessibleComponent ;
50
+
47
51
/**
48
52
* The <code>LoggerFactory</code> is a utility class producing Loggers for
49
53
* various logging APIs, most notably for log4j, logback and JDK 1.4 logging.
@@ -104,7 +108,7 @@ static List<SLF4JServiceProvider> findServiceProviders() {
104
108
// retain behaviour similar to that of 1.7 series and earlier. More specifically, use the class loader that
105
109
// loaded the present class to search for services
106
110
final ClassLoader classLoaderOfLoggerFactory = LoggerFactory .class .getClassLoader ();
107
- ServiceLoader <SLF4JServiceProvider > serviceLoader = ServiceLoader . load ( SLF4JServiceProvider . class , classLoaderOfLoggerFactory );
111
+ ServiceLoader <SLF4JServiceProvider > serviceLoader = getServiceLoader ( classLoaderOfLoggerFactory );
108
112
List <SLF4JServiceProvider > providerList = new ArrayList <>();
109
113
Iterator <SLF4JServiceProvider > iterator = serviceLoader .iterator ();
110
114
while (iterator .hasNext ()) {
@@ -113,6 +117,18 @@ static List<SLF4JServiceProvider> findServiceProviders() {
113
117
return providerList ;
114
118
}
115
119
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
+
116
132
private static void safelyInstantiate (List <SLF4JServiceProvider > providerList , Iterator <SLF4JServiceProvider > iterator ) {
117
133
try {
118
134
SLF4JServiceProvider provider = iterator .next ();
0 commit comments