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