|
@@ -157,7 +157,9 @@ public class SecureSM extends SecurityManager {
|
|
|
// Returns true if the given thread is an instance of the JDK's InnocuousThread.
|
|
|
private static boolean isInnocuousThread(Thread t) {
|
|
|
final Class<?> c = t.getClass();
|
|
|
- return c.getModule() == Object.class.getModule() && c.getName().equals("jdk.internal.misc.InnocuousThread");
|
|
|
+ return c.getModule() == Object.class.getModule()
|
|
|
+ && (c.getName().equals("jdk.internal.misc.InnocuousThread")
|
|
|
+ || c.getName().equals("java.util.concurrent.ForkJoinWorkerThread$InnocuousForkJoinWorkerThread"));
|
|
|
}
|
|
|
|
|
|
protected void checkThreadAccess(Thread t) {
|
|
@@ -184,11 +186,21 @@ public class SecureSM extends SecurityManager {
|
|
|
private static final Permission MODIFY_THREADGROUP_PERMISSION = new RuntimePermission("modifyThreadGroup");
|
|
|
private static final Permission MODIFY_ARBITRARY_THREADGROUP_PERMISSION = new ThreadPermission("modifyArbitraryThreadGroup");
|
|
|
|
|
|
+ // Returns true if the given thread is an instance of the JDK's InnocuousThread.
|
|
|
+ private static boolean isInnocuousThreadGroup(ThreadGroup t) {
|
|
|
+ final Class<?> c = t.getClass();
|
|
|
+ return c.getModule() == Object.class.getModule() && t.getName().equals("InnocuousForkJoinWorkerThreadGroup");
|
|
|
+ }
|
|
|
+
|
|
|
protected void checkThreadGroupAccess(ThreadGroup g) {
|
|
|
Objects.requireNonNull(g);
|
|
|
|
|
|
+ boolean targetThreadGroupIsInnocuous = isInnocuousThreadGroup(g);
|
|
|
+
|
|
|
// first, check if we can modify thread groups at all.
|
|
|
- checkPermission(MODIFY_THREADGROUP_PERMISSION);
|
|
|
+ if (targetThreadGroupIsInnocuous == false) {
|
|
|
+ checkPermission(MODIFY_THREADGROUP_PERMISSION);
|
|
|
+ }
|
|
|
|
|
|
// check the threadgroup, if its our thread group or an ancestor, its fine.
|
|
|
final ThreadGroup source = Thread.currentThread().getThreadGroup();
|
|
@@ -196,7 +208,7 @@ public class SecureSM extends SecurityManager {
|
|
|
|
|
|
if (source == null) {
|
|
|
return; // we are a dead thread, do nothing
|
|
|
- } else if (source.parentOf(target) == false) {
|
|
|
+ } else if (source.parentOf(target) == false && targetThreadGroupIsInnocuous == false) {
|
|
|
checkPermission(MODIFY_ARBITRARY_THREADGROUP_PERMISSION);
|
|
|
}
|
|
|
}
|