hotspot/src/share/vm/oops/instanceKlass.cpp
changeset 44326 6c59cca7ff07
parent 43929 9a572e758c9b
child 44993 f61bcd80ec1f
child 46369 3bf4544bec14
equal deleted inserted replaced
44204:8490172c1777 44326:6c59cca7ff07
  2454 
  2454 
  2455 // Only boot and platform class loaders can define classes in "java/" packages.
  2455 // Only boot and platform class loaders can define classes in "java/" packages.
  2456 void InstanceKlass::check_prohibited_package(Symbol* class_name,
  2456 void InstanceKlass::check_prohibited_package(Symbol* class_name,
  2457                                              Handle class_loader,
  2457                                              Handle class_loader,
  2458                                              TRAPS) {
  2458                                              TRAPS) {
  2459   ResourceMark rm(THREAD);
       
  2460   if (!class_loader.is_null() &&
  2459   if (!class_loader.is_null() &&
  2461       !SystemDictionary::is_platform_class_loader(class_loader) &&
  2460       !SystemDictionary::is_platform_class_loader(class_loader) &&
  2462       class_name != NULL &&
  2461       class_name != NULL) {
  2463       strncmp(class_name->as_C_string(), JAVAPKG, JAVAPKG_LEN) == 0) {
  2462     ResourceMark rm(THREAD);
  2464     TempNewSymbol pkg_name = InstanceKlass::package_from_name(class_name, CHECK);
  2463     char* name = class_name->as_C_string();
  2465     assert(pkg_name != NULL, "Error in parsing package name starting with 'java/'");
  2464     if (strncmp(name, JAVAPKG, JAVAPKG_LEN) == 0 && name[JAVAPKG_LEN] == '/') {
  2466     char* name = pkg_name->as_C_string();
  2465       TempNewSymbol pkg_name = InstanceKlass::package_from_name(class_name, CHECK);
  2467     const char* class_loader_name = SystemDictionary::loader_name(class_loader());
  2466       assert(pkg_name != NULL, "Error in parsing package name starting with 'java/'");
  2468     StringUtils::replace_no_expand(name, "/", ".");
  2467       name = pkg_name->as_C_string();
  2469     const char* msg_text1 = "Class loader (instance of): ";
  2468       const char* class_loader_name = SystemDictionary::loader_name(class_loader());
  2470     const char* msg_text2 = " tried to load prohibited package name: ";
  2469       StringUtils::replace_no_expand(name, "/", ".");
  2471     size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + strlen(name) + 1;
  2470       const char* msg_text1 = "Class loader (instance of): ";
  2472     char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len);
  2471       const char* msg_text2 = " tried to load prohibited package name: ";
  2473     jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, name);
  2472       size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + strlen(name) + 1;
  2474     THROW_MSG(vmSymbols::java_lang_SecurityException(), message);
  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     }
  2475   }
  2477   }
  2476   return;
  2478   return;
  2477 }
  2479 }
  2478 
  2480 
  2479 // tell if two classes have the same enclosing class (at package level)
  2481 // tell if two classes have the same enclosing class (at package level)