Skip to content

Commit 0892ee1

Browse files
theresa-myathamravali
authored andcommitted
Copy local signature from MethodHandleNatives.resolve
Signed-off-by: Theresa Mammarella <Theresa.T.Mammarella@ibm.com>
1 parent 410fd54 commit 0892ee1

9 files changed

Lines changed: 59 additions & 21 deletions

runtime/bcverify/clconstraints.c

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
#include "omrlinkedlist.h"
3333

3434
static J9ClassLoadingConstraint* findClassLoadingConstraint (J9VMThread* vmThread, J9ClassLoader* loader, U_8* name, UDATA length);
35-
static J9ClassLoadingConstraint* registerClassLoadingConstraint (J9VMThread* vmThread, J9ClassLoader* loader, U_8* name, UDATA length, UDATA copyName);
35+
static J9ClassLoadingConstraint* registerClassLoadingConstraint (J9VMThread* vmThread, J9ClassLoader* loader, U_8* name, UDATA length, BOOLEAN copyName);
3636
static void validateArgs (J9VMThread* vmThread, J9ClassLoader* loader1, J9ClassLoader* loader2, U_8* name1, U_8* name2, UDATA length);
3737
static void constrainList (J9ClassLoadingConstraint* constraint, J9Class* clazz);
3838
static UDATA constraintHashFn(void *key, void *userData);
@@ -71,7 +71,7 @@ validateArgs (J9VMThread* vmThread, J9ClassLoader* loader1, J9ClassLoader* loade
7171
* return 0 if no class loading constraints have been violated, or non-zero if they have been.
7272
*/
7373
UDATA
74-
j9bcv_checkClassLoadingConstraintsForSignature (J9VMThread* vmThread, J9ClassLoader* loader1, J9ClassLoader* loader2, J9UTF8* sig1, J9UTF8* sig2)
74+
j9bcv_checkClassLoadingConstraintsForSignature (J9VMThread *vmThread, J9ClassLoader *loader1, J9ClassLoader *loader2, J9UTF8 *sig1, J9UTF8 *sig2, BOOLEAN copySig1)
7575
{
7676
U_32 index = 0, endIndex;
7777
U_32 length = J9UTF8_LENGTH(sig1);
@@ -101,8 +101,7 @@ j9bcv_checkClassLoadingConstraintsForSignature (J9VMThread* vmThread, J9ClassLoa
101101
while (J9UTF8_DATA(sig1)[endIndex] != ';') {
102102
endIndex++;
103103
}
104-
105-
rc = j9bcv_checkClassLoadingConstraintForName (vmThread, loader1, loader2, &J9UTF8_DATA(sig1)[index], &J9UTF8_DATA(sig2)[index], endIndex - index, FALSE);
104+
rc = j9bcv_checkClassLoadingConstraintForName (vmThread, loader1, loader2, &J9UTF8_DATA(sig1)[index], &J9UTF8_DATA(sig2)[index], endIndex - index, copySig1, FALSE);
106105
if (rc) {
107106
break;
108107
}
@@ -120,7 +119,7 @@ j9bcv_checkClassLoadingConstraintsForSignature (J9VMThread* vmThread, J9ClassLoa
120119
/* NOTE: the current thread must own the class table mutex */
121120

122121
UDATA
123-
j9bcv_checkClassLoadingConstraintForName (J9VMThread* vmThread, J9ClassLoader* loader1, J9ClassLoader* loader2, U_8* name1, U_8* name2, UDATA length, UDATA copyUTFs)
122+
j9bcv_checkClassLoadingConstraintForName (J9VMThread *vmThread, J9ClassLoader *loader1, J9ClassLoader *loader2, U_8 *name1, U_8 *name2, UDATA length, BOOLEAN copyName1, BOOLEAN copyName2)
124123
{
125124
J9Class *class1;
126125
J9Class *class2;
@@ -140,7 +139,7 @@ j9bcv_checkClassLoadingConstraintForName (J9VMThread* vmThread, J9ClassLoader* l
140139
return 1;
141140
}
142141
} else if (class1 == NULL && class2 != NULL) {
143-
const1 = registerClassLoadingConstraint (vmThread, loader1, name1, length, copyUTFs);
142+
const1 = registerClassLoadingConstraint (vmThread, loader1, name1, length, copyName1);
144143
if (const1 == NULL) return 1;
145144
if (const1->clazz != NULL) {
146145
if (const1->clazz != class2) {
@@ -151,7 +150,7 @@ j9bcv_checkClassLoadingConstraintForName (J9VMThread* vmThread, J9ClassLoader* l
151150
const1->clazz = class2;
152151
}
153152
} else if (class2 == NULL && class1 != NULL) {
154-
const2 = registerClassLoadingConstraint (vmThread, loader2, name2, length, copyUTFs);
153+
const2 = registerClassLoadingConstraint (vmThread, loader2, name2, length, copyName2);
155154
if (const2->clazz != NULL) {
156155
if (const2->clazz != class1) {
157156
return 1;
@@ -164,11 +163,11 @@ j9bcv_checkClassLoadingConstraintForName (J9VMThread* vmThread, J9ClassLoader* l
164163
J9ClassLoadingConstraint *tempNext;
165164
J9ClassLoadingConstraint *tempPrevious;
166165

167-
const1 = registerClassLoadingConstraint (vmThread, loader1, name1, length, copyUTFs);
166+
const1 = registerClassLoadingConstraint (vmThread, loader1, name1, length, copyName1);
168167
if (const1 == NULL) {
169168
return 1;
170169
}
171-
const2 = registerClassLoadingConstraint (vmThread, loader2, name2, length, copyUTFs);
170+
const2 = registerClassLoadingConstraint (vmThread, loader2, name2, length, copyName2);
172171
if (const2 == NULL) {
173172
return 1;
174173
}
@@ -203,7 +202,7 @@ j9bcv_checkClassLoadingConstraintForName (J9VMThread* vmThread, J9ClassLoader* l
203202
/* NOTE: the current thread must own the class table mutex */
204203

205204
static J9ClassLoadingConstraint*
206-
registerClassLoadingConstraint (J9VMThread* vmThread, J9ClassLoader* loader, U_8* name, UDATA length, UDATA copyName)
205+
registerClassLoadingConstraint (J9VMThread* vmThread, J9ClassLoader* loader, U_8* name, UDATA length, BOOLEAN copyName)
207206
{
208207
PORT_ACCESS_FROM_VMC (vmThread);
209208
J9JavaVM* vm = vmThread->javaVM;

runtime/jcl/common/java_dyn_methodhandle.c

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,16 @@ accessCheckFieldSignature(J9VMThread *currentThread, J9Class* lookupClass, UDATA
375375
U_32 sigLength = J9UTF8_LENGTH(lookupSig) - sigOffset - 1;
376376

377377
omrthread_monitor_enter(vm->classTableMutex);
378-
if(verifyData->checkClassLoadingConstraintForNameFunction(currentThread, targetClassloader, ramClass->classLoader, &lookupSigData[sigOffset], &lookupSigData[sigOffset], sigLength, TRUE) != 0) {
378+
if (0 != verifyData->checkClassLoadingConstraintForNameFunction(
379+
currentThread,
380+
targetClassloader,
381+
ramClass->classLoader,
382+
&lookupSigData[sigOffset],
383+
&lookupSigData[sigOffset],
384+
sigLength,
385+
TRUE,
386+
TRUE)
387+
) {
379388
result = FALSE;
380389
}
381390
omrthread_monitor_exit(vm->classTableMutex);
@@ -445,7 +454,16 @@ accessCheckMethodSignature(J9VMThread *currentThread, J9Method *method, j9object
445454

446455
/* Check if we really need to check this classloader constraint */
447456
if (argumentRamClass->classLoader != targetClassloader) {
448-
if(verifyData->checkClassLoadingConstraintForNameFunction(currentThread, targetClassloader, argumentRamClass->classLoader, &J9UTF8_DATA(targetSig)[index], &lookupSigData[index], endIndex - index, TRUE) != 0) {
457+
if(0 != verifyData->checkClassLoadingConstraintForNameFunction(
458+
currentThread,
459+
targetClassloader,
460+
argumentRamClass->classLoader,
461+
&J9UTF8_DATA(targetSig)[index],
462+
&lookupSigData[index],
463+
endIndex - index,
464+
TRUE,
465+
TRUE)
466+
) {
449467
result = FALSE;
450468
goto releaseMutexAndReturn;
451469
}
@@ -477,7 +495,16 @@ accessCheckMethodSignature(J9VMThread *currentThread, J9Method *method, j9object
477495
endIndex++;
478496
}
479497

480-
if(verifyData->checkClassLoadingConstraintForNameFunction(currentThread, targetClassloader, returnRamClass->classLoader, &J9UTF8_DATA(targetSig)[index], &lookupSigData[index], endIndex - index, TRUE) != 0) {
498+
if(0 != verifyData->checkClassLoadingConstraintForNameFunction(
499+
currentThread,
500+
targetClassloader,
501+
returnRamClass->classLoader,
502+
&J9UTF8_DATA(targetSig)[index],
503+
&lookupSigData[index],
504+
endIndex - index,
505+
TRUE,
506+
TRUE)
507+
) {
481508
result = FALSE;
482509
goto releaseMutexAndReturn;
483510
}

runtime/jcl/common/java_lang_invoke_MethodHandleNatives.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1323,6 +1323,7 @@ Java_java_lang_invoke_MethodHandleNatives_resolve(
13231323
J9UTF8_DATA(signature) + sigOffset,
13241324
J9UTF8_DATA(signature) + sigOffset,
13251325
J9UTF8_LENGTH(signature) - sigOffset - 1, /* -1 to remove the trailing ;*/
1326+
true,
13261327
true);
13271328
omrthread_monitor_exit(vm->classTableMutex);
13281329
if (0 != clConstraintResult) {

runtime/jcl/common/java_lang_invoke_VarHandle.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ accessCheckFieldType(J9VMThread *currentThread, J9Class* lookupClass, J9Class* t
6464
&lookupSigData[1],
6565
&lookupSigData[1],
6666
J9UTF8_LENGTH(lookupSig) - 2,
67+
TRUE,
6768
TRUE) != 0) {
6869
result = FALSE;
6970
}

runtime/oti/bcverify_api.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,10 +160,11 @@ bcvIsInitOrClinit (J9CfrConstantPoolInfo * info);
160160
* @param loader2
161161
* @param sig1
162162
* @param sig2
163+
* @param copySig1
163164
* @return UDATA
164165
*/
165166
UDATA
166-
j9bcv_checkClassLoadingConstraintsForSignature (J9VMThread* vmThread, J9ClassLoader* loader1, J9ClassLoader* loader2, J9UTF8* sig1, J9UTF8* sig2);
167+
j9bcv_checkClassLoadingConstraintsForSignature (J9VMThread *vmThread, J9ClassLoader *loader1, J9ClassLoader *loader2, J9UTF8 *sig1, J9UTF8 *sig2, BOOLEAN copySig1);
167168

168169
/**
169170
* @brief
@@ -173,10 +174,12 @@ j9bcv_checkClassLoadingConstraintsForSignature (J9VMThread* vmThread, J9ClassLoa
173174
* @param name1
174175
* @param name2
175176
* @param length
177+
* @param copyName1
178+
* @param copyName2
176179
* @return UDATA
177180
*/
178181
UDATA
179-
j9bcv_checkClassLoadingConstraintForName (J9VMThread* vmThread, J9ClassLoader* loader1, J9ClassLoader* loader2, U_8* name1, U_8* name2, UDATA length, UDATA copyUTFs);
182+
j9bcv_checkClassLoadingConstraintForName (J9VMThread *vmThread, J9ClassLoader *loader1, J9ClassLoader *loader2, U_8 *name1, U_8 *name2, UDATA length, BOOLEAN copyName1, BOOLEAN copyName2);
180183

181184
/**
182185
* @brief

runtime/oti/j9nonbuilder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2026,7 +2026,7 @@ typedef struct J9TranslationBufferSet {
20262026

20272027
typedef struct J9BytecodeVerificationData {
20282028
IDATA ( *verifyBytecodesFunction)(struct J9PortLibrary *portLib, struct J9Class *ramClass, struct J9ROMClass *romClass, struct J9BytecodeVerificationData *verifyData) ;
2029-
UDATA ( *checkClassLoadingConstraintForNameFunction)(struct J9VMThread* vmThread, struct J9ClassLoader* loader1, struct J9ClassLoader* loader2, U_8* name1, U_8* name2, UDATA length, UDATA copyUTFs) ;
2029+
UDATA ( *checkClassLoadingConstraintForNameFunction)(struct J9VMThread *vmThread, struct J9ClassLoader *loader1, struct J9ClassLoader *loader2, U_8 *name1, U_8 *name2, UDATA length, BOOLEAN copyName1, BOOLEAN copyName2) ;
20302030
struct J9UTF8** classNameList;
20312031
struct J9UTF8** classNameListEnd;
20322032
U_8* classNameSegment;

runtime/vm/createramclass.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,7 @@ addInterfaceMethods(J9VMThread *vmStruct, J9ClassLoader *classLoader, J9Class *i
634634
vTableMethodLoader = methodClass->classLoader;
635635
}
636636
if (interfaceLoader != vTableMethodLoader) {
637-
if (0 != j9bcv_checkClassLoadingConstraintsForSignature(vmStruct, vTableMethodLoader, interfaceLoader, vTableMethodSigUTF, interfaceMethodSigUTF)) {
637+
if (0 != j9bcv_checkClassLoadingConstraintsForSignature(vmStruct, vTableMethodLoader, interfaceLoader, vTableMethodSigUTF, interfaceMethodSigUTF, FALSE)) {
638638
J9UTF8 *vTableMethodClassNameUTF = J9ROMCLASS_CLASSNAME(romClass);
639639
if (NULL != methodClass) {
640640
vTableMethodClassNameUTF = J9ROMCLASS_CLASSNAME(methodClass->romClass);
@@ -1282,7 +1282,7 @@ processVTableMethod(J9VMThread *vmThread, J9ClassLoader *classLoader, UDATA *vTa
12821282
J9ClassLoader *superclassVTableMethodLoader = superclassVTableMethodClass->classLoader;
12831283
if (superclassVTableMethodLoader != classLoader) {
12841284
J9UTF8 *superclassVTableMethodSigUTF = J9ROMMETHOD_SIGNATURE(superclassVTableROMMethod);
1285-
if (0 != j9bcv_checkClassLoadingConstraintsForSignature(vmThread, classLoader, superclassVTableMethodLoader, sigUTF, superclassVTableMethodSigUTF)) {
1285+
if (0 != j9bcv_checkClassLoadingConstraintsForSignature(vmThread, classLoader, superclassVTableMethodLoader, sigUTF, superclassVTableMethodSigUTF, FALSE)) {
12861286
J9UTF8 *superclassVTableMethodClassNameUTF = J9ROMCLASS_CLASSNAME(superclassVTableMethodClass->romClass);
12871287
J9UTF8 *newClassNameUTF = J9ROMCLASS_CLASSNAME(romClass);
12881288
J9UTF8 *superclassVTableMethodNameUTF = J9ROMMETHOD_NAME(superclassVTableROMMethod);

runtime/vm/lookupmethod.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,14 @@ processMethod(J9VMThread * currentThread, UDATA lookupOptions, J9Method * method
242242
lookupSig = J9ROMNAMEANDSIGNATURE_SIGNATURE(nameAndSig);
243243
}
244244

245-
if (j9bcv_checkClassLoadingConstraintsForSignature(currentThread, cl1, cl2, lookupSig, methodSig) != 0) {
245+
if (0 != j9bcv_checkClassLoadingConstraintsForSignature(
246+
currentThread,
247+
cl1,
248+
cl2,
249+
lookupSig,
250+
methodSig,
251+
J9_ARE_ALL_BITS_SET(lookupOptions, J9_LOOK_DIRECT_NAS))
252+
) {
246253
*exception = J9VMCONSTANTPOOL_JAVALANGLINKAGEERROR; /* was VerifyError; but Sun throws Linkage */
247254
*exceptionClass = methodClass;
248255
*errorType = J9_VISIBILITY_NON_MODULE_ACCESS_ERROR;

runtime/vm/resolvesupport.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -810,7 +810,7 @@ resolveStaticFieldRefInto(J9VMThread *vmStruct, J9Method *method, J9ConstantPool
810810
}
811811
if (cl1 != cl2) {
812812
J9UTF8 *fieldSignature = J9ROMFIELDSHAPE_SIGNATURE(field);
813-
if (j9bcv_checkClassLoadingConstraintsForSignature(vmStruct, cl1, cl2, signature, fieldSignature) != 0) {
813+
if (0 != j9bcv_checkClassLoadingConstraintsForSignature(vmStruct, cl1, cl2, signature, fieldSignature, FALSE)) {
814814
if (throwException) {
815815
setCurrentException(vmStruct, J9VMCONSTANTPOOL_JAVALANGVERIFYERROR, NULL);
816816
}
@@ -1060,7 +1060,7 @@ resolveInstanceFieldRefInto(J9VMThread *vmStruct, J9Method *method, J9ConstantPo
10601060
}
10611061
if (cl1 != cl2) {
10621062
J9UTF8 *fieldSignature = J9ROMFIELDSHAPE_SIGNATURE(field);
1063-
if (j9bcv_checkClassLoadingConstraintsForSignature(vmStruct, cl1, cl2, signature, fieldSignature) != 0) {
1063+
if (0 != j9bcv_checkClassLoadingConstraintsForSignature(vmStruct, cl1, cl2, signature, fieldSignature, FALSE)) {
10641064
if (throwException) {
10651065
setCurrentException(vmStruct, J9VMCONSTANTPOOL_JAVALANGVERIFYERROR, NULL);
10661066
}

0 commit comments

Comments
 (0)