8029070: memory leak in jmm_SetVMGlobal
Reviewed-by: kvn, dholmes
This commit is contained in:
parent
ed5c744803
commit
cfefbcebf5
@ -702,8 +702,6 @@ bool CommandLineFlags::ccstrAt(char* name, size_t len, ccstr* value) {
|
||||
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 @@ bool CommandLineFlags::ccstrAtPut(char* name, size_t len, ccstr* value, Flag::Fl
|
||||
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");
|
||||
|
@ -376,6 +376,8 @@ class CommandLineFlags {
|
||||
|
||||
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); }
|
||||
|
||||
|
@ -201,6 +201,7 @@ class CommandLineFlagsEx : CommandLineFlags {
|
||||
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);
|
||||
|
@ -1821,7 +1821,7 @@ JVM_ENTRY(void, jmm_SetVMGlobal(JNIEnv *env, jstring flag_name, jvalue new_value
|
||||
"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 @@ JVM_ENTRY(void, jmm_SetVMGlobal(JNIEnv *env, jstring flag_name, jvalue new_value
|
||||
}
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user