Skip to content

Commit

Permalink
Merge pull request #13590 from babsingh/throw_iae_linkToInterface_029
Browse files Browse the repository at this point in the history
Throw IllegalAccessError (IAE) from linkToInterface
  • Loading branch information
gacholio committed Sep 29, 2021
2 parents 6dd8092 + f5850c0 commit 8283076
Showing 1 changed file with 33 additions and 9 deletions.
42 changes: 33 additions & 9 deletions runtime/vm/BytecodeInterpreter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8533,6 +8533,13 @@ class INTERPRETER_CLASS
{
VM_BytecodeAction rc = GOTO_RUN_METHOD;
bool fromJIT = J9_ARE_ANY_BITS_SET(_currentThread->jitStackFrameFlags, J9_SSF_JIT_NATIVE_TRANSITION_FRAME);
J9JNIMethodID *methodID = NULL;
J9ROMMethod *romMethod = NULL;
UDATA methodArgCount = 0;
j9object_t receiverObject = NULL;
J9Class *receiverClass = NULL;
J9Method *method = NULL;
UDATA vTableOffset = 0;

/* Pop memberNameObject from the stack. */
j9object_t memberNameObject = *(j9object_t *)_sp++;
Expand All @@ -8542,26 +8549,28 @@ class INTERPRETER_CLASS
_sp -= 1;
buildJITResolveFrame(REGISTER_ARGS);
}
return THROW_NPE;
rc = THROW_NPE;
goto done;
}

J9JNIMethodID *methodID = (J9JNIMethodID *)(UDATA)J9OBJECT_U64_LOAD(_currentThread, memberNameObject, _vm->vmindexOffset);
J9ROMMethod *romMethod = J9_ROM_METHOD_FROM_RAM_METHOD(methodID->method);
UDATA methodArgCount = romMethod->argCount;
methodID = (J9JNIMethodID *)(UDATA)J9OBJECT_U64_LOAD(_currentThread, memberNameObject, _vm->vmindexOffset);
romMethod = J9_ROM_METHOD_FROM_RAM_METHOD(methodID->method);
methodArgCount = romMethod->argCount;

j9object_t receiverObject = ((j9object_t *)_sp)[methodArgCount - 1];
receiverObject = ((j9object_t *)_sp)[methodArgCount - 1];
if (J9_UNEXPECTED(NULL == receiverObject)) {
if (fromJIT) {
/* Restore SP to before popping memberNameObject. */
_sp -= 1;
buildJITResolveFrame(REGISTER_ARGS);
}
return THROW_NPE;
rc = THROW_NPE;
goto done;
}

J9Class *receiverClass = J9OBJECT_CLAZZ(_currentThread, receiverObject);
J9Method *method = (J9Method *)(UDATA)J9OBJECT_U64_LOAD(_currentThread, memberNameObject, _vm->vmtargetOffset);
UDATA vTableOffset = methodID->vTableIndex;
receiverClass = J9OBJECT_CLAZZ(_currentThread, receiverObject);
method = (J9Method *)(UDATA)J9OBJECT_U64_LOAD(_currentThread, memberNameObject, _vm->vmtargetOffset);
vTableOffset = methodID->vTableIndex;

/* vmindexOffset (J9JNIMethodID) is initialized using jnicsup.cpp::initializeMethodID.
* initializeMethodID will set J9JNIMethodID->vTableIndex to 0 for private interface
Expand Down Expand Up @@ -8600,6 +8609,20 @@ class INTERPRETER_CLASS
_sendMethod = *(J9Method **)(((UDATA)receiverClass) + vTableOffset);
}

romMethod = J9_ROM_METHOD_FROM_RAM_METHOD(_sendMethod);
if (J9_ARE_NO_BITS_SET(romMethod->modifiers, J9AccPublic | J9AccPrivate)) {
if (fromJIT) {
_sp -= 1;
buildJITResolveFrame(REGISTER_ARGS);
}
updateVMStruct(REGISTER_ARGS);
prepareForExceptionThrow(_currentThread);
setIllegalAccessErrorNonPublicInvokeInterface(_currentThread, _sendMethod);
VMStructHasBeenUpdated(REGISTER_ARGS);
rc = GOTO_THROW_CURRENT_EXCEPTION;
goto done;
}

if (fromJIT) {
/* Restore SP to before popping memberNameObject. */
_sp -= 1;
Expand All @@ -8613,6 +8636,7 @@ class INTERPRETER_CLASS
rc = j2iTransition(REGISTER_ARGS);
}

done:
return rc;
}

Expand Down

0 comments on commit 8283076

Please sign in to comment.