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 |