src/hotspot/share/classfile/classLoader.cpp
changeset 48016 df39ee817323
parent 48011 dac108a7b06a
child 48470 1d24b76cf639
equal deleted inserted replaced
48015:d5bb6637c785 48016:df39ee817323
   260 }
   260 }
   261 
   261 
   262 
   262 
   263 ClassFileStream* ClassPathDirEntry::open_stream(const char* name, TRAPS) {
   263 ClassFileStream* ClassPathDirEntry::open_stream(const char* name, TRAPS) {
   264   // construct full path name
   264   // construct full path name
   265   char* path = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, JVM_MAXPATHLEN);
   265   assert((_dir != NULL) && (name != NULL), "sanity");
   266   if (jio_snprintf(path, JVM_MAXPATHLEN, "%s%s%s", _dir, os::file_separator(), name) == -1) {
   266   size_t path_len = strlen(_dir) + strlen(name) + strlen(os::file_separator()) + 1;
   267     FREE_RESOURCE_ARRAY(char, path, JVM_MAXPATHLEN);
   267   char* path = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, path_len);
   268     return NULL;
   268   int len = jio_snprintf(path, path_len, "%s%s%s", _dir, os::file_separator(), name);
   269   }
   269   assert(len == (int)(path_len - 1), "sanity");
   270   // check if file exists
   270   // check if file exists
   271   struct stat st;
   271   struct stat st;
   272   if (os::stat(path, &st) == 0) {
   272   if (os::stat(path, &st) == 0) {
   273 #if INCLUDE_CDS
   273 #if INCLUDE_CDS
   274     if (DumpSharedSpaces) {
   274     if (DumpSharedSpaces) {
   289       // construct ClassFileStream
   289       // construct ClassFileStream
   290       if (num_read == (size_t)st.st_size) {
   290       if (num_read == (size_t)st.st_size) {
   291         if (UsePerfData) {
   291         if (UsePerfData) {
   292           ClassLoader::perf_sys_classfile_bytes_read()->inc(num_read);
   292           ClassLoader::perf_sys_classfile_bytes_read()->inc(num_read);
   293         }
   293         }
   294         FREE_RESOURCE_ARRAY(char, path, JVM_MAXPATHLEN);
   294         FREE_RESOURCE_ARRAY(char, path, path_len);
   295         // Resource allocated
   295         // Resource allocated
   296         return new ClassFileStream(buffer,
   296         return new ClassFileStream(buffer,
   297                                    st.st_size,
   297                                    st.st_size,
   298                                    _dir,
   298                                    _dir,
   299                                    ClassFileStream::verify);
   299                                    ClassFileStream::verify);
   300       }
   300       }
   301     }
   301     }
   302   }
   302   }
   303   FREE_RESOURCE_ARRAY(char, path, JVM_MAXPATHLEN);
   303   FREE_RESOURCE_ARRAY(char, path, path_len);
   304   return NULL;
   304   return NULL;
   305 }
   305 }
   306 
   306 
   307 ClassPathZipEntry::ClassPathZipEntry(jzfile* zip, const char* zip_name, bool is_boot_append) : ClassPathEntry() {
   307 ClassPathZipEntry::ClassPathZipEntry(jzfile* zip, const char* zip_name, bool is_boot_append) : ClassPathEntry() {
   308   _zip = zip;
   308   _zip = zip;
   379       }
   379       }
   380     }
   380     }
   381 
   381 
   382     if (is_multi_ver) {
   382     if (is_multi_ver) {
   383       int n;
   383       int n;
   384       char* entry_name = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, JVM_MAXPATHLEN);
   384       const char* version_entry = "META-INF/versions/";
       
   385       // 10 is the max length of a decimal 32-bit non-negative number
       
   386       // 2 includes the '/' and trailing zero
       
   387       size_t entry_name_len = strlen(version_entry) + 10 + strlen(name) + 2;
       
   388       char* entry_name = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, entry_name_len);
   385       if (version > 0) {
   389       if (version > 0) {
   386         n = jio_snprintf(entry_name, JVM_MAXPATHLEN, "META-INF/versions/%d/%s", version, name);
   390         n = jio_snprintf(entry_name, entry_name_len, "%s%d/%s", version_entry, version, name);
   387         entry_name[n] = '\0';
   391         entry_name[n] = '\0';
   388         buffer = open_entry((const char*)entry_name, filesize, false, CHECK_NULL);
   392         buffer = open_entry((const char*)entry_name, filesize, false, CHECK_NULL);
   389         if (buffer == NULL) {
   393         if (buffer == NULL) {
   390           warning("Could not find %s in %s, try to find highest version instead", entry_name, _zip_name);
   394           warning("Could not find %s in %s, try to find highest version instead", entry_name, _zip_name);
   391         }
   395         }
   392       }
   396       }
   393       if (buffer == NULL) {
   397       if (buffer == NULL) {
   394         for (int i = cur_ver; i >= base_version; i--) {
   398         for (int i = cur_ver; i >= base_version; i--) {
   395           n = jio_snprintf(entry_name, JVM_MAXPATHLEN, "META-INF/versions/%d/%s", i, name);
   399           n = jio_snprintf(entry_name, entry_name_len, "%s%d/%s", version_entry, i, name);
   396           entry_name[n] = '\0';
   400           entry_name[n] = '\0';
   397           buffer = open_entry((const char*)entry_name, filesize, false, CHECK_NULL);
   401           buffer = open_entry((const char*)entry_name, filesize, false, CHECK_NULL);
   398           if (buffer != NULL) {
   402           if (buffer != NULL) {
   399             break;
   403             break;
   400           }
   404           }
   401         }
   405         }
   402       }
   406       }
   403       FREE_RESOURCE_ARRAY(char, entry_name, JVM_MAXPATHLEN);
   407       FREE_RESOURCE_ARRAY(char, entry_name, entry_name_len);
   404     }
   408     }
   405   }
   409   }
   406   return buffer;
   410   return buffer;
   407 }
   411 }
   408 
   412