|
80 | 80 | import javax.security.auth.callback.CallbackHandler;
|
81 | 81 | import javax.security.auth.login.Configuration;
|
82 | 82 |
|
83 |
| -import jdk.graal.compiler.options.Option; |
84 | 83 | import org.graalvm.nativeimage.ImageSingletons;
|
85 | 84 | import org.graalvm.nativeimage.hosted.RuntimeJNIAccess;
|
86 | 85 | import org.graalvm.nativeimage.hosted.RuntimeReflection;
|
|
107 | 106 | import com.oracle.svm.util.ModuleSupport;
|
108 | 107 | import com.oracle.svm.util.ReflectionUtil;
|
109 | 108 |
|
| 109 | +import jdk.graal.compiler.options.Option; |
110 | 110 | import sun.security.jca.ProviderList;
|
111 | 111 | import sun.security.provider.NativePRNG;
|
112 | 112 | import sun.security.x509.OIDMap;
|
@@ -239,63 +239,50 @@ public void duringSetup(DuringSetupAccess a) {
|
239 | 239 | RuntimeClassInitializationSupport rci = ImageSingletons.lookup(RuntimeClassInitializationSupport.class);
|
240 | 240 | /*
|
241 | 241 | * The SecureRandom implementations open the /dev/random and /dev/urandom files which are
|
242 |
| - * used as sources for entropy. These files are opened in the static initializers. That's |
243 |
| - * why we rerun the static initializers at runtime. We cannot completely delay the static |
244 |
| - * initializers execution to runtime because the SecureRandom classes are needed by the |
245 |
| - * native image generator too, e.g., by Files.createTempDirectory(). |
| 242 | + * used as sources for entropy. These files are opened in the static initializers. |
246 | 243 | */
|
247 |
| - rci.rerunInitialization(NativePRNG.class, "for substitutions"); |
248 |
| - rci.rerunInitialization(NativePRNG.Blocking.class, "for substitutions"); |
249 |
| - rci.rerunInitialization(NativePRNG.NonBlocking.class, "for substitutions"); |
| 244 | + rci.initializeAtRunTime(NativePRNG.class, "for substitutions"); |
| 245 | + rci.initializeAtRunTime(NativePRNG.Blocking.class, "for substitutions"); |
| 246 | + rci.initializeAtRunTime(NativePRNG.NonBlocking.class, "for substitutions"); |
250 | 247 |
|
251 |
| - rci.rerunInitialization(clazz(access, "sun.security.provider.SeedGenerator"), "for substitutions"); |
252 |
| - rci.rerunInitialization(clazz(access, "sun.security.provider.SecureRandom$SeederHolder"), "for substitutions"); |
| 248 | + rci.initializeAtRunTime(clazz(access, "sun.security.provider.SeedGenerator"), "for substitutions"); |
| 249 | + rci.initializeAtRunTime(clazz(access, "sun.security.provider.SecureRandom$SeederHolder"), "for substitutions"); |
253 | 250 |
|
254 | 251 | /*
|
255 | 252 | * sun.security.provider.AbstractDrbg$SeederHolder has a static final EntropySource seeder
|
256 |
| - * field that needs to be re-initialized at run time because it captures the result of |
| 253 | + * field that needs to be initialized at run time because it captures the result of |
257 | 254 | * SeedGenerator.getSystemEntropy().
|
258 | 255 | */
|
259 |
| - rci.rerunInitialization(clazz(access, "sun.security.provider.AbstractDrbg$SeederHolder"), "for substitutions"); |
| 256 | + rci.initializeAtRunTime(clazz(access, "sun.security.provider.AbstractDrbg$SeederHolder"), "for substitutions"); |
260 | 257 | if (isMscapiModulePresent) {
|
261 | 258 | /* PRNG.<clinit> creates a Cleaner (see JDK-8210476), which starts its thread. */
|
262 |
| - rci.rerunInitialization(clazz(access, "sun.security.mscapi.PRNG"), "for substitutions"); |
| 259 | + rci.initializeAtRunTime(clazz(access, "sun.security.mscapi.PRNG"), "for substitutions"); |
263 | 260 | }
|
264 |
| - rci.rerunInitialization(clazz(access, "sun.security.provider.FileInputStreamPool"), "for substitutions"); |
| 261 | + rci.initializeAtRunTime(clazz(access, "sun.security.provider.FileInputStreamPool"), "for substitutions"); |
265 | 262 | /* java.util.UUID$Holder has a static final SecureRandom field. */
|
266 |
| - rci.rerunInitialization(clazz(access, "java.util.UUID$Holder"), "for substitutions"); |
| 263 | + rci.initializeAtRunTime(clazz(access, "java.util.UUID$Holder"), "for substitutions"); |
267 | 264 |
|
268 |
| - /* |
269 |
| - * The classes below have a static final SecureRandom field. Note that if the classes are |
270 |
| - * not found as reachable by the analysis registering them for class initialization rerun |
271 |
| - * doesn't have any effect. |
272 |
| - */ |
273 |
| - rci.rerunInitialization(clazz(access, "sun.security.jca.JCAUtil$CachedSecureRandomHolder"), "for substitutions"); |
274 |
| - rci.rerunInitialization(clazz(access, "com.sun.crypto.provider.SunJCE$SecureRandomHolder"), "for substitutions"); |
275 |
| - optionalClazz(access, "sun.security.krb5.Confounder").ifPresent(clazz -> rci.rerunInitialization(clazz, "for substitutions")); |
276 |
| - optionalClazz(access, "sun.security.krb5.Config").ifPresent(clazz -> rci.rerunInitialization(clazz, "Reset the value of lazily initialized field sun.security.krb5.Config#singleton")); |
| 265 | + /* The classes below have a static final SecureRandom field. */ |
| 266 | + rci.initializeAtRunTime(clazz(access, "sun.security.jca.JCAUtil$CachedSecureRandomHolder"), "for substitutions"); |
| 267 | + rci.initializeAtRunTime(clazz(access, "com.sun.crypto.provider.SunJCE$SecureRandomHolder"), "for substitutions"); |
| 268 | + optionalClazz(access, "sun.security.krb5.Confounder").ifPresent(clazz -> rci.initializeAtRunTime(clazz, "for substitutions")); |
| 269 | + optionalClazz(access, "sun.security.krb5.Config").ifPresent(clazz -> rci.initializeAtRunTime(clazz, "Reset the value of lazily initialized field sun.security.krb5.Config#singleton")); |
277 | 270 |
|
278 |
| - rci.rerunInitialization(clazz(access, "sun.security.jca.JCAUtil"), "JCAUtil.def holds a SecureRandom."); |
| 271 | + rci.initializeAtRunTime(clazz(access, "sun.security.jca.JCAUtil"), "JCAUtil.def holds a SecureRandom."); |
279 | 272 |
|
280 | 273 | /*
|
281 | 274 | * When SSLContextImpl$DefaultManagersHolder sets-up the TrustManager in its initializer it
|
282 | 275 | * gets the value of the -Djavax.net.ssl.trustStore and -Djavax.net.ssl.trustStorePassword
|
283 |
| - * properties from the build machine. Re-runing its initialization at run time is required |
284 |
| - * to use the run time provided values. |
| 276 | + * properties from the build machine. Running its initialization at run time is required to |
| 277 | + * use the run time provided values. |
285 | 278 | */
|
286 |
| - rci.rerunInitialization(clazz(access, "sun.security.ssl.SSLContextImpl$DefaultManagersHolder"), "for reading properties at run time"); |
| 279 | + rci.initializeAtRunTime(clazz(access, "sun.security.ssl.SSLContextImpl$DefaultManagersHolder"), "for reading properties at run time"); |
287 | 280 |
|
288 | 281 | /*
|
289 | 282 | * SSL debug logging enabled by javax.net.debug system property is setup during the class
|
290 |
| - * initialization of either sun.security.ssl.Debug or sun.security.ssl.SSLLogger. (In JDK 8 |
291 |
| - * this was implemented in sun.security.ssl.Debug, the logic was moved to |
292 |
| - * sun.security.ssl.SSLLogger in JDK11 but not yet backported to all JDKs. See JDK-8196584 |
293 |
| - * for details.) We cannot prevent these classes from being initialized at image build time, |
294 |
| - * so we have to reinitialize them at run time to honour the run time passed value for the |
295 |
| - * javax.net.debug system property. |
| 283 | + * initialization. |
296 | 284 | */
|
297 |
| - optionalClazz(access, "sun.security.ssl.Debug").ifPresent(c -> rci.rerunInitialization(c, "for reading properties at run time")); |
298 |
| - optionalClazz(access, "sun.security.ssl.SSLLogger").ifPresent(c -> rci.rerunInitialization(c, "for reading properties at run time")); |
| 285 | + rci.initializeAtRunTime(clazz(access, "sun.security.ssl.SSLLogger"), "for reading properties at run time"); |
299 | 286 | }
|
300 | 287 |
|
301 | 288 | @Override
|
|
0 commit comments