changeset 60143:cd68c6a57804

8246308: Reference count for PackageEntry::name may be incorrectly decremented Summary: Corrected the usage of TempNewSymbol. Reviewed-by: minqi, iklam
author ccheung
date Mon, 13 Jul 2020 16:05:25 +0000
parents 972d6a151cec
children 4bdbcdfdbdbb
files src/hotspot/share/classfile/systemDictionaryShared.cpp src/hotspot/share/oops/instanceKlass.cpp
diffstat 2 files changed, 12 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/hotspot/share/classfile/systemDictionaryShared.cpp	Mon Jul 13 07:52:59 2020 -0700
+++ b/src/hotspot/share/classfile/systemDictionaryShared.cpp	Mon Jul 13 16:05:25 2020 +0000
@@ -717,7 +717,7 @@
 Handle SystemDictionaryShared::get_package_name(Symbol* class_name, TRAPS) {
   ResourceMark rm(THREAD);
   Handle pkgname_string;
-  Symbol* pkg = ClassLoader::package_from_class_name(class_name);
+  TempNewSymbol pkg = ClassLoader::package_from_class_name(class_name);
   if (pkg != NULL) { // Package prefix found
     const char* pkgname = pkg->as_klass_external_name();
     pkgname_string = java_lang_String::create_from_str(pkgname,
--- a/src/hotspot/share/oops/instanceKlass.cpp	Mon Jul 13 07:52:59 2020 -0700
+++ b/src/hotspot/share/oops/instanceKlass.cpp	Mon Jul 13 16:05:25 2020 +0000
@@ -2825,7 +2825,17 @@
     check_prohibited_package(name(), loader_data, CHECK);
   }
 
-  TempNewSymbol pkg_name = pkg_entry != NULL ? pkg_entry->name() : ClassLoader::package_from_class_name(name());
+  // ClassLoader::package_from_class_name has already incremented the refcount of the symbol
+  // it returns, so we need to decrement it when the current function exits.
+  TempNewSymbol from_class_name =
+      (pkg_entry != NULL) ? NULL : ClassLoader::package_from_class_name(name());
+
+  Symbol* pkg_name;
+  if (pkg_entry != NULL) {
+    pkg_name = pkg_entry->name();
+  } else {
+    pkg_name = from_class_name;
+  }
 
   if (pkg_name != NULL && loader_data != NULL) {