This commit is contained in:
Dean Long 2016-09-26 14:21:22 -04:00
commit fca8d47eff
9 changed files with 66 additions and 20 deletions

View File

@ -218,7 +218,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBZIP, \
$(call SET_SHARED_LIBRARY_ORIGIN), \
LDFLAGS_windows := -export:ZIP_Open -export:ZIP_Close -export:ZIP_FindEntry \
-export:ZIP_ReadEntry -export:ZIP_GetNextEntry \
-export:ZIP_InflateFully -export:ZIP_CRC32, \
-export:ZIP_InflateFully -export:ZIP_CRC32 -export:ZIP_FreeEntry, \
LIBS_unix := -ljvm -ljava $(LIBZ), \
LIBS_solaris := -lc, \
LIBS_windows := jvm.lib $(WIN_JAVA_LIB), \

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -49,6 +49,7 @@ SUNWprivate_1.1 {
Java_java_util_zip_Inflater_setDictionary;
ZIP_Close;
ZIP_CRC32;
ZIP_FreeEntry;
ZIP_FindEntry;
ZIP_GetEntry;
ZIP_GetNextEntry;

View File

@ -1094,7 +1094,7 @@ newEntry(jzfile *zip, jzcell *zc, AccessHint accessHint)
* jzentry for each zip. This optimizes a common access pattern.
*/
void
void JNICALL
ZIP_FreeEntry(jzfile *jz, jzentry *ze)
{
jzentry *last;

View File

@ -270,7 +270,8 @@ jzentry * ZIP_GetEntry(jzfile *zip, char *name, jint ulen);
void ZIP_Lock(jzfile *zip);
void ZIP_Unlock(jzfile *zip);
jint ZIP_Read(jzfile *zip, jzentry *entry, jlong pos, void *buf, jint len);
void ZIP_FreeEntry(jzfile *zip, jzentry *ze);
void JNICALL
ZIP_FreeEntry(jzfile *zip, jzentry *ze);
jlong ZIP_GetEntryDataOffset(jzfile *zip, jzentry *entry);
jzentry * ZIP_GetEntry2(jzfile *zip, char *name, jint ulen, jboolean addSlash);

View File

@ -790,9 +790,10 @@ getModuleObject(jvmtiEnv* jvmti,
pkg_name_buf[len] = '\0';
err = (*jvmti)->GetNamedModule(jvmti, loaderObject, pkg_name_buf, &moduleObject);
free((void*)pkg_name_buf);
check_phase_ret_blob(err, NULL);
jplis_assert_msg(err == JVMTI_ERROR_NONE, "error in the JVMTI GetNamedModule");
free((void*)pkg_name_buf);
return moduleObject;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2007, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -343,6 +343,35 @@ invoker_enableInvokeRequests(jthread thread)
debugMonitorExit(invokerLock);
}
/*
* Check that method is in the specified clazz or one of its super classes.
* We have to enforce this check at the JDWP layer because the JNI layer
* has different requirements.
*/
static jvmtiError check_methodClass(JNIEnv *env, jclass clazz, jmethodID method)
{
jclass containing_class = NULL;
jvmtiError error;
error = JVMTI_FUNC_PTR(gdata->jvmti,GetMethodDeclaringClass)
(gdata->jvmti, method, &containing_class);
if (error != JVMTI_ERROR_NONE) {
return JVMTI_ERROR_NONE; /* Bad jmethodID ? This will be handled elsewhere */
}
if (JNI_FUNC_PTR(env,IsSameObject)(env, clazz, containing_class)) {
return JVMTI_ERROR_NONE;
}
// If not the same class then check that containing_class is a superclass of
// clazz (not a superinterface).
if (JNI_FUNC_PTR(env,IsAssignableFrom)(env, clazz, containing_class) &&
referenceTypeTag(containing_class) != JDWP_TYPE_TAG(INTERFACE)) {
return JVMTI_ERROR_NONE;
}
return JVMTI_ERROR_INVALID_METHODID;
}
jvmtiError
invoker_requestInvoke(jbyte invokeType, jbyte options, jint id,
jthread thread, jclass clazz, jmethodID method,
@ -353,6 +382,13 @@ invoker_requestInvoke(jbyte invokeType, jbyte options, jint id,
InvokeRequest *request;
jvmtiError error = JVMTI_ERROR_NONE;
if (invokeType == INVOKE_STATIC) {
error = check_methodClass(env, clazz, method);
if (error != JVMTI_ERROR_NONE) {
return error;
}
}
debugMonitorEnter(invokerLock);
request = threadControl_getInvokeRequest(thread);
if (request != NULL) {

View File

@ -134,8 +134,6 @@ java/lang/instrument/RetransformBigClass.sh 8065756 generic-
java/lang/instrument/BootClassPath/BootClassPathTest.sh 8072130 macosx-all
java/lang/instrument/DaemonThread/TestDaemonThread.java 8161225 generic-all
java/lang/management/MemoryMXBean/Pending.java 8158837 generic-all
java/lang/management/MemoryMXBean/PendingAllGC.sh 8158760 generic-all

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -197,14 +197,18 @@ public class InterfaceMethodsTest extends TestScaffold {
// invoke interface static method A
testInvokePos(ifaceClass, null, "staticMethodA", "()I", vm().mirrorOf(RESULT_A));
// try to invoke static method A on the instance
testInvokePos(ifaceClass, ref, "staticMethodA", "()I", vm().mirrorOf(RESULT_A));
// invoking static method A on the instance fails because static method A is
// not inherited by TargetClass.
testInvokeNeg(ifaceClass, ref, "staticMethodA", "()I", vm().mirrorOf(RESULT_A),
"Invalid MethodID");
// invoke interface static method B
testInvokePos(ifaceClass, null, "staticMethodB", "()I", vm().mirrorOf(RESULT_A));
// try to invoke static method B on the instance
testInvokePos(ifaceClass, ref, "staticMethodB", "()I", vm().mirrorOf(RESULT_A));
// invoking static method B on the instance fails because static method B is
// not inherited by TargetClass.
testInvokeNeg(ifaceClass, ref, "staticMethodB", "()I", vm().mirrorOf(RESULT_A),
"Invalid MethodID");
// try to invoke a virtual method
testInvokePos(ifaceClass, ref, "implementedMethod", "()I", vm().mirrorOf(RESULT_A), true);
@ -239,21 +243,25 @@ public class InterfaceMethodsTest extends TestScaffold {
testInvokeNeg(ifaceClass, null, "staticMethodA", "()I", vm().mirrorOf(RESULT_A),
"Static interface methods are not inheritable");
// however it is possible to call "staticMethodA" on the actual instance
// "staticMethodA" is not inherited by InterfaceB even from an actual instance
testInvokeNeg(ifaceClass, ref, "staticMethodA", "()I", vm().mirrorOf(RESULT_A),
"Static interface methods are not inheritable");
// "staticMethodB" is overridden in InterfaceB
// "staticMethodB" is re-defined in InterfaceB
testInvokePos(ifaceClass, null, "staticMethodB", "()I", vm().mirrorOf(RESULT_B));
// the instance invokes the overriden form of "staticMethodB" from InterfaceB
testInvokePos(ifaceClass, ref, "staticMethodB", "()I", vm().mirrorOf(RESULT_B));
// the instance fails to invoke the re-defined form of "staticMethodB" from
// InterfaceB because staticMethodB is not inherited by TargetClass
testInvokeNeg(ifaceClass, ref, "staticMethodB", "()I", vm().mirrorOf(RESULT_B),
"Invalid MethodID");
// "staticMethodC" is present only in InterfaceB
testInvokePos(ifaceClass, null, "staticMethodC", "()I", vm().mirrorOf(RESULT_B));
// "staticMethodC" should be reachable from the instance too
testInvokePos(ifaceClass, ref, "staticMethodC", "()I", vm().mirrorOf(RESULT_B));
// "staticMethodC" is not reachable from the instance because staticMethodC
// is not inherited by TargetClass.
testInvokeNeg(ifaceClass, ref, "staticMethodC", "()I", vm().mirrorOf(RESULT_B),
"Invalid MethodID");
}
private void testImplementationClass(ReferenceType targetClass, ObjectReference thisObject) {

View File

@ -1,6 +1,6 @@
/*
* Copyright 2014 Goldman Sachs.
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -32,6 +32,7 @@ public class TestDaemonThreadLauncher {
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-javaagent:DummyAgent.jar", "TestDaemonThread", ".");
OutputAnalyzer analyzer = ProcessTools.executeProcess(pb);
analyzer.shouldNotContain("ASSERTION FAILED");
analyzer.shouldHaveExitValue(0);
}
}
}