146 TempNewSymbol privileged_action = SymbolTable::new_symbol("java/security/PrivilegedAction", CHECK);
147 Klass* privileged_action_klass = SystemDictionary::resolve_or_fail(privileged_action, false, CHECK);
148
149 Method* last_caller = NULL;
150
151 while (!vfst.at_end()) {
152 Method* m = vfst.method();
153 if (!vfst.method()->method_holder()->is_subclass_of(SystemDictionary::ClassLoader_klass())&&
154 !vfst.method()->method_holder()->is_subclass_of(access_controller_klass) &&
155 !vfst.method()->method_holder()->is_subclass_of(privileged_action_klass)) {
156 break;
157 }
158 last_caller = m;
159 vfst.next();
160 }
161 // if this is called from Class.forName0 and that is called from Class.forName,
162 // then print the caller of Class.forName. If this is Class.loadClass, then print
163 // that caller, otherwise keep quiet since this should be picked up elsewhere.
164 bool found_it = false;
165 if (!vfst.at_end() &&
166 vfst.method()->method_holder()->name() == vmSymbols::java_lang_Class() &&
167 vfst.method()->name() == vmSymbols::forName0_name()) {
168 vfst.next();
169 if (!vfst.at_end() &&
170 vfst.method()->method_holder()->name() == vmSymbols::java_lang_Class() &&
171 vfst.method()->name() == vmSymbols::forName_name()) {
172 vfst.next();
173 found_it = true;
174 }
175 } else if (last_caller != NULL &&
176 last_caller->method_holder()->name() ==
177 vmSymbols::java_lang_ClassLoader() &&
178 (last_caller->name() == vmSymbols::loadClassInternal_name() ||
179 last_caller->name() == vmSymbols::loadClass_name())) {
180 found_it = true;
181 } else if (!vfst.at_end()) {
182 if (vfst.method()->is_native()) {
183 // JNI call
184 found_it = true;
185 }
186 }
187 if (found_it && !vfst.at_end()) {
188 // found the caller
189 caller = vfst.method()->method_holder();
190 line_number = vfst.method()->line_number_from_bci(vfst.bci());
191 if (line_number == -1) {
192 // show method name if it's a native method
193 trace = vfst.method()->name_and_sig_as_C_string();
194 }
195 Symbol* s = caller->source_file_name();
196 if (s != NULL) {
197 source_file = s->as_C_string();
198 }
199 }
2359 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2360 return method->size_of_parameters();
2361 JVM_END
2362
2363
2364 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index))
2365 JVMWrapper("JVM_GetMethodIxMaxStack");
2366 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2367 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2368 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2369 return method->verifier_max_stack();
2370 JVM_END
2371
2372
2373 JVM_QUICK_ENTRY(jboolean, JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index))
2374 JVMWrapper("JVM_IsConstructorIx");
2375 ResourceMark rm(THREAD);
2376 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2377 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2378 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2379 return method->name() == vmSymbols::object_initializer_name();
2380 JVM_END
2381
2382
2383 JVM_QUICK_ENTRY(jboolean, JVM_IsVMGeneratedMethodIx(JNIEnv *env, jclass cls, int method_index))
2384 JVMWrapper("JVM_IsVMGeneratedMethodIx");
2385 ResourceMark rm(THREAD);
2386 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2387 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2388 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2389 return method->is_overpass();
2390 JVM_END
2391
2392 JVM_ENTRY(const char*, JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index))
2393 JVMWrapper("JVM_GetMethodIxIxUTF");
2394 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2395 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2396 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2397 return method->name()->as_utf8();
2398 JVM_END
2399
2527 fatal("JVM_GetCPMethodClassNameUTF: illegal constant");
2528 }
2529 ShouldNotReachHere();
2530 return NULL;
2531 JVM_END
2532
2533
2534 JVM_ENTRY(jint, JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls))
2535 JVMWrapper("JVM_GetCPFieldModifiers");
2536 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2537 Klass* k_called = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(called_cls));
2538 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2539 k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread);
2540 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2541 ConstantPool* cp_called = InstanceKlass::cast(k_called)->constants();
2542 switch (cp->tag_at(cp_index).value()) {
2543 case JVM_CONSTANT_Fieldref: {
2544 Symbol* name = cp->uncached_name_ref_at(cp_index);
2545 Symbol* signature = cp->uncached_signature_ref_at(cp_index);
2546 for (JavaFieldStream fs(k_called); !fs.done(); fs.next()) {
2547 if (fs.name() == name && fs.signature() == signature) {
2548 return fs.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS;
2549 }
2550 }
2551 return -1;
2552 }
2553 default:
2554 fatal("JVM_GetCPFieldModifiers: illegal constant");
2555 }
2556 ShouldNotReachHere();
2557 return 0;
2558 JVM_END
2559
2560
2561 JVM_QUICK_ENTRY(jint, JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls))
2562 JVMWrapper("JVM_GetCPMethodModifiers");
2563 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2564 Klass* k_called = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(called_cls));
2565 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2566 k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread);
2567 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2568 switch (cp->tag_at(cp_index).value()) {
2569 case JVM_CONSTANT_Methodref:
2570 case JVM_CONSTANT_InterfaceMethodref: {
2571 Symbol* name = cp->uncached_name_ref_at(cp_index);
2572 Symbol* signature = cp->uncached_signature_ref_at(cp_index);
2573 Array<Method*>* methods = InstanceKlass::cast(k_called)->methods();
2574 int methods_count = methods->length();
2575 for (int i = 0; i < methods_count; i++) {
2576 Method* method = methods->at(i);
2577 if (method->name() == name && method->signature() == signature) {
2578 return method->access_flags().as_int() & JVM_RECOGNIZED_METHOD_MODIFIERS;
2579 }
2580 }
2581 return -1;
2582 }
2583 default:
2584 fatal("JVM_GetCPMethodModifiers: illegal constant");
2585 }
2586 ShouldNotReachHere();
2587 return 0;
2588 JVM_END
2589
2590
2591 // Misc //////////////////////////////////////////////////////////////////////////////////////////////
2592
2593 JVM_LEAF(void, JVM_ReleaseUTF(const char *utf))
2594 // So long as UTF8::convert_to_utf8 returns resource strings, we don't have to do anything
2595 JVM_END
2596
2597
3147 oop loader = holder->class_loader();
3148 if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) {
3149 return JNIHandles::make_local(env, loader);
3150 }
3151 }
3152 }
3153 return NULL;
3154 JVM_END
3155
3156
3157 JVM_ENTRY(jobjectArray, JVM_GetClassContext(JNIEnv *env))
3158 JVMWrapper("JVM_GetClassContext");
3159 ResourceMark rm(THREAD);
3160 JvmtiVMObjectAllocEventCollector oam;
3161 vframeStream vfst(thread);
3162
3163 if (SystemDictionary::reflect_CallerSensitive_klass() != NULL) {
3164 // This must only be called from SecurityManager.getClassContext
3165 Method* m = vfst.method();
3166 if (!(m->method_holder() == SystemDictionary::SecurityManager_klass() &&
3167 m->name() == vmSymbols::getClassContext_name() &&
3168 m->signature() == vmSymbols::void_class_array_signature())) {
3169 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "JVM_GetClassContext must only be called from SecurityManager.getClassContext");
3170 }
3171 }
3172
3173 // Collect method holders
3174 GrowableArray<KlassHandle>* klass_array = new GrowableArray<KlassHandle>();
3175 for (; !vfst.at_end(); vfst.security_next()) {
3176 Method* m = vfst.method();
3177 // Native frames are not returned
3178 if (!m->is_ignored_by_security_stack_walk() && !m->is_native()) {
3179 Klass* holder = m->method_holder();
3180 assert(holder->is_klass(), "just checking");
3181 klass_array->append(holder);
3182 }
3183 }
3184
3185 // Create result array of type [Ljava/lang/Class;
3186 objArrayOop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), klass_array->length(), CHECK_NULL);
3187 // Fill in mirrors corresponding to method holders
3188 for (int i = 0; i < klass_array->length(); i++) {
3194
3195
3196 JVM_ENTRY(jint, JVM_ClassDepth(JNIEnv *env, jstring name))
3197 JVMWrapper("JVM_ClassDepth");
3198 ResourceMark rm(THREAD);
3199 Handle h_name (THREAD, JNIHandles::resolve_non_null(name));
3200 Handle class_name_str = java_lang_String::internalize_classname(h_name, CHECK_0);
3201
3202 const char* str = java_lang_String::as_utf8_string(class_name_str());
3203 TempNewSymbol class_name_sym = SymbolTable::probe(str, (int)strlen(str));
3204 if (class_name_sym == NULL) {
3205 return -1;
3206 }
3207
3208 int depth = 0;
3209
3210 for(vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
3211 if (!vfst.method()->is_native()) {
3212 InstanceKlass* holder = vfst.method()->method_holder();
3213 assert(holder->is_klass(), "just checking");
3214 if (holder->name() == class_name_sym) {
3215 return depth;
3216 }
3217 depth++;
3218 }
3219 }
3220 return -1;
3221 JVM_END
3222
3223
3224 JVM_ENTRY(jint, JVM_ClassLoaderDepth(JNIEnv *env))
3225 JVMWrapper("JVM_ClassLoaderDepth");
3226 ResourceMark rm(THREAD);
3227 int depth = 0;
3228 for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
3229 // if a method in a class in a trusted loader is in a doPrivileged, return -1
3230 bool trusted = is_trusted_frame(thread, &vfst);
3231 if (trusted) return -1;
3232
3233 Method* m = vfst.method();
3234 if (!m->is_native()) {
|
146 TempNewSymbol privileged_action = SymbolTable::new_symbol("java/security/PrivilegedAction", CHECK);
147 Klass* privileged_action_klass = SystemDictionary::resolve_or_fail(privileged_action, false, CHECK);
148
149 Method* last_caller = NULL;
150
151 while (!vfst.at_end()) {
152 Method* m = vfst.method();
153 if (!vfst.method()->method_holder()->is_subclass_of(SystemDictionary::ClassLoader_klass())&&
154 !vfst.method()->method_holder()->is_subclass_of(access_controller_klass) &&
155 !vfst.method()->method_holder()->is_subclass_of(privileged_action_klass)) {
156 break;
157 }
158 last_caller = m;
159 vfst.next();
160 }
161 // if this is called from Class.forName0 and that is called from Class.forName,
162 // then print the caller of Class.forName. If this is Class.loadClass, then print
163 // that caller, otherwise keep quiet since this should be picked up elsewhere.
164 bool found_it = false;
165 if (!vfst.at_end() &&
166 vfst.method()->method_holder()->name()->equals(vmSymbols::java_lang_Class()) &&
167 vfst.method()->name()->equals(vmSymbols::forName0_name())) {
168 vfst.next();
169 if (!vfst.at_end() &&
170 vfst.method()->method_holder()->name()->equals(vmSymbols::java_lang_Class()) &&
171 vfst.method()->name()->equals(vmSymbols::forName_name())) {
172 vfst.next();
173 found_it = true;
174 }
175 } else if (last_caller != NULL &&
176 last_caller->method_holder()->name()->equals(
177 vmSymbols::java_lang_ClassLoader()) &&
178 (last_caller->name()->equals(vmSymbols::loadClassInternal_name()) ||
179 last_caller->name()->equals(vmSymbols::loadClass_name()))) {
180 found_it = true;
181 } else if (!vfst.at_end()) {
182 if (vfst.method()->is_native()) {
183 // JNI call
184 found_it = true;
185 }
186 }
187 if (found_it && !vfst.at_end()) {
188 // found the caller
189 caller = vfst.method()->method_holder();
190 line_number = vfst.method()->line_number_from_bci(vfst.bci());
191 if (line_number == -1) {
192 // show method name if it's a native method
193 trace = vfst.method()->name_and_sig_as_C_string();
194 }
195 Symbol* s = caller->source_file_name();
196 if (s != NULL) {
197 source_file = s->as_C_string();
198 }
199 }
2359 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2360 return method->size_of_parameters();
2361 JVM_END
2362
2363
2364 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index))
2365 JVMWrapper("JVM_GetMethodIxMaxStack");
2366 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2367 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2368 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2369 return method->verifier_max_stack();
2370 JVM_END
2371
2372
2373 JVM_QUICK_ENTRY(jboolean, JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index))
2374 JVMWrapper("JVM_IsConstructorIx");
2375 ResourceMark rm(THREAD);
2376 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2377 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2378 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2379 return method->name()->equals(vmSymbols::object_initializer_name());
2380 JVM_END
2381
2382
2383 JVM_QUICK_ENTRY(jboolean, JVM_IsVMGeneratedMethodIx(JNIEnv *env, jclass cls, int method_index))
2384 JVMWrapper("JVM_IsVMGeneratedMethodIx");
2385 ResourceMark rm(THREAD);
2386 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2387 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2388 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2389 return method->is_overpass();
2390 JVM_END
2391
2392 JVM_ENTRY(const char*, JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index))
2393 JVMWrapper("JVM_GetMethodIxIxUTF");
2394 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2395 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2396 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
2397 return method->name()->as_utf8();
2398 JVM_END
2399
2527 fatal("JVM_GetCPMethodClassNameUTF: illegal constant");
2528 }
2529 ShouldNotReachHere();
2530 return NULL;
2531 JVM_END
2532
2533
2534 JVM_ENTRY(jint, JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls))
2535 JVMWrapper("JVM_GetCPFieldModifiers");
2536 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2537 Klass* k_called = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(called_cls));
2538 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2539 k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread);
2540 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2541 ConstantPool* cp_called = InstanceKlass::cast(k_called)->constants();
2542 switch (cp->tag_at(cp_index).value()) {
2543 case JVM_CONSTANT_Fieldref: {
2544 Symbol* name = cp->uncached_name_ref_at(cp_index);
2545 Symbol* signature = cp->uncached_signature_ref_at(cp_index);
2546 for (JavaFieldStream fs(k_called); !fs.done(); fs.next()) {
2547 if (fs.name()->equals(name) && fs.signature()->equals(signature)) {
2548 return fs.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS;
2549 }
2550 }
2551 return -1;
2552 }
2553 default:
2554 fatal("JVM_GetCPFieldModifiers: illegal constant");
2555 }
2556 ShouldNotReachHere();
2557 return 0;
2558 JVM_END
2559
2560
2561 JVM_QUICK_ENTRY(jint, JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls))
2562 JVMWrapper("JVM_GetCPMethodModifiers");
2563 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
2564 Klass* k_called = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(called_cls));
2565 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2566 k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread);
2567 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2568 switch (cp->tag_at(cp_index).value()) {
2569 case JVM_CONSTANT_Methodref:
2570 case JVM_CONSTANT_InterfaceMethodref: {
2571 Symbol* name = cp->uncached_name_ref_at(cp_index);
2572 Symbol* signature = cp->uncached_signature_ref_at(cp_index);
2573 Array<Method*>* methods = InstanceKlass::cast(k_called)->methods();
2574 int methods_count = methods->length();
2575 for (int i = 0; i < methods_count; i++) {
2576 Method* method = methods->at(i);
2577 if (method->name()->equals(name) && method->signature()->equals(signature)) {
2578 return method->access_flags().as_int() & JVM_RECOGNIZED_METHOD_MODIFIERS;
2579 }
2580 }
2581 return -1;
2582 }
2583 default:
2584 fatal("JVM_GetCPMethodModifiers: illegal constant");
2585 }
2586 ShouldNotReachHere();
2587 return 0;
2588 JVM_END
2589
2590
2591 // Misc //////////////////////////////////////////////////////////////////////////////////////////////
2592
2593 JVM_LEAF(void, JVM_ReleaseUTF(const char *utf))
2594 // So long as UTF8::convert_to_utf8 returns resource strings, we don't have to do anything
2595 JVM_END
2596
2597
3147 oop loader = holder->class_loader();
3148 if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) {
3149 return JNIHandles::make_local(env, loader);
3150 }
3151 }
3152 }
3153 return NULL;
3154 JVM_END
3155
3156
3157 JVM_ENTRY(jobjectArray, JVM_GetClassContext(JNIEnv *env))
3158 JVMWrapper("JVM_GetClassContext");
3159 ResourceMark rm(THREAD);
3160 JvmtiVMObjectAllocEventCollector oam;
3161 vframeStream vfst(thread);
3162
3163 if (SystemDictionary::reflect_CallerSensitive_klass() != NULL) {
3164 // This must only be called from SecurityManager.getClassContext
3165 Method* m = vfst.method();
3166 if (!(m->method_holder() == SystemDictionary::SecurityManager_klass() &&
3167 m->name()->equals(vmSymbols::getClassContext_name()) &&
3168 m->signature()->equals(vmSymbols::void_class_array_signature()))) {
3169 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "JVM_GetClassContext must only be called from SecurityManager.getClassContext");
3170 }
3171 }
3172
3173 // Collect method holders
3174 GrowableArray<KlassHandle>* klass_array = new GrowableArray<KlassHandle>();
3175 for (; !vfst.at_end(); vfst.security_next()) {
3176 Method* m = vfst.method();
3177 // Native frames are not returned
3178 if (!m->is_ignored_by_security_stack_walk() && !m->is_native()) {
3179 Klass* holder = m->method_holder();
3180 assert(holder->is_klass(), "just checking");
3181 klass_array->append(holder);
3182 }
3183 }
3184
3185 // Create result array of type [Ljava/lang/Class;
3186 objArrayOop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), klass_array->length(), CHECK_NULL);
3187 // Fill in mirrors corresponding to method holders
3188 for (int i = 0; i < klass_array->length(); i++) {
3194
3195
3196 JVM_ENTRY(jint, JVM_ClassDepth(JNIEnv *env, jstring name))
3197 JVMWrapper("JVM_ClassDepth");
3198 ResourceMark rm(THREAD);
3199 Handle h_name (THREAD, JNIHandles::resolve_non_null(name));
3200 Handle class_name_str = java_lang_String::internalize_classname(h_name, CHECK_0);
3201
3202 const char* str = java_lang_String::as_utf8_string(class_name_str());
3203 TempNewSymbol class_name_sym = SymbolTable::probe(str, (int)strlen(str));
3204 if (class_name_sym == NULL) {
3205 return -1;
3206 }
3207
3208 int depth = 0;
3209
3210 for(vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
3211 if (!vfst.method()->is_native()) {
3212 InstanceKlass* holder = vfst.method()->method_holder();
3213 assert(holder->is_klass(), "just checking");
3214 if (holder->name()->equals(class_name_sym)) {
3215 return depth;
3216 }
3217 depth++;
3218 }
3219 }
3220 return -1;
3221 JVM_END
3222
3223
3224 JVM_ENTRY(jint, JVM_ClassLoaderDepth(JNIEnv *env))
3225 JVMWrapper("JVM_ClassLoaderDepth");
3226 ResourceMark rm(THREAD);
3227 int depth = 0;
3228 for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
3229 // if a method in a class in a trusted loader is in a doPrivileged, return -1
3230 bool trusted = is_trusted_frame(thread, &vfst);
3231 if (trusted) return -1;
3232
3233 Method* m = vfst.method();
3234 if (!m->is_native()) {
|