# HG changeset patch # User dlong # Date 1474914082 14400 # Node ID 46913f218c6be410283725cf3eaf6d77f1a8ffbc # Parent 95fce77ec1b6665b7c0fc7185cf1fea1be4ed381# Parent 241663e51880b14cfa3252b8610f7c98af5b0504 Merge diff -r 95fce77ec1b6 -r 46913f218c6b jdk/make/lib/CoreLibraries.gmk --- a/jdk/make/lib/CoreLibraries.gmk Tue Sep 20 16:34:47 2016 -0400 +++ b/jdk/make/lib/CoreLibraries.gmk Mon Sep 26 14:21:22 2016 -0400 @@ -218,7 +218,7 @@ $(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), \ diff -r 95fce77ec1b6 -r 46913f218c6b jdk/make/mapfiles/libzip/mapfile-vers --- a/jdk/make/mapfiles/libzip/mapfile-vers Tue Sep 20 16:34:47 2016 -0400 +++ b/jdk/make/mapfiles/libzip/mapfile-vers Mon Sep 26 14:21:22 2016 -0400 @@ -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 @@ Java_java_util_zip_Inflater_setDictionary; ZIP_Close; ZIP_CRC32; + ZIP_FreeEntry; ZIP_FindEntry; ZIP_GetEntry; ZIP_GetNextEntry; diff -r 95fce77ec1b6 -r 46913f218c6b jdk/src/java.base/share/native/libzip/zip_util.c --- a/jdk/src/java.base/share/native/libzip/zip_util.c Tue Sep 20 16:34:47 2016 -0400 +++ b/jdk/src/java.base/share/native/libzip/zip_util.c Mon Sep 26 14:21:22 2016 -0400 @@ -1094,7 +1094,7 @@ * jzentry for each zip. This optimizes a common access pattern. */ -void +void JNICALL ZIP_FreeEntry(jzfile *jz, jzentry *ze) { jzentry *last; diff -r 95fce77ec1b6 -r 46913f218c6b jdk/src/java.base/share/native/libzip/zip_util.h --- a/jdk/src/java.base/share/native/libzip/zip_util.h Tue Sep 20 16:34:47 2016 -0400 +++ b/jdk/src/java.base/share/native/libzip/zip_util.h Mon Sep 26 14:21:22 2016 -0400 @@ -270,7 +270,8 @@ 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); diff -r 95fce77ec1b6 -r 46913f218c6b jdk/src/java.instrument/share/native/libinstrument/JPLISAgent.c --- a/jdk/src/java.instrument/share/native/libinstrument/JPLISAgent.c Tue Sep 20 16:34:47 2016 -0400 +++ b/jdk/src/java.instrument/share/native/libinstrument/JPLISAgent.c Mon Sep 26 14:21:22 2016 -0400 @@ -790,9 +790,10 @@ 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; } diff -r 95fce77ec1b6 -r 46913f218c6b jdk/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c --- a/jdk/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c Tue Sep 20 16:34:47 2016 -0400 +++ b/jdk/src/jdk.jdwp.agent/share/native/libjdwp/invoker.c Mon Sep 26 14:21:22 2016 -0400 @@ -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 @@ 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 @@ 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) { diff -r 95fce77ec1b6 -r 46913f218c6b jdk/test/ProblemList.txt --- a/jdk/test/ProblemList.txt Tue Sep 20 16:34:47 2016 -0400 +++ b/jdk/test/ProblemList.txt Mon Sep 26 14:21:22 2016 -0400 @@ -134,8 +134,6 @@ 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 diff -r 95fce77ec1b6 -r 46913f218c6b jdk/test/com/sun/jdi/InterfaceMethodsTest.java --- a/jdk/test/com/sun/jdi/InterfaceMethodsTest.java Tue Sep 20 16:34:47 2016 -0400 +++ b/jdk/test/com/sun/jdi/InterfaceMethodsTest.java Mon Sep 26 14:21:22 2016 -0400 @@ -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 @@ // 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 @@ 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) { diff -r 95fce77ec1b6 -r 46913f218c6b jdk/test/java/lang/instrument/DaemonThread/TestDaemonThreadLauncher.java --- a/jdk/test/java/lang/instrument/DaemonThread/TestDaemonThreadLauncher.java Tue Sep 20 16:34:47 2016 -0400 +++ b/jdk/test/java/lang/instrument/DaemonThread/TestDaemonThreadLauncher.java Mon Sep 26 14:21:22 2016 -0400 @@ -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 @@ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-javaagent:DummyAgent.jar", "TestDaemonThread", "."); OutputAnalyzer analyzer = ProcessTools.executeProcess(pb); analyzer.shouldNotContain("ASSERTION FAILED"); + analyzer.shouldHaveExitValue(0); } } }