24
24
*/
25
25
package com .oracle .svm .core .jdk ;
26
26
27
- import static com .oracle .svm .core .snippets .KnownIntrinsics .readCallerStackPointer ;
27
+ import com .oracle .svm .core .SubstrateUtil ;
28
+ import com .oracle .svm .core .annotate .Alias ;
29
+ import com .oracle .svm .core .annotate .Delete ;
30
+ import com .oracle .svm .core .annotate .InjectAccessors ;
31
+ import com .oracle .svm .core .annotate .NeverInline ;
32
+ import com .oracle .svm .core .annotate .RecomputeFieldValue ;
33
+ import com .oracle .svm .core .annotate .Substitute ;
34
+ import com .oracle .svm .core .annotate .TargetClass ;
35
+ import com .oracle .svm .core .annotate .TargetElement ;
36
+ import com .oracle .svm .core .graal .snippets .CEntryPointSnippets ;
37
+ import com .oracle .svm .core .thread .Target_java_lang_Thread ;
38
+ import com .oracle .svm .core .util .VMError ;
39
+ import jdk .vm .ci .meta .MetaAccessProvider ;
40
+ import jdk .vm .ci .meta .ResolvedJavaField ;
41
+ import org .graalvm .compiler .serviceprovider .JavaVersionUtil ;
42
+ import org .graalvm .nativeimage .Platform ;
43
+ import org .graalvm .nativeimage .Platforms ;
44
+ import org .graalvm .word .Pointer ;
28
45
29
46
import java .net .URL ;
30
47
import java .security .AccessControlContext ;
43
60
import java .util .concurrent .atomic .AtomicReference ;
44
61
import java .util .function .Predicate ;
45
62
46
- import jdk .vm .ci .meta .MetaAccessProvider ;
47
- import jdk .vm .ci .meta .ResolvedJavaField ;
48
- import org .graalvm .compiler .serviceprovider .JavaVersionUtil ;
49
- import org .graalvm .nativeimage .Platform ;
50
- import org .graalvm .nativeimage .Platforms ;
51
- import org .graalvm .word .Pointer ;
52
-
53
- import com .oracle .svm .core .SubstrateUtil ;
54
- import com .oracle .svm .core .annotate .Alias ;
55
- import com .oracle .svm .core .annotate .Delete ;
56
- import com .oracle .svm .core .annotate .InjectAccessors ;
57
- import com .oracle .svm .core .annotate .NeverInline ;
58
- import com .oracle .svm .core .annotate .RecomputeFieldValue ;
59
- import com .oracle .svm .core .annotate .Substitute ;
60
- import com .oracle .svm .core .annotate .TargetClass ;
61
- import com .oracle .svm .core .annotate .TargetElement ;
62
- import com .oracle .svm .core .thread .Target_java_lang_Thread ;
63
- import com .oracle .svm .core .util .VMError ;
63
+ import static com .oracle .svm .core .snippets .KnownIntrinsics .readCallerStackPointer ;
64
64
65
65
// Checkstyle: stop
66
66
import sun .security .jca .ProviderList ;
@@ -108,7 +108,19 @@ static <T> T doPrivileged(PrivilegedExceptionAction<T> action, AccessControlCont
108
108
}
109
109
110
110
@ Substitute
111
+ @ SuppressWarnings ("deprecation" )
111
112
static AccessControlContext getStackAccessControlContext () {
113
+ if (!CEntryPointSnippets .isIsolateInitialized ()) {
114
+ /*
115
+ * If isolate still isn't initialized, we can assume that we are so early in the JDK
116
+ * initialization that any attempt at stalk walk will fail as not even the basic
117
+ * PrintWriter/Logging is available yet. This manifested when
118
+ * UseDedicatedVMOperationThread hosted option was set, triggering a runtime crash.
119
+ */
120
+ Permissions perms = new Permissions ();
121
+ perms .add (SecurityConstants .ALL_PERMISSION );
122
+ return new AccessControlContext (new ProtectionDomain []{new ProtectionDomain (null , perms )});
123
+ }
112
124
return StackAccessControlContextVisitor .getFromStack ();
113
125
}
114
126
@@ -118,47 +130,47 @@ static AccessControlContext getInheritedAccessControlContext() {
118
130
}
119
131
120
132
@ Substitute
121
- @ TargetElement (onlyWith = JDK14OrLater .class )
133
+ @ TargetElement (onlyWith = JDK17OrLater .class )
122
134
private static ProtectionDomain getProtectionDomain (final Class <?> caller ) {
123
135
return caller .getProtectionDomain ();
124
136
}
125
137
126
138
@ Substitute
127
- @ TargetElement (onlyWith = JDK14OrLater .class )
139
+ @ TargetElement (onlyWith = JDK17OrLater .class )
128
140
static <T > T executePrivileged (PrivilegedExceptionAction <T > action , AccessControlContext context , Class <?> caller ) throws Throwable {
129
141
if (action == null ) {
130
142
throw new NullPointerException ("Null action" );
131
143
}
132
144
133
- AccessControllerUtil . PrivilegedStack .push (context , caller );
145
+ PrivilegedStack .push (context , caller );
134
146
try {
135
147
return action .run ();
136
148
} catch (Exception e ) {
137
149
throw AccessControllerUtil .wrapCheckedException (e );
138
150
} finally {
139
- AccessControllerUtil . PrivilegedStack .pop ();
151
+ PrivilegedStack .pop ();
140
152
}
141
153
}
142
154
143
155
@ Substitute
144
- @ TargetElement (onlyWith = JDK14OrLater .class )
156
+ @ TargetElement (onlyWith = JDK17OrLater .class )
145
157
static <T > T executePrivileged (PrivilegedAction <T > action , AccessControlContext context , Class <?> caller ) throws Throwable {
146
158
if (action == null ) {
147
159
throw new NullPointerException ("Null action" );
148
160
}
149
161
150
- AccessControllerUtil . PrivilegedStack .push (context , caller );
162
+ PrivilegedStack .push (context , caller );
151
163
try {
152
164
return action .run ();
153
165
} catch (Exception e ) {
154
166
throw AccessControllerUtil .wrapCheckedException (e );
155
167
} finally {
156
- AccessControllerUtil . PrivilegedStack .pop ();
168
+ PrivilegedStack .pop ();
157
169
}
158
170
}
159
171
160
172
@ Substitute
161
- @ TargetElement (onlyWith = JDK14OrLater .class )
173
+ @ TargetElement (onlyWith = JDK17OrLater .class )
162
174
@ SuppressWarnings ({"unused" , "deprecation" })
163
175
static AccessControlContext checkContext (AccessControlContext context , Class <?> caller ) {
164
176
@@ -182,15 +194,19 @@ static AccessControlContext checkContext(AccessControlContext context, Class<?>
182
194
@ TargetClass (java .security .AccessControlContext .class )
183
195
@ SuppressWarnings ({"unused" })
184
196
final class Target_java_security_AccessControlContext {
185
- @ Alias protected boolean isPrivileged ;
186
- @ Alias protected boolean isAuthorized ;
197
+ @ Alias public boolean isPrivileged ;
198
+ @ Alias public boolean isAuthorized ;
187
199
188
200
@ Alias
189
201
Target_java_security_AccessControlContext (ProtectionDomain [] context , AccessControlContext privilegedContext ) {
190
202
}
191
203
192
204
@ Substitute
193
205
static Debug getDebug () {
206
+ /*
207
+ * We want to prevent Debug class from being reachable, as this method would return null
208
+ * anyways
209
+ */
194
210
return null ;
195
211
}
196
212
}
0 commit comments