|
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; |
| 40 | +import java.security.Permission; |
38 | 41 | import java.util.Map; |
39 | 42 | import java.util.concurrent.ConcurrentHashMap; |
40 | 43 | import java.util.concurrent.ConcurrentMap; |
|
46 | 49 | import java.util.concurrent.locks.ReentrantLock; |
47 | 50 | import java.util.function.Consumer; |
48 | 51 |
|
| 52 | +import org.graalvm.compiler.phases.common.LazyValue; |
49 | 53 | import org.graalvm.compiler.serviceprovider.GraalUnsafeAccess; |
50 | 54 | import org.graalvm.compiler.serviceprovider.JavaVersionUtil; |
51 | 55 | import org.graalvm.nativeimage.ImageSingletons; |
@@ -354,12 +358,128 @@ public static int getCommonPoolParallelism() { |
354 | 358 | @TargetElement(onlyWith = JDK8OrEarlier.class) |
355 | 359 | static native ForkJoinPool makeCommonPool(); |
356 | 360 |
|
| 361 | + @Alias // |
| 362 | + @TargetElement(onlyWith = JDK11OrLater.class) // |
| 363 | + public static native AccessControlContext contextWithPermissions(Permission... perms); |
| 364 | + |
357 | 365 | @Alias // |
358 | 366 | @TargetElement(onlyWith = JDK11OrLater.class) // |
359 | 367 | Target_java_util_concurrent_ForkJoinPool(byte forCommonPoolOnly) { |
360 | 368 | } |
361 | 369 | } |
362 | 370 |
|
| 371 | +/** |
| 372 | + * Since AccessControlContextFeature replaces all AccessControlContext objects with |
| 373 | + * NO_CONTEXT_SINGLETON, we need to reinitialize them in runtime. |
| 374 | + */ |
| 375 | + |
| 376 | +@TargetClass(className = "java.security.AccessController$AccHolder", onlyWith = JDK11OrLater.class) |
| 377 | +@SuppressWarnings("unused") // |
| 378 | +final class Target_java_security_AccessController_AccHolder { |
| 379 | + @Alias @InjectAccessors(AccessControllerUtil.INNOCUOUS_ACC.class) static AccessControlContext innocuousAcc; |
| 380 | +} |
| 381 | + |
| 382 | +@TargetClass(className = "java.util.Calendar$CalendarAccessControlContext") |
| 383 | +@SuppressWarnings("unused") // |
| 384 | +final class Target_java_util_Calendar_CalendarAccessControlContext { |
| 385 | + @Alias @InjectAccessors(CalendarAccessControlContextAcc.class) static AccessControlContext INSTANCE; |
| 386 | +} |
| 387 | + |
| 388 | +class CalendarAccessControlContextAcc { |
| 389 | + static LazyValue<AccessControlContext> acc = new LazyValue<>(() -> AccessControllerUtil.contextWithPermissions( |
| 390 | + new RuntimePermission("accessClassInPackage.sun.util.calendar"))); |
| 391 | + |
| 392 | + static AccessControlContext get() { |
| 393 | + return acc.get(); |
| 394 | + } |
| 395 | +} |
| 396 | + |
| 397 | +@TargetClass(className = "java.util.concurrent.ForkJoinPool$DefaultForkJoinWorkerThreadFactory", onlyWith = JDK11OrLater.class) |
| 398 | +@SuppressWarnings("unused") // |
| 399 | +final class Target_java_util_concurrent_ForkJoinPool_DefaultForkJoinWorkerThreadFactory { |
| 400 | + @Alias @InjectAccessors(DefaultForkJoinWorkerThreadFactoryAcc.class) static AccessControlContext ACC; |
| 401 | +} |
| 402 | + |
| 403 | +class DefaultForkJoinWorkerThreadFactoryAcc { |
| 404 | + static LazyValue<AccessControlContext> acc = new LazyValue<>(() -> AccessControllerUtil.contextWithPermissions( |
| 405 | + new RuntimePermission("getClassLoader"), |
| 406 | + new RuntimePermission("setContextClassLoader"))); |
| 407 | + |
| 408 | + static AccessControlContext get() { |
| 409 | + return acc.get(); |
| 410 | + } |
| 411 | +} |
| 412 | + |
| 413 | +@TargetClass(className = "java.util.concurrent.ForkJoinPool$InnocuousForkJoinWorkerThreadFactory", onlyWith = JDK11OrLater.class) |
| 414 | +@SuppressWarnings("unused") // |
| 415 | +final class Target_java_util_concurrent_ForkJoinPool_InnocuousForkJoinWorkerThreadFactory { |
| 416 | + @Alias @InjectAccessors(InnocuousForkJoinWorkerThreadFactoryAcc.class) static AccessControlContext ACC; |
| 417 | +} |
| 418 | + |
| 419 | +class InnocuousForkJoinWorkerThreadFactoryAcc { |
| 420 | + static LazyValue<AccessControlContext> acc = new LazyValue<>(() -> AccessControllerUtil.contextWithPermissions( |
| 421 | + new RuntimePermission("modifyThread"), |
| 422 | + new RuntimePermission("enableContextClassLoaderOverride"), |
| 423 | + new RuntimePermission("modifyThreadGroup"), |
| 424 | + new RuntimePermission("getClassLoader"), |
| 425 | + new RuntimePermission("setContextClassLoader"))); |
| 426 | + |
| 427 | + static AccessControlContext get() { |
| 428 | + return acc.get(); |
| 429 | + } |
| 430 | +} |
| 431 | + |
| 432 | +@TargetClass(className = "java.util.concurrent.ForkJoinWorkerThread") |
| 433 | +@SuppressWarnings("unused") // |
| 434 | +final class Target_java_util_concurrent_ForkJoinWorkerThread { |
| 435 | + @Alias @InjectAccessors(AccessControllerUtil.INNOCUOUS_ACC.class) static AccessControlContext INNOCUOUS_ACC; |
| 436 | +} |
| 437 | + |
| 438 | +@TargetClass(className = "sun.misc.InnocuousThread", onlyWith = JDK8OrEarlier.class) |
| 439 | +@SuppressWarnings("unused") // |
| 440 | +final class Target_sun_misc_InnocuousThread { |
| 441 | + @Alias @InjectAccessors(AccessControllerUtil.INNOCUOUS_ACC.class) static AccessControlContext ACC; |
| 442 | +} |
| 443 | + |
| 444 | +@TargetClass(className = "jdk.internal.misc.InnocuousThread", onlyWith = JDK11OrLater.class) |
| 445 | +@SuppressWarnings("unused") // |
| 446 | +final class Target_jdk_internal_misc_InnocuousThread { |
| 447 | + @Alias @InjectAccessors(AccessControllerUtil.INNOCUOUS_ACC.class) static AccessControlContext ACC; |
| 448 | +} |
| 449 | + |
| 450 | +@TargetClass(className = "javax.management.Monitor", onlyWith = PlatformHasClass.class) |
| 451 | +@SuppressWarnings("unused") // |
| 452 | +final class Target_javax_management_Monitor { |
| 453 | + @Alias @InjectAccessors(AccessControllerUtil.NO_PERMISSIONS_CONTEXT.class) static AccessControlContext noPermissionsACC; |
| 454 | +} |
| 455 | + |
| 456 | +@TargetClass(className = "java.rmi.activation.ActivationID") |
| 457 | +@SuppressWarnings("unused") // |
| 458 | +final class Target_java_rmi_activation_ActivationID { |
| 459 | + @Alias @InjectAccessors(AccessControllerUtil.NO_PERMISSIONS_CONTEXT.class) static AccessControlContext NOPERMS_ACC; |
| 460 | +} |
| 461 | + |
| 462 | +@TargetClass(className = "sun.rmi.transport.DGCCClient", onlyWith = PlatformHasClass.class) |
| 463 | +@SuppressWarnings("unused") // |
| 464 | +final class Target_sun_rmi_transport_DGCCClient { |
| 465 | + @Alias @InjectAccessors(SocketAcc.class) static AccessControlContext SOCKET_ACC; |
| 466 | +} |
| 467 | + |
| 468 | +class SocketAcc { |
| 469 | + static LazyValue<AccessControlContext> acc = new LazyValue<>(() -> AccessControllerUtil.contextWithPermissions( |
| 470 | + new SocketPermission("*", "connect,resolve"))); |
| 471 | + |
| 472 | + static AccessControlContext get() { |
| 473 | + return acc.get(); |
| 474 | + } |
| 475 | +} |
| 476 | + |
| 477 | +@TargetClass(className = "sun.rmi.transport.tcp.TCPTransport") |
| 478 | +@SuppressWarnings("unused") // |
| 479 | +final class Target_sun_rmi_transport_tcp_TCPTransport { |
| 480 | + @Alias @InjectAccessors(AccessControllerUtil.NO_PERMISSIONS_CONTEXT.class) static AccessControlContext NOPERMS_ACC; |
| 481 | +} |
| 482 | + |
363 | 483 | /** |
364 | 484 | * An injected field to replace ForkJoinPool.common. |
365 | 485 | * |
|
0 commit comments