2311 } 2312 Symbol* pkg_name = SymbolTable::new_symbol(package_name, THREAD); 2313 return pkg_name; 2314 } 2315 } 2316 2317 ModuleEntry* InstanceKlass::module() const { 2318 if (!in_unnamed_package()) { 2319 return _package_entry->module(); 2320 } 2321 const Klass* host = host_klass(); 2322 if (host == NULL) { 2323 return class_loader_data()->unnamed_module(); 2324 } 2325 return host->class_loader_data()->unnamed_module(); 2326 } 2327 2328 void InstanceKlass::set_package(ClassLoaderData* loader_data, TRAPS) { 2329 2330 // ensure java/ packages only loaded by boot or platform builtin loaders 2331 Handle class_loader(THREAD, loader_data->class_loader()); 2332 check_prohibited_package(name(), class_loader, CHECK); 2333 2334 TempNewSymbol pkg_name = package_from_name(name(), CHECK); 2335 2336 if (pkg_name != NULL && loader_data != NULL) { 2337 2338 // Find in class loader's package entry table. 2339 _package_entry = loader_data->packages()->lookup_only(pkg_name); 2340 2341 // If the package name is not found in the loader's package 2342 // entry table, it is an indication that the package has not 2343 // been defined. Consider it defined within the unnamed module. 2344 if (_package_entry == NULL) { 2345 ResourceMark rm; 2346 2347 if (!ModuleEntryTable::javabase_defined()) { 2348 // Before java.base is defined during bootstrapping, define all packages in 2349 // the java.base module. If a non-java.base package is erroneously placed 2350 // in the java.base module it will be caught later when java.base 2351 // is defined by ModuleEntryTable::verify_javabase_packages check. 2352 assert(ModuleEntryTable::javabase_moduleEntry() != NULL, JAVA_BASE_NAME " module is NULL"); 2353 _package_entry = loader_data->packages()->lookup(pkg_name, ModuleEntryTable::javabase_moduleEntry()); 2354 } else { 2355 assert(loader_data->unnamed_module() != NULL, "unnamed module is NULL"); 2356 _package_entry = loader_data->packages()->lookup(pkg_name, 2357 loader_data->unnamed_module()); 2358 } 2359 2360 // A package should have been successfully created 2361 assert(_package_entry != NULL, "Package entry for class %s not found, loader %s", 2362 name()->as_C_string(), loader_data->loader_name()); 2363 } 2364 2365 if (log_is_enabled(Debug, module)) { 2366 ResourceMark rm; 2367 ModuleEntry* m = _package_entry->module(); 2368 log_trace(module)("Setting package: class: %s, package: %s, loader: %s, module: %s", 2369 external_name(), 2370 pkg_name->as_C_string(), 2371 loader_data->loader_name(), 2372 (m->is_named() ? m->name()->as_C_string() : UNNAMED_MODULE)); 2373 } 2374 } else { 2375 ResourceMark rm; 2376 log_trace(module)("Setting package: class: %s, package: unnamed, loader: %s, module: %s", 2377 external_name(), 2378 (loader_data != NULL) ? loader_data->loader_name() : "NULL", 2379 UNNAMED_MODULE); 2380 } 2381 } 2382 2383 2384 // different versions of is_same_class_package 2385 2386 bool InstanceKlass::is_same_class_package(const Klass* class2) const { 2387 oop classloader1 = this->class_loader(); 2388 PackageEntry* classpkg1 = this->package(); 2389 if (class2->is_objArray_klass()) { 2390 class2 = ObjArrayKlass::cast(class2)->bottom_klass(); 2391 } 2392 2393 oop classloader2; 2394 PackageEntry* classpkg2; 2395 if (class2->is_instance_klass()) { 2396 classloader2 = class2->class_loader(); 2397 classpkg2 = class2->package(); 2398 } else { 2454 // Assumes name-signature match 2455 // "this" is InstanceKlass of super_method which must exist 2456 // note that the InstanceKlass of the method in the targetclassname has not always been created yet 2457 bool InstanceKlass::is_override(const methodHandle& super_method, Handle targetclassloader, Symbol* targetclassname, TRAPS) { 2458 // Private methods can not be overridden 2459 if (super_method->is_private()) { 2460 return false; 2461 } 2462 // If super method is accessible, then override 2463 if ((super_method->is_protected()) || 2464 (super_method->is_public())) { 2465 return true; 2466 } 2467 // Package-private methods are not inherited outside of package 2468 assert(super_method->is_package_private(), "must be package private"); 2469 return(is_same_class_package(targetclassloader(), targetclassname)); 2470 } 2471 2472 // Only boot and platform class loaders can define classes in "java/" packages. 2473 void InstanceKlass::check_prohibited_package(Symbol* class_name, 2474 Handle class_loader, 2475 TRAPS) { 2476 if (!class_loader.is_null() && 2477 !SystemDictionary::is_platform_class_loader(class_loader()) && 2478 class_name != NULL) { 2479 ResourceMark rm(THREAD); 2480 char* name = class_name->as_C_string(); 2481 if (strncmp(name, JAVAPKG, JAVAPKG_LEN) == 0 && name[JAVAPKG_LEN] == '/') { 2482 TempNewSymbol pkg_name = InstanceKlass::package_from_name(class_name, CHECK); 2483 assert(pkg_name != NULL, "Error in parsing package name starting with 'java/'"); 2484 name = pkg_name->as_C_string(); 2485 const char* class_loader_name = SystemDictionary::loader_name(class_loader()); 2486 StringUtils::replace_no_expand(name, "/", "."); 2487 const char* msg_text1 = "Class loader (instance of): "; 2488 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; 2490 char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len); 2491 jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, name); 2492 THROW_MSG(vmSymbols::java_lang_SecurityException(), message); 2493 } 2494 } 2495 return; 2496 } 2497 2498 // tell if two classes have the same enclosing class (at package level) 2499 bool InstanceKlass::is_same_package_member(const Klass* class2, TRAPS) const { 2500 if (class2 == this) return true; 2501 if (!class2->is_instance_klass()) return false; 2502 2503 // must be in same package before we try anything else 2504 if (!is_same_class_package(class2)) 2505 return false; | 2311 } 2312 Symbol* pkg_name = SymbolTable::new_symbol(package_name, THREAD); 2313 return pkg_name; 2314 } 2315 } 2316 2317 ModuleEntry* InstanceKlass::module() const { 2318 if (!in_unnamed_package()) { 2319 return _package_entry->module(); 2320 } 2321 const Klass* host = host_klass(); 2322 if (host == NULL) { 2323 return class_loader_data()->unnamed_module(); 2324 } 2325 return host->class_loader_data()->unnamed_module(); 2326 } 2327 2328 void InstanceKlass::set_package(ClassLoaderData* loader_data, TRAPS) { 2329 2330 // ensure java/ packages only loaded by boot or platform builtin loaders 2331 check_prohibited_package(name(), loader_data, CHECK); 2332 2333 TempNewSymbol pkg_name = package_from_name(name(), CHECK); 2334 2335 if (pkg_name != NULL && loader_data != NULL) { 2336 2337 // Find in class loader's package entry table. 2338 _package_entry = loader_data->packages()->lookup_only(pkg_name); 2339 2340 // If the package name is not found in the loader's package 2341 // entry table, it is an indication that the package has not 2342 // been defined. Consider it defined within the unnamed module. 2343 if (_package_entry == NULL) { 2344 ResourceMark rm; 2345 2346 if (!ModuleEntryTable::javabase_defined()) { 2347 // Before java.base is defined during bootstrapping, define all packages in 2348 // the java.base module. If a non-java.base package is erroneously placed 2349 // in the java.base module it will be caught later when java.base 2350 // is defined by ModuleEntryTable::verify_javabase_packages check. 2351 assert(ModuleEntryTable::javabase_moduleEntry() != NULL, JAVA_BASE_NAME " module is NULL"); 2352 _package_entry = loader_data->packages()->lookup(pkg_name, ModuleEntryTable::javabase_moduleEntry()); 2353 } else { 2354 assert(loader_data->unnamed_module() != NULL, "unnamed module is NULL"); 2355 _package_entry = loader_data->packages()->lookup(pkg_name, 2356 loader_data->unnamed_module()); 2357 } 2358 2359 // A package should have been successfully created 2360 assert(_package_entry != NULL, "Package entry for class %s not found, loader %s", 2361 name()->as_C_string(), loader_data->loader_name_and_id()); 2362 } 2363 2364 if (log_is_enabled(Debug, module)) { 2365 ResourceMark rm; 2366 ModuleEntry* m = _package_entry->module(); 2367 log_trace(module)("Setting package: class: %s, package: %s, loader: %s, module: %s", 2368 external_name(), 2369 pkg_name->as_C_string(), 2370 loader_data->loader_name_and_id(), 2371 (m->is_named() ? m->name()->as_C_string() : UNNAMED_MODULE)); 2372 } 2373 } else { 2374 ResourceMark rm; 2375 log_trace(module)("Setting package: class: %s, package: unnamed, loader: %s, module: %s", 2376 external_name(), 2377 (loader_data != NULL) ? loader_data->loader_name_and_id() : "NULL", 2378 UNNAMED_MODULE); 2379 } 2380 } 2381 2382 2383 // different versions of is_same_class_package 2384 2385 bool InstanceKlass::is_same_class_package(const Klass* class2) const { 2386 oop classloader1 = this->class_loader(); 2387 PackageEntry* classpkg1 = this->package(); 2388 if (class2->is_objArray_klass()) { 2389 class2 = ObjArrayKlass::cast(class2)->bottom_klass(); 2390 } 2391 2392 oop classloader2; 2393 PackageEntry* classpkg2; 2394 if (class2->is_instance_klass()) { 2395 classloader2 = class2->class_loader(); 2396 classpkg2 = class2->package(); 2397 } else { 2453 // Assumes name-signature match 2454 // "this" is InstanceKlass of super_method which must exist 2455 // note that the InstanceKlass of the method in the targetclassname has not always been created yet 2456 bool InstanceKlass::is_override(const methodHandle& super_method, Handle targetclassloader, Symbol* targetclassname, TRAPS) { 2457 // Private methods can not be overridden 2458 if (super_method->is_private()) { 2459 return false; 2460 } 2461 // If super method is accessible, then override 2462 if ((super_method->is_protected()) || 2463 (super_method->is_public())) { 2464 return true; 2465 } 2466 // Package-private methods are not inherited outside of package 2467 assert(super_method->is_package_private(), "must be package private"); 2468 return(is_same_class_package(targetclassloader(), targetclassname)); 2469 } 2470 2471 // Only boot and platform class loaders can define classes in "java/" packages. 2472 void InstanceKlass::check_prohibited_package(Symbol* class_name, 2473 ClassLoaderData* loader_data, 2474 TRAPS) { 2475 if (!loader_data->is_boot_class_loader_data() && 2476 !loader_data->is_platform_class_loader_data() && 2477 class_name != NULL) { 2478 ResourceMark rm(THREAD); 2479 char* name = class_name->as_C_string(); 2480 if (strncmp(name, JAVAPKG, JAVAPKG_LEN) == 0 && name[JAVAPKG_LEN] == '/') { 2481 TempNewSymbol pkg_name = InstanceKlass::package_from_name(class_name, CHECK); 2482 assert(pkg_name != NULL, "Error in parsing package name starting with 'java/'"); 2483 name = pkg_name->as_C_string(); 2484 const char* class_loader_name = loader_data->loader_name_and_id(); 2485 StringUtils::replace_no_expand(name, "/", "."); 2486 const char* msg_text1 = "Class loader (instance of): "; 2487 const char* msg_text2 = " tried to load prohibited package name: "; 2488 size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + strlen(name) + 1; 2489 char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len); 2490 jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, name); 2491 THROW_MSG(vmSymbols::java_lang_SecurityException(), message); 2492 } 2493 } 2494 return; 2495 } 2496 2497 // tell if two classes have the same enclosing class (at package level) 2498 bool InstanceKlass::is_same_package_member(const Klass* class2, TRAPS) const { 2499 if (class2 == this) return true; 2500 if (!class2->is_instance_klass()) return false; 2501 2502 // must be in same package before we try anything else 2503 if (!is_same_class_package(class2)) 2504 return false; |