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); |