Skip to content

Commit 4611831

Browse files
Proper getStackAccessControlContext implementation
Fixed imports and warnings in SecuritySubstitutions Implemented PrivilegedStack and use FastThreadLocal Added missing getProtectionDomain method Recompute contexts from static initializers in runtime Disallow NO_CONTEXT_SINGLETON in executePrivileged Work around crash when ProcessPropertiesSupport is missing getExecutable impementation
1 parent 9070707 commit 4611831

File tree

8 files changed

+297
-68
lines changed

8 files changed

+297
-68
lines changed

sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ProcessPropertiesSupport.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@
4545
import org.graalvm.nativeimage.c.function.CEntryPointLiteral;
4646

4747
public interface ProcessPropertiesSupport {
48-
String getExecutableName();
48+
default String getExecutableName() {
49+
return "java";
50+
}
4951

5052
long getProcessID();
5153

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/DynamicHub.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@
5454
import java.util.Set;
5555
import java.util.StringJoiner;
5656

57+
import com.oracle.svm.core.SubstrateOptions;
58+
import com.oracle.svm.core.jdk.JNIPlatformNativeLibrarySupport;
5759
import org.graalvm.compiler.core.common.NumUtil;
5860
import org.graalvm.compiler.core.common.SuppressFBWarnings;
5961
import org.graalvm.compiler.serviceprovider.JavaVersionUtil;
@@ -333,6 +335,10 @@ public void setModule(Object module) {
333335
perms.add(SecurityConstants.ALL_PERMISSION);
334336
CodeSource cs;
335337
try {
338+
if (SubstrateOptions.UseDedicatedVMOperationThread.getValue()) {
339+
// We need to initialize encodings before we can invoke toURI()
340+
JNIPlatformNativeLibrarySupport.singleton().initializeBuiltinLibraries();
341+
}
336342
// Try to use executable image's name as code source for the class.
337343
// The file location can be used by Java code to determine its location on disk, similar
338344
// to argv[0].

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/RecomputedFields.java

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
import java.lang.reflect.Modifier;
3636
import java.nio.charset.CharsetDecoder;
3737
import java.nio.charset.CoderResult;
38+
import java.security.AccessControlContext;
39+
import java.security.Permission;
3840
import java.util.Map;
3941
import java.util.concurrent.ConcurrentHashMap;
4042
import java.util.concurrent.ConcurrentMap;
@@ -46,6 +48,7 @@
4648
import java.util.concurrent.locks.ReentrantLock;
4749
import java.util.function.Consumer;
4850

51+
import org.graalvm.compiler.phases.common.LazyValue;
4952
import org.graalvm.compiler.serviceprovider.GraalUnsafeAccess;
5053
import org.graalvm.compiler.serviceprovider.JavaVersionUtil;
5154
import org.graalvm.nativeimage.ImageSingletons;
@@ -354,12 +357,70 @@ public static int getCommonPoolParallelism() {
354357
@TargetElement(onlyWith = JDK8OrEarlier.class)
355358
static native ForkJoinPool makeCommonPool();
356359

360+
@Alias //
361+
@TargetElement(onlyWith = JDK11OrLater.class) //
362+
public static native AccessControlContext contextWithPermissions(Permission... perms);
363+
357364
@Alias //
358365
@TargetElement(onlyWith = JDK11OrLater.class) //
359366
Target_java_util_concurrent_ForkJoinPool(byte forCommonPoolOnly) {
360367
}
361368
}
362369

370+
/**
371+
* Since AccessControlContextFeature replaces all AccessControlContext objects with
372+
* NO_CONTEXT_SINGLETON, we need to reinitialize them in runtime.
373+
*/
374+
@TargetClass(className = "java.util.concurrent.ForkJoinPool$DefaultForkJoinWorkerThreadFactory", onlyWith = JDK11OrLater.class)
375+
@SuppressWarnings("unused") //
376+
final class Target_java_util_concurrent_ForkJoinPool_DefaultForkJoinWorkerThreadFactory {
377+
@Alias @InjectAccessors(DefaultForkJoinWorkerThreadFactoryAcc.class) static AccessControlContext ACC;
378+
}
379+
380+
class DefaultForkJoinWorkerThreadFactoryAcc {
381+
static LazyValue<AccessControlContext> acc = new LazyValue<>(() -> AccessControllerUtil.contextWithPermissions(
382+
new RuntimePermission("getClassLoader"),
383+
new RuntimePermission("setContextClassLoader")));
384+
385+
static AccessControlContext get() {
386+
return acc.get();
387+
}
388+
}
389+
390+
@TargetClass(className = "java.util.concurrent.ForkJoinPool$InnocuousForkJoinWorkerThreadFactory", onlyWith = JDK11OrLater.class)
391+
@SuppressWarnings("unused") //
392+
final class Target_java_util_concurrent_ForkJoinPool_InnocuousForkJoinWorkerThreadFactory {
393+
@Alias @InjectAccessors(InnocuousForkJoinWorkerThreadFactoryAcc.class) static AccessControlContext ACC;
394+
}
395+
396+
class InnocuousForkJoinWorkerThreadFactoryAcc {
397+
static LazyValue<AccessControlContext> acc = new LazyValue<>(() -> AccessControllerUtil.contextWithPermissions(
398+
new RuntimePermission("modifyThread"),
399+
new RuntimePermission("enableContextClassLoaderOverride"),
400+
new RuntimePermission("modifyThreadGroup"),
401+
new RuntimePermission("getClassLoader"),
402+
new RuntimePermission("setContextClassLoader")));
403+
404+
static AccessControlContext get() {
405+
return acc.get();
406+
}
407+
}
408+
409+
@TargetClass(className = "java.util.Calendar$CalendarAccessControlContext")
410+
@SuppressWarnings("unused") //
411+
final class Target_java_util_Calendar_CalendarAccessControlContext {
412+
@Alias @InjectAccessors(CalendarAccessControlContextAcc.class) static AccessControlContext INSTANCE;
413+
}
414+
415+
class CalendarAccessControlContextAcc {
416+
static LazyValue<AccessControlContext> acc = new LazyValue<>(() -> AccessControllerUtil.contextWithPermissions(
417+
new RuntimePermission("accessClassInPackage.sun.util.calendar")));
418+
419+
static AccessControlContext get() {
420+
return acc.get();
421+
}
422+
}
423+
363424
/**
364425
* An injected field to replace ForkJoinPool.common.
365426
*

0 commit comments

Comments
 (0)