src/hotspot/share/oops/instanceKlass.cpp
changeset 50634 c349d409262a
parent 50633 b8055b38b252
child 50735 2f2af62dfac7
equal deleted inserted replaced
50633:b8055b38b252 50634:c349d409262a
  2326 }
  2326 }
  2327 
  2327 
  2328 void InstanceKlass::set_package(ClassLoaderData* loader_data, TRAPS) {
  2328 void InstanceKlass::set_package(ClassLoaderData* loader_data, TRAPS) {
  2329 
  2329 
  2330   // ensure java/ packages only loaded by boot or platform builtin loaders
  2330   // ensure java/ packages only loaded by boot or platform builtin loaders
  2331   Handle class_loader(THREAD, loader_data->class_loader());
  2331   check_prohibited_package(name(), loader_data, CHECK);
  2332   check_prohibited_package(name(), class_loader, CHECK);
       
  2333 
  2332 
  2334   TempNewSymbol pkg_name = package_from_name(name(), CHECK);
  2333   TempNewSymbol pkg_name = package_from_name(name(), CHECK);
  2335 
  2334 
  2336   if (pkg_name != NULL && loader_data != NULL) {
  2335   if (pkg_name != NULL && loader_data != NULL) {
  2337 
  2336 
  2357                                                          loader_data->unnamed_module());
  2356                                                          loader_data->unnamed_module());
  2358       }
  2357       }
  2359 
  2358 
  2360       // A package should have been successfully created
  2359       // A package should have been successfully created
  2361       assert(_package_entry != NULL, "Package entry for class %s not found, loader %s",
  2360       assert(_package_entry != NULL, "Package entry for class %s not found, loader %s",
  2362              name()->as_C_string(), loader_data->loader_name());
  2361              name()->as_C_string(), loader_data->loader_name_and_id());
  2363     }
  2362     }
  2364 
  2363 
  2365     if (log_is_enabled(Debug, module)) {
  2364     if (log_is_enabled(Debug, module)) {
  2366       ResourceMark rm;
  2365       ResourceMark rm;
  2367       ModuleEntry* m = _package_entry->module();
  2366       ModuleEntry* m = _package_entry->module();
  2368       log_trace(module)("Setting package: class: %s, package: %s, loader: %s, module: %s",
  2367       log_trace(module)("Setting package: class: %s, package: %s, loader: %s, module: %s",
  2369                         external_name(),
  2368                         external_name(),
  2370                         pkg_name->as_C_string(),
  2369                         pkg_name->as_C_string(),
  2371                         loader_data->loader_name(),
  2370                         loader_data->loader_name_and_id(),
  2372                         (m->is_named() ? m->name()->as_C_string() : UNNAMED_MODULE));
  2371                         (m->is_named() ? m->name()->as_C_string() : UNNAMED_MODULE));
  2373     }
  2372     }
  2374   } else {
  2373   } else {
  2375     ResourceMark rm;
  2374     ResourceMark rm;
  2376     log_trace(module)("Setting package: class: %s, package: unnamed, loader: %s, module: %s",
  2375     log_trace(module)("Setting package: class: %s, package: unnamed, loader: %s, module: %s",
  2377                       external_name(),
  2376                       external_name(),
  2378                       (loader_data != NULL) ? loader_data->loader_name() : "NULL",
  2377                       (loader_data != NULL) ? loader_data->loader_name_and_id() : "NULL",
  2379                       UNNAMED_MODULE);
  2378                       UNNAMED_MODULE);
  2380   }
  2379   }
  2381 }
  2380 }
  2382 
  2381 
  2383 
  2382 
  2469    return(is_same_class_package(targetclassloader(), targetclassname));
  2468    return(is_same_class_package(targetclassloader(), targetclassname));
  2470 }
  2469 }
  2471 
  2470 
  2472 // Only boot and platform class loaders can define classes in "java/" packages.
  2471 // Only boot and platform class loaders can define classes in "java/" packages.
  2473 void InstanceKlass::check_prohibited_package(Symbol* class_name,
  2472 void InstanceKlass::check_prohibited_package(Symbol* class_name,
  2474                                              Handle class_loader,
  2473                                              ClassLoaderData* loader_data,
  2475                                              TRAPS) {
  2474                                              TRAPS) {
  2476   if (!class_loader.is_null() &&
  2475   if (!loader_data->is_boot_class_loader_data() &&
  2477       !SystemDictionary::is_platform_class_loader(class_loader()) &&
  2476       !loader_data->is_platform_class_loader_data() &&
  2478       class_name != NULL) {
  2477       class_name != NULL) {
  2479     ResourceMark rm(THREAD);
  2478     ResourceMark rm(THREAD);
  2480     char* name = class_name->as_C_string();
  2479     char* name = class_name->as_C_string();
  2481     if (strncmp(name, JAVAPKG, JAVAPKG_LEN) == 0 && name[JAVAPKG_LEN] == '/') {
  2480     if (strncmp(name, JAVAPKG, JAVAPKG_LEN) == 0 && name[JAVAPKG_LEN] == '/') {
  2482       TempNewSymbol pkg_name = InstanceKlass::package_from_name(class_name, CHECK);
  2481       TempNewSymbol pkg_name = InstanceKlass::package_from_name(class_name, CHECK);
  2483       assert(pkg_name != NULL, "Error in parsing package name starting with 'java/'");
  2482       assert(pkg_name != NULL, "Error in parsing package name starting with 'java/'");
  2484       name = pkg_name->as_C_string();
  2483       name = pkg_name->as_C_string();
  2485       const char* class_loader_name = SystemDictionary::loader_name(class_loader());
  2484       const char* class_loader_name = loader_data->loader_name_and_id();
  2486       StringUtils::replace_no_expand(name, "/", ".");
  2485       StringUtils::replace_no_expand(name, "/", ".");
  2487       const char* msg_text1 = "Class loader (instance of): ";
  2486       const char* msg_text1 = "Class loader (instance of): ";
  2488       const char* msg_text2 = " tried to load prohibited package name: ";
  2487       const char* msg_text2 = " tried to load prohibited package name: ";
  2489       size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + strlen(name) + 1;
  2488       size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + strlen(name) + 1;
  2490       char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len);
  2489       char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len);