Skip to content

Commit 7a3f413

Browse files
authored
Merge pull request #18967 from fengxue-IS/18961
Correctly initialize walkState values when calling walkStackFrames
2 parents a4af783 + fc9b689 commit 7a3f413

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

runtime/jcl/common/java_lang_StackWalker.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ Java_java_lang_StackWalker_walkWrapperImpl(JNIEnv *env, jclass clazz, jint flags
102102
J9StackWalkState *walkState = vmThread->stackWalkState;
103103

104104
Assert_JCL_notNull (stackWalkerMethod);
105+
/* Consume thread's stateWalkState, push a new entry to thread for use during Java callout. */
105106
memset(&newWalkState, 0, sizeof(J9StackWalkState));
106107
newWalkState.previous = walkState;
107108
vmThread->stackWalkState = &newWalkState;
@@ -146,11 +147,12 @@ Java_java_lang_StackWalker_walkWrapperImpl(JNIEnv *env, jclass clazz, jint flags
146147
if (NULL == walkerMethodChars) { /* native out of memory exception pending */
147148
return NULL;
148149
}
150+
/* Ensure userData1/2 used by stackFrameFilter function is set properly. */
151+
walkState->userData1 = (void *)(UDATA)flags;
149152
walkState->userData2 = (void *)walkerMethodChars;
150153
UDATA walkStateResult = vm->walkStackFrames(vmThread, walkState);
151154
Assert_JCL_true(walkStateResult == J9_STACKWALK_RC_NONE);
152155
walkState->flags |= J9_STACKWALK_RESUME;
153-
walkState->userData1 = (void *)(UDATA)flags;
154156
if (J9SF_FRAME_TYPE_END_OF_STACK != walkState->pc) {
155157
/* indicate the we have the topmost client method's frame */
156158
walkState->userData1 = (void *)((UDATA)walkState->userData1 | J9_FRAME_VALID);
@@ -210,11 +212,12 @@ Java_java_lang_StackWalker_walkContinuationImpl(JNIEnv *env, jclass clazz, jint
210212
walkState.frameWalkFunction = stackFrameFilter;
211213

212214
/* walking unmounted Continuation will not require skipping StackWalker methods */
215+
walkState.userData1 = (void *)(UDATA)flags;
213216
walkState.userData2 = NULL;
214217
UDATA walkStateResult = vm->walkStackFrames(vmThread, &walkState);
215218
Assert_JCL_true(walkStateResult == J9_STACKWALK_RC_NONE);
216219
walkState.flags |= J9_STACKWALK_RESUME;
217-
walkState.userData1 = (void *)(UDATA)flags;
220+
218221
if (J9SF_FRAME_TYPE_END_OF_STACK != walkState.pc) {
219222
/* indicate the we have the topmost client method's frame */
220223
walkState.userData1 = (void *)((UDATA)walkState.userData1 | J9_FRAME_VALID);

0 commit comments

Comments
 (0)