< prev index next >

src/share/vm/oops/instanceKlass.cpp

Print this page




2439    if ((super_method->is_protected()) ||
2440        (super_method->is_public())) {
2441      return true;
2442    }
2443    // Package-private methods are not inherited outside of package
2444    assert(super_method->is_package_private(), "must be package private");
2445    return(is_same_class_package(targetclassloader(), targetclassname));
2446 }
2447 
2448 /* defined for now in jvm.cpp, for historical reasons *--
2449 Klass* InstanceKlass::compute_enclosing_class_impl(instanceKlassHandle self,
2450                                                      Symbol*& simple_name_result, TRAPS) {
2451   ...
2452 }
2453 */
2454 
2455 // Only boot and platform class loaders can define classes in "java/" packages.
2456 void InstanceKlass::check_prohibited_package(Symbol* class_name,
2457                                              Handle class_loader,
2458                                              TRAPS) {
2459   ResourceMark rm(THREAD);
2460   if (!class_loader.is_null() &&
2461       !SystemDictionary::is_platform_class_loader(class_loader) &&
2462       class_name != NULL &&
2463       strncmp(class_name->as_C_string(), JAVAPKG, JAVAPKG_LEN) == 0) {


2464     TempNewSymbol pkg_name = InstanceKlass::package_from_name(class_name, CHECK);
2465     assert(pkg_name != NULL, "Error in parsing package name starting with 'java/'");
2466     char* name = pkg_name->as_C_string();
2467     const char* class_loader_name = SystemDictionary::loader_name(class_loader());
2468     StringUtils::replace_no_expand(name, "/", ".");
2469     const char* msg_text1 = "Class loader (instance of): ";
2470     const char* msg_text2 = " tried to load prohibited package name: ";
2471     size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + strlen(name) + 1;
2472     char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len);
2473     jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, name);
2474     THROW_MSG(vmSymbols::java_lang_SecurityException(), message);
2475   }

2476   return;
2477 }
2478 
2479 // tell if two classes have the same enclosing class (at package level)
2480 bool InstanceKlass::is_same_package_member_impl(const InstanceKlass* class1,
2481                                                 const Klass* class2,
2482                                                 TRAPS) {
2483   if (class2 == class1) return true;
2484   if (!class2->is_instance_klass())  return false;
2485 
2486   // must be in same package before we try anything else
2487   if (!class1->is_same_class_package(class2))
2488     return false;
2489 
2490   // As long as there is an outer1.getEnclosingClass,
2491   // shift the search outward.
2492   const InstanceKlass* outer1 = class1;
2493   for (;;) {
2494     // As we walk along, look for equalities between outer1 and class2.
2495     // Eventually, the walks will terminate as outer1 stops




2439    if ((super_method->is_protected()) ||
2440        (super_method->is_public())) {
2441      return true;
2442    }
2443    // Package-private methods are not inherited outside of package
2444    assert(super_method->is_package_private(), "must be package private");
2445    return(is_same_class_package(targetclassloader(), targetclassname));
2446 }
2447 
2448 /* defined for now in jvm.cpp, for historical reasons *--
2449 Klass* InstanceKlass::compute_enclosing_class_impl(instanceKlassHandle self,
2450                                                      Symbol*& simple_name_result, TRAPS) {
2451   ...
2452 }
2453 */
2454 
2455 // Only boot and platform class loaders can define classes in "java/" packages.
2456 void InstanceKlass::check_prohibited_package(Symbol* class_name,
2457                                              Handle class_loader,
2458                                              TRAPS) {

2459   if (!class_loader.is_null() &&
2460       !SystemDictionary::is_platform_class_loader(class_loader) &&
2461       class_name != NULL) {
2462     ResourceMark rm(THREAD);
2463     char* name = class_name->as_C_string();
2464     if (strncmp(name, JAVAPKG, JAVAPKG_LEN) == 0 && name[JAVAPKG_LEN] == '/') {
2465       TempNewSymbol pkg_name = InstanceKlass::package_from_name(class_name, CHECK);
2466       assert(pkg_name != NULL, "Error in parsing package name starting with 'java/'");
2467       name = pkg_name->as_C_string();
2468       const char* class_loader_name = SystemDictionary::loader_name(class_loader());
2469       StringUtils::replace_no_expand(name, "/", ".");
2470       const char* msg_text1 = "Class loader (instance of): ";
2471       const char* msg_text2 = " tried to load prohibited package name: ";
2472       size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + strlen(name) + 1;
2473       char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len);
2474       jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, name);
2475       THROW_MSG(vmSymbols::java_lang_SecurityException(), message);
2476     }
2477   }
2478   return;
2479 }
2480 
2481 // tell if two classes have the same enclosing class (at package level)
2482 bool InstanceKlass::is_same_package_member_impl(const InstanceKlass* class1,
2483                                                 const Klass* class2,
2484                                                 TRAPS) {
2485   if (class2 == class1) return true;
2486   if (!class2->is_instance_klass())  return false;
2487 
2488   // must be in same package before we try anything else
2489   if (!class1->is_same_class_package(class2))
2490     return false;
2491 
2492   // As long as there is an outer1.getEnclosingClass,
2493   // shift the search outward.
2494   const InstanceKlass* outer1 = class1;
2495   for (;;) {
2496     // As we walk along, look for equalities between outer1 and class2.
2497     // Eventually, the walks will terminate as outer1 stops


< prev index next >