src/jdk.jdwp.agent/share/native/libjdwp/invoker.c
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
bug_8160987 Cdiff src/jdk.jdwp.agent/share/native/libjdwp/invoker.c
src/jdk.jdwp.agent/share/native/libjdwp/invoker.c
Print this page
*** 1,7 ****
/*
! * Copyright (c) 1998, 2007, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
--- 1,7 ----
/*
! * 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
*** 341,360 ****
--- 341,422 ----
request->available = JNI_TRUE;
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)
+ {
+ jfieldID clazz_field;
+ jclass containing_class;
+ jclass method_class;
+ jobject method_object;
+ jclass super_clazz;
+
+ /* Get the java/lang/reflect/Method class. */
+ method_class = JNI_FUNC_PTR(env,FindClass)(env, "java/lang/reflect/Method");
+ if (method_class == NULL) {
+ return JVMTI_ERROR_INTERNAL;
+ }
+
+ /* Get the field id for the java/lang/reflect/Method/clazz field. */
+ clazz_field = JNI_FUNC_PTR(env,GetFieldID)(env,
+ method_class,
+ "clazz",
+ "Ljava/lang/Class;");
+ if (clazz_field == NULL) {
+ return JVMTI_ERROR_INTERNAL;
+ }
+
+ /* Get the method object from the method's jmethodID. */
+ method_object = JNI_FUNC_PTR(env,ToReflectedMethod)(env,
+ clazz,
+ method,
+ JNI_TRUE /* isStatic */);
+ if (method_object == NULL) {
+ return JVMTI_ERROR_NONE; /* Bad jmethodID ? This will be handled elsewhere */
+ }
+
+ /* Get the value of the java.lang.reflect.Method.clazz field for method. */
+ containing_class = JNI_FUNC_PTR(env,GetObjectField)(env,
+ method_object,
+ clazz_field);
+ if (containing_class == NULL) {
+ return JVMTI_ERROR_INTERNAL;
+ }
+
+ super_clazz = clazz;
+ while (super_clazz != NULL) {
+ if (JNI_FUNC_PTR(env,IsSameObject)(env, super_clazz, containing_class)) {
+ return JVMTI_ERROR_NONE;
+ }
+ super_clazz = JNI_FUNC_PTR(env,GetSuperclass)(env, super_clazz);
+ }
+ return JVMTI_ERROR_INVALID_METHODID;
+ }
+
jvmtiError
invoker_requestInvoke(jbyte invokeType, jbyte options, jint id,
jthread thread, jclass clazz, jmethodID method,
jobject instance,
jvalue *arguments, jint argumentCount)
{
JNIEnv *env = getEnv();
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) {
error = fillInvokeRequest(env, request, invokeType, options, id,
thread, clazz, method, instance,
src/jdk.jdwp.agent/share/native/libjdwp/invoker.c
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File