|
1 | 1 | /* |
2 | | - * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved. |
| 2 | + * Copyright (c) 2012, 2021, Oracle and/or its affiliates. All rights reserved. |
3 | 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 | 4 | * |
5 | 5 | * This code is free software; you can redistribute it and/or modify it |
|
33 | 33 | import java.lang.ref.WeakReference; |
34 | 34 | import java.lang.reflect.Field; |
35 | 35 | import java.lang.reflect.Modifier; |
| 36 | +import java.net.SocketPermission; |
36 | 37 | import java.nio.charset.CharsetDecoder; |
37 | 38 | import java.nio.charset.CoderResult; |
| 39 | +import java.security.AccessControlContext; |
38 | 40 | import java.util.Map; |
39 | 41 | import java.util.concurrent.ConcurrentHashMap; |
40 | 42 | import java.util.concurrent.ConcurrentMap; |
|
46 | 48 | import java.util.concurrent.locks.ReentrantLock; |
47 | 49 | import java.util.function.Consumer; |
48 | 50 |
|
| 51 | +import org.graalvm.compiler.phases.common.LazyValue; |
49 | 52 | import org.graalvm.compiler.serviceprovider.GraalUnsafeAccess; |
50 | 53 | import org.graalvm.compiler.serviceprovider.JavaVersionUtil; |
51 | 54 | import org.graalvm.nativeimage.ImageSingletons; |
@@ -360,6 +363,118 @@ public static int getCommonPoolParallelism() { |
360 | 363 | } |
361 | 364 | } |
362 | 365 |
|
| 366 | +/** |
| 367 | + * Since AccessControlContextFeature replaces all AccessControlContext objects with |
| 368 | + * NO_CONTEXT_SINGLETON, we need to reinitialize them in runtime. |
| 369 | + */ |
| 370 | + |
| 371 | +@TargetClass(className = "java.security.AccessController$AccHolder", onlyWith = JDK11OrLater.class) |
| 372 | +@SuppressWarnings("unused") // |
| 373 | +final class Target_java_security_AccessController_AccHolder { |
| 374 | + @Alias @InjectAccessors(AccessControllerUtil.INNOCUOUS_ACC.class) static AccessControlContext innocuousAcc; |
| 375 | +} |
| 376 | + |
| 377 | +@TargetClass(className = "java.util.Calendar$CalendarAccessControlContext") |
| 378 | +@SuppressWarnings("unused") // |
| 379 | +final class Target_java_util_Calendar_CalendarAccessControlContext { |
| 380 | + @Alias @InjectAccessors(CalendarAccessControlContextAcc.class) static AccessControlContext INSTANCE; |
| 381 | +} |
| 382 | + |
| 383 | +class CalendarAccessControlContextAcc { |
| 384 | + static LazyValue<AccessControlContext> acc = new LazyValue<>(() -> AccessControllerUtil.contextWithPermissions( |
| 385 | + new RuntimePermission("accessClassInPackage.sun.util.calendar"))); |
| 386 | + |
| 387 | + static AccessControlContext get() { |
| 388 | + return acc.get(); |
| 389 | + } |
| 390 | +} |
| 391 | + |
| 392 | +@TargetClass(className = "java.util.concurrent.ForkJoinPool$DefaultForkJoinWorkerThreadFactory", onlyWith = JDK11OrLater.class) |
| 393 | +@SuppressWarnings("unused") // |
| 394 | +final class Target_java_util_concurrent_ForkJoinPool_DefaultForkJoinWorkerThreadFactory { |
| 395 | + @Alias @InjectAccessors(DefaultForkJoinWorkerThreadFactoryAcc.class) static AccessControlContext ACC; |
| 396 | +} |
| 397 | + |
| 398 | +class DefaultForkJoinWorkerThreadFactoryAcc { |
| 399 | + static LazyValue<AccessControlContext> acc = new LazyValue<>(() -> AccessControllerUtil.contextWithPermissions( |
| 400 | + new RuntimePermission("getClassLoader"), |
| 401 | + new RuntimePermission("setContextClassLoader"))); |
| 402 | + |
| 403 | + static AccessControlContext get() { |
| 404 | + return acc.get(); |
| 405 | + } |
| 406 | +} |
| 407 | + |
| 408 | +@TargetClass(className = "java.util.concurrent.ForkJoinPool$InnocuousForkJoinWorkerThreadFactory", onlyWith = JDK11OrLater.class) |
| 409 | +@SuppressWarnings("unused") // |
| 410 | +final class Target_java_util_concurrent_ForkJoinPool_InnocuousForkJoinWorkerThreadFactory { |
| 411 | + @Alias @InjectAccessors(InnocuousForkJoinWorkerThreadFactoryAcc.class) static AccessControlContext ACC; |
| 412 | +} |
| 413 | + |
| 414 | +class InnocuousForkJoinWorkerThreadFactoryAcc { |
| 415 | + static LazyValue<AccessControlContext> acc = new LazyValue<>(() -> AccessControllerUtil.contextWithPermissions( |
| 416 | + new RuntimePermission("modifyThread"), |
| 417 | + new RuntimePermission("enableContextClassLoaderOverride"), |
| 418 | + new RuntimePermission("modifyThreadGroup"), |
| 419 | + new RuntimePermission("getClassLoader"), |
| 420 | + new RuntimePermission("setContextClassLoader"))); |
| 421 | + |
| 422 | + static AccessControlContext get() { |
| 423 | + return acc.get(); |
| 424 | + } |
| 425 | +} |
| 426 | + |
| 427 | +@TargetClass(className = "java.util.concurrent.ForkJoinWorkerThread") |
| 428 | +@SuppressWarnings("unused") // |
| 429 | +final class Target_java_util_concurrent_ForkJoinWorkerThread { |
| 430 | + @Alias @InjectAccessors(AccessControllerUtil.INNOCUOUS_ACC.class) static AccessControlContext INNOCUOUS_ACC; |
| 431 | +} |
| 432 | + |
| 433 | +@TargetClass(className = "sun.misc.InnocuousThread", onlyWith = JDK8OrEarlier.class) |
| 434 | +@SuppressWarnings("unused") // |
| 435 | +final class Target_sun_misc_InnocuousThread { |
| 436 | + @Alias @InjectAccessors(AccessControllerUtil.INNOCUOUS_ACC.class) static AccessControlContext ACC; |
| 437 | +} |
| 438 | + |
| 439 | +@TargetClass(className = "jdk.internal.misc.InnocuousThread", onlyWith = JDK11OrLater.class) |
| 440 | +@SuppressWarnings("unused") // |
| 441 | +final class Target_jdk_internal_misc_InnocuousThread { |
| 442 | + @Alias @InjectAccessors(AccessControllerUtil.INNOCUOUS_ACC.class) static AccessControlContext ACC; |
| 443 | +} |
| 444 | + |
| 445 | +@TargetClass(className = "javax.management.Monitor", onlyWith = PlatformHasClass.class) |
| 446 | +@SuppressWarnings("unused") // |
| 447 | +final class Target_javax_management_Monitor { |
| 448 | + @Alias @InjectAccessors(AccessControllerUtil.NO_PERMISSIONS_CONTEXT.class) static AccessControlContext noPermissionsACC; |
| 449 | +} |
| 450 | + |
| 451 | +@TargetClass(className = "java.rmi.activation.ActivationID") |
| 452 | +@SuppressWarnings("unused") // |
| 453 | +final class Target_java_rmi_activation_ActivationID { |
| 454 | + @Alias @InjectAccessors(AccessControllerUtil.NO_PERMISSIONS_CONTEXT.class) static AccessControlContext NOPERMS_ACC; |
| 455 | +} |
| 456 | + |
| 457 | +@TargetClass(className = "sun.rmi.transport.DGCCClient", onlyWith = PlatformHasClass.class) |
| 458 | +@SuppressWarnings("unused") // |
| 459 | +final class Target_sun_rmi_transport_DGCCClient { |
| 460 | + @Alias @InjectAccessors(SocketAcc.class) static AccessControlContext SOCKET_ACC; |
| 461 | +} |
| 462 | + |
| 463 | +class SocketAcc { |
| 464 | + static LazyValue<AccessControlContext> acc = new LazyValue<>(() -> AccessControllerUtil.contextWithPermissions( |
| 465 | + new SocketPermission("*", "connect,resolve"))); |
| 466 | + |
| 467 | + static AccessControlContext get() { |
| 468 | + return acc.get(); |
| 469 | + } |
| 470 | +} |
| 471 | + |
| 472 | +@TargetClass(className = "sun.rmi.transport.tcp.TCPTransport") |
| 473 | +@SuppressWarnings("unused") // |
| 474 | +final class Target_sun_rmi_transport_tcp_TCPTransport { |
| 475 | + @Alias @InjectAccessors(AccessControllerUtil.NO_PERMISSIONS_CONTEXT.class) static AccessControlContext NOPERMS_ACC; |
| 476 | +} |
| 477 | + |
363 | 478 | /** |
364 | 479 | * An injected field to replace ForkJoinPool.common. |
365 | 480 | * |
|
0 commit comments