65 #include "runtime/thread.inline.hpp" |
65 #include "runtime/thread.inline.hpp" |
66 #include "services/classLoadingService.hpp" |
66 #include "services/classLoadingService.hpp" |
67 #include "services/threadService.hpp" |
67 #include "services/threadService.hpp" |
68 #include "utilities/dtrace.hpp" |
68 #include "utilities/dtrace.hpp" |
69 #include "utilities/macros.hpp" |
69 #include "utilities/macros.hpp" |
|
70 #include "utilities/stringUtils.hpp" |
70 #include "logging/log.hpp" |
71 #include "logging/log.hpp" |
71 #ifdef COMPILER1 |
72 #ifdef COMPILER1 |
72 #include "c1/c1_Compiler.hpp" |
73 #include "c1/c1_Compiler.hpp" |
73 #endif |
74 #endif |
74 |
75 |
2223 } |
2224 } |
2224 return host->class_loader_data()->modules()->unnamed_module(); |
2225 return host->class_loader_data()->modules()->unnamed_module(); |
2225 } |
2226 } |
2226 |
2227 |
2227 void InstanceKlass::set_package(ClassLoaderData* loader_data, TRAPS) { |
2228 void InstanceKlass::set_package(ClassLoaderData* loader_data, TRAPS) { |
|
2229 |
|
2230 // ensure java/ packages only loaded by boot or platform builtin loaders |
|
2231 check_prohibited_package(name(), loader_data->class_loader(), CHECK); |
|
2232 |
2228 TempNewSymbol pkg_name = package_from_name(name(), CHECK); |
2233 TempNewSymbol pkg_name = package_from_name(name(), CHECK); |
2229 |
2234 |
2230 if (pkg_name != NULL && loader_data != NULL) { |
2235 if (pkg_name != NULL && loader_data != NULL) { |
|
2236 |
2231 // Find in class loader's package entry table. |
2237 // Find in class loader's package entry table. |
2232 _package_entry = loader_data->packages()->lookup_only(pkg_name); |
2238 _package_entry = loader_data->packages()->lookup_only(pkg_name); |
2233 |
2239 |
2234 // If the package name is not found in the loader's package |
2240 // If the package name is not found in the loader's package |
2235 // entry table, it is an indication that the package has not |
2241 // entry table, it is an indication that the package has not |
2373 Klass* InstanceKlass::compute_enclosing_class_impl(instanceKlassHandle self, |
2379 Klass* InstanceKlass::compute_enclosing_class_impl(instanceKlassHandle self, |
2374 Symbol*& simple_name_result, TRAPS) { |
2380 Symbol*& simple_name_result, TRAPS) { |
2375 ... |
2381 ... |
2376 } |
2382 } |
2377 */ |
2383 */ |
|
2384 |
|
2385 // Only boot and platform class loaders can define classes in "java/" packages. |
|
2386 void InstanceKlass::check_prohibited_package(Symbol* class_name, |
|
2387 Handle class_loader, |
|
2388 TRAPS) { |
|
2389 const char* javapkg = "java/"; |
|
2390 ResourceMark rm(THREAD); |
|
2391 if (!class_loader.is_null() && |
|
2392 !SystemDictionary::is_platform_class_loader(class_loader) && |
|
2393 class_name != NULL && |
|
2394 strncmp(class_name->as_C_string(), javapkg, strlen(javapkg)) == 0) { |
|
2395 TempNewSymbol pkg_name = InstanceKlass::package_from_name(class_name, CHECK); |
|
2396 assert(pkg_name != NULL, "Error in parsing package name starting with 'java/'"); |
|
2397 char* name = pkg_name->as_C_string(); |
|
2398 const char* class_loader_name = InstanceKlass::cast(class_loader()->klass())->name()->as_C_string(); |
|
2399 StringUtils::replace_no_expand(name, "/", "."); |
|
2400 const char* msg_text1 = "Class loader (instance of): "; |
|
2401 const char* msg_text2 = " tried to load prohibited package name: "; |
|
2402 size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + strlen(name) + 1; |
|
2403 char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len); |
|
2404 jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, name); |
|
2405 THROW_MSG(vmSymbols::java_lang_SecurityException(), message); |
|
2406 } |
|
2407 return; |
|
2408 } |
2378 |
2409 |
2379 // tell if two classes have the same enclosing class (at package level) |
2410 // tell if two classes have the same enclosing class (at package level) |
2380 bool InstanceKlass::is_same_package_member_impl(const InstanceKlass* class1, |
2411 bool InstanceKlass::is_same_package_member_impl(const InstanceKlass* class1, |
2381 const Klass* class2, |
2412 const Klass* class2, |
2382 TRAPS) { |
2413 TRAPS) { |