hotspot/src/share/vm/oops/instanceKlass.cpp
changeset 40016 bf6fcd467a7b
parent 39714 976b97b59d87
child 40102 23ff468d69b4
equal deleted inserted replaced
40013:943cf01a6b82 40016:bf6fcd467a7b
    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) {