2424 */
2525package com .oracle .svm .core .jdk ;
2626
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 ;
2845
2946import java .net .URL ;
3047import java .security .AccessControlContext ;
4360import java .util .concurrent .atomic .AtomicReference ;
4461import java .util .function .Predicate ;
4562
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 ;
6464
6565// Checkstyle: stop
6666import sun .security .jca .ProviderList ;
@@ -109,6 +109,17 @@ static <T> T doPrivileged(PrivilegedExceptionAction<T> action, AccessControlCont
109109
110110 @ Substitute
111111 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+ }
112123 return StackAccessControlContextVisitor .getFromStack ();
113124 }
114125
@@ -118,47 +129,47 @@ static AccessControlContext getInheritedAccessControlContext() {
118129 }
119130
120131 @ Substitute
121- @ TargetElement (onlyWith = JDK14OrLater .class )
132+ @ TargetElement (onlyWith = JDK17OrLater .class )
122133 private static ProtectionDomain getProtectionDomain (final Class <?> caller ) {
123134 return caller .getProtectionDomain ();
124135 }
125136
126137 @ Substitute
127- @ TargetElement (onlyWith = JDK14OrLater .class )
138+ @ TargetElement (onlyWith = JDK17OrLater .class )
128139 static <T > T executePrivileged (PrivilegedExceptionAction <T > action , AccessControlContext context , Class <?> caller ) throws Throwable {
129140 if (action == null ) {
130141 throw new NullPointerException ("Null action" );
131142 }
132143
133- AccessControllerUtil . PrivilegedStack .push (context , caller );
144+ PrivilegedStack .push (context , caller );
134145 try {
135146 return action .run ();
136147 } catch (Exception e ) {
137148 throw AccessControllerUtil .wrapCheckedException (e );
138149 } finally {
139- AccessControllerUtil . PrivilegedStack .pop ();
150+ PrivilegedStack .pop ();
140151 }
141152 }
142153
143154 @ Substitute
144- @ TargetElement (onlyWith = JDK14OrLater .class )
155+ @ TargetElement (onlyWith = JDK17OrLater .class )
145156 static <T > T executePrivileged (PrivilegedAction <T > action , AccessControlContext context , Class <?> caller ) throws Throwable {
146157 if (action == null ) {
147158 throw new NullPointerException ("Null action" );
148159 }
149160
150- AccessControllerUtil . PrivilegedStack .push (context , caller );
161+ PrivilegedStack .push (context , caller );
151162 try {
152163 return action .run ();
153164 } catch (Exception e ) {
154165 throw AccessControllerUtil .wrapCheckedException (e );
155166 } finally {
156- AccessControllerUtil . PrivilegedStack .pop ();
167+ PrivilegedStack .pop ();
157168 }
158169 }
159170
160171 @ Substitute
161- @ TargetElement (onlyWith = JDK14OrLater .class )
172+ @ TargetElement (onlyWith = JDK17OrLater .class )
162173 @ SuppressWarnings ({"unused" , "deprecation" })
163174 static AccessControlContext checkContext (AccessControlContext context , Class <?> caller ) {
164175
@@ -182,15 +193,19 @@ static AccessControlContext checkContext(AccessControlContext context, Class<?>
182193@ TargetClass (java .security .AccessControlContext .class )
183194@ SuppressWarnings ({"unused" })
184195final 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 ;
187198
188199 @ Alias
189200 Target_java_security_AccessControlContext (ProtectionDomain [] context , AccessControlContext privilegedContext ) {
190201 }
191202
192203 @ Substitute
193204 static Debug getDebug () {
205+ /*
206+ * We want to prevent Debug class from being reachable, as this method would return null
207+ * anyways
208+ */
194209 return null ;
195210 }
196211}
0 commit comments