8029070: memory leak in jmm_SetVMGlobal
authoriignatyev
Mon, 23 Dec 2013 20:56:18 +0400
changeset 22194 e4bef4b8cdb4
parent 22192 15caf5793272
child 22195 c39aa322d33a
8029070: memory leak in jmm_SetVMGlobal Reviewed-by: kvn, dholmes
hotspot/src/share/vm/runtime/globals.cpp
hotspot/src/share/vm/runtime/globals.hpp
hotspot/src/share/vm/runtime/globals_extension.hpp
hotspot/src/share/vm/services/management.cpp
--- a/hotspot/src/share/vm/runtime/globals.cpp	Wed Dec 18 23:09:57 2013 +0400
+++ b/hotspot/src/share/vm/runtime/globals.cpp	Mon Dec 23 20:56:18 2013 +0400
@@ -702,8 +702,6 @@
   return true;
 }
 
-// Contract:  Flag will make private copy of the incoming value.
-// Outgoing value is always malloc-ed, and caller MUST call free.
 bool CommandLineFlags::ccstrAtPut(char* name, size_t len, ccstr* value, Flag::Flags origin) {
   Flag* result = Flag::find_flag(name, len);
   if (result == NULL) return false;
@@ -726,7 +724,6 @@
   return true;
 }
 
-// Contract:  Flag will make private copy of the incoming value.
 void CommandLineFlagsEx::ccstrAtPut(CommandLineFlagWithType flag, ccstr value, Flag::Flags origin) {
   Flag* faddr = address_of_flag(flag);
   guarantee(faddr != NULL && faddr->is_ccstr(), "wrong flag type");
--- a/hotspot/src/share/vm/runtime/globals.hpp	Wed Dec 18 23:09:57 2013 +0400
+++ b/hotspot/src/share/vm/runtime/globals.hpp	Mon Dec 23 20:56:18 2013 +0400
@@ -376,6 +376,8 @@
 
   static bool ccstrAt(char* name, size_t len, ccstr* value);
   static bool ccstrAt(char* name, ccstr* value)    { return ccstrAt(name, strlen(name), value); }
+  // Contract:  Flag will make private copy of the incoming value.
+  // Outgoing value is always malloc-ed, and caller MUST call free.
   static bool ccstrAtPut(char* name, size_t len, ccstr* value, Flag::Flags origin);
   static bool ccstrAtPut(char* name, ccstr* value, Flag::Flags origin) { return ccstrAtPut(name, strlen(name), value, origin); }
 
--- a/hotspot/src/share/vm/runtime/globals_extension.hpp	Wed Dec 18 23:09:57 2013 +0400
+++ b/hotspot/src/share/vm/runtime/globals_extension.hpp	Mon Dec 23 20:56:18 2013 +0400
@@ -201,6 +201,7 @@
   static void uintxAtPut(CommandLineFlagWithType flag, uintx value, Flag::Flags origin);
   static void uint64_tAtPut(CommandLineFlagWithType flag, uint64_t value, Flag::Flags origin);
   static void doubleAtPut(CommandLineFlagWithType flag, double value, Flag::Flags origin);
+  // Contract:  Flag will make private copy of the incoming value
   static void ccstrAtPut(CommandLineFlagWithType flag, ccstr value, Flag::Flags origin);
 
   static bool is_default(CommandLineFlag flag);
--- a/hotspot/src/share/vm/services/management.cpp	Wed Dec 18 23:09:57 2013 +0400
+++ b/hotspot/src/share/vm/services/management.cpp	Mon Dec 23 20:56:18 2013 +0400
@@ -1821,7 +1821,7 @@
               "This flag is not writeable.");
   }
 
-  bool succeed;
+  bool succeed = false;
   if (flag->is_bool()) {
     bool bvalue = (new_value.z == JNI_TRUE ? true : false);
     succeed = CommandLineFlags::boolAtPut(name, &bvalue, Flag::MANAGEMENT);
@@ -1841,6 +1841,9 @@
     }
     ccstr svalue = java_lang_String::as_utf8_string(str);
     succeed = CommandLineFlags::ccstrAtPut(name, &svalue, Flag::MANAGEMENT);
+    if (succeed) {
+      FREE_C_HEAP_ARRAY(char, svalue, mtInternal);
+    }
   }
   assert(succeed, "Setting flag should succeed");
 JVM_END