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 ;
@@ -109,6 +109,17 @@ static <T> T doPrivileged(PrivilegedExceptionAction<T> action, AccessControlCont
109
109
110
110
@ Substitute
111
111
static AccessControlContext getStackAccessControlContext () {
112
+ if (!CEntryPointSnippets .isIsolateInitialized ()) {
113
+ /*
114
+ * If isolate still isn't initialized, we can assume that we are so early in the JDK
115
+ * initialization that any attempt at stalk walk will fail as not even the basic
116
+ * PrintWriter/Logging is available yet. This manifested when
117
+ * UseDedicatedVMOperationThread hosted option was set, triggering a runtime crash.
118
+ */
119
+ Permissions perms = new Permissions ();
120
+ perms .add (SecurityConstants .ALL_PERMISSION );
121
+ return new AccessControlContext (new ProtectionDomain []{new ProtectionDomain (null , perms )});
122
+ }
112
123
return StackAccessControlContextVisitor .getFromStack ();
113
124
}
114
125
@@ -118,47 +129,47 @@ static AccessControlContext getInheritedAccessControlContext() {
118
129
}
119
130
120
131
@ Substitute
121
- @ TargetElement (onlyWith = JDK14OrLater .class )
132
+ @ TargetElement (onlyWith = JDK17OrLater .class )
122
133
private static ProtectionDomain getProtectionDomain (final Class <?> caller ) {
123
134
return caller .getProtectionDomain ();
124
135
}
125
136
126
137
@ Substitute
127
- @ TargetElement (onlyWith = JDK14OrLater .class )
138
+ @ TargetElement (onlyWith = JDK17OrLater .class )
128
139
static <T > T executePrivileged (PrivilegedExceptionAction <T > action , AccessControlContext context , Class <?> caller ) throws Throwable {
129
140
if (action == null ) {
130
141
throw new NullPointerException ("Null action" );
131
142
}
132
143
133
- AccessControllerUtil . PrivilegedStack .push (context , caller );
144
+ PrivilegedStack .push (context , caller );
134
145
try {
135
146
return action .run ();
136
147
} catch (Exception e ) {
137
148
throw AccessControllerUtil .wrapCheckedException (e );
138
149
} finally {
139
- AccessControllerUtil . PrivilegedStack .pop ();
150
+ PrivilegedStack .pop ();
140
151
}
141
152
}
142
153
143
154
@ Substitute
144
- @ TargetElement (onlyWith = JDK14OrLater .class )
155
+ @ TargetElement (onlyWith = JDK17OrLater .class )
145
156
static <T > T executePrivileged (PrivilegedAction <T > action , AccessControlContext context , Class <?> caller ) throws Throwable {
146
157
if (action == null ) {
147
158
throw new NullPointerException ("Null action" );
148
159
}
149
160
150
- AccessControllerUtil . PrivilegedStack .push (context , caller );
161
+ PrivilegedStack .push (context , caller );
151
162
try {
152
163
return action .run ();
153
164
} catch (Exception e ) {
154
165
throw AccessControllerUtil .wrapCheckedException (e );
155
166
} finally {
156
- AccessControllerUtil . PrivilegedStack .pop ();
167
+ PrivilegedStack .pop ();
157
168
}
158
169
}
159
170
160
171
@ Substitute
161
- @ TargetElement (onlyWith = JDK14OrLater .class )
172
+ @ TargetElement (onlyWith = JDK17OrLater .class )
162
173
@ SuppressWarnings ({"unused" , "deprecation" })
163
174
static AccessControlContext checkContext (AccessControlContext context , Class <?> caller ) {
164
175
@@ -182,15 +193,19 @@ static AccessControlContext checkContext(AccessControlContext context, Class<?>
182
193
@ TargetClass (java .security .AccessControlContext .class )
183
194
@ SuppressWarnings ({"unused" })
184
195
final class Target_java_security_AccessControlContext {
185
- @ Alias protected boolean isPrivileged ;
186
- @ Alias protected boolean isAuthorized ;
196
+ @ Alias public boolean isPrivileged ;
197
+ @ Alias public boolean isAuthorized ;
187
198
188
199
@ Alias
189
200
Target_java_security_AccessControlContext (ProtectionDomain [] context , AccessControlContext privilegedContext ) {
190
201
}
191
202
192
203
@ Substitute
193
204
static Debug getDebug () {
205
+ /*
206
+ * We want to prevent Debug class from being reachable, as this method would return null
207
+ * anyways
208
+ */
194
209
return null ;
195
210
}
196
211
}
0 commit comments