Skip to content

Commit

Permalink
[Backport] 8212883: Setting a double manageable flag with jcmd/jinfo …
Browse files Browse the repository at this point in the history
…crashes the JVM

Summary: Fix jtreg test failure from JEP 346 G1Periodic GC. Support double manageable flag
         http://hg.openjdk.java.net/jdk/jdk/rev/439b4a9b5a2e

Test Plan: test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/TestOptionsWithRangesDynamic.java

Reviewed-by: mmyxym, linade

Issue: #662
  • Loading branch information
leveretconey committed Aug 25, 2023
1 parent 7e71f7a commit 466838e
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 6 deletions.
34 changes: 28 additions & 6 deletions src/hotspot/share/services/writeableFlags.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ JVMFlag::Error WriteableFlags::set_bool_flag(const char* name, bool value, JVMFl
JVMFlag::Error WriteableFlags::set_int_flag(const char* name, const char* arg, JVMFlag::Flags origin, FormatBuffer<80>& err_msg) {
int value;

if (sscanf(arg, "%d", &value)) {
if (sscanf(arg, "%d", &value) == 1) {
return set_int_flag(name, value, origin, err_msg);
}
err_msg.print("flag value must be an integer");
Expand All @@ -133,7 +133,7 @@ JVMFlag::Error WriteableFlags::set_int_flag(const char* name, int value, JVMFlag
JVMFlag::Error WriteableFlags::set_uint_flag(const char* name, const char* arg, JVMFlag::Flags origin, FormatBuffer<80>& err_msg) {
uint value;

if (sscanf(arg, "%u", &value)) {
if (sscanf(arg, "%u", &value) == 1) {
return set_uint_flag(name, value, origin, err_msg);
}
err_msg.print("flag value must be an unsigned integer");
Expand All @@ -150,7 +150,7 @@ JVMFlag::Error WriteableFlags::set_uint_flag(const char* name, uint value, JVMFl
JVMFlag::Error WriteableFlags::set_intx_flag(const char* name, const char* arg, JVMFlag::Flags origin, FormatBuffer<80>& err_msg) {
intx value;

if (sscanf(arg, INTX_FORMAT, &value)) {
if (sscanf(arg, INTX_FORMAT, &value) == 1) {
return set_intx_flag(name, value, origin, err_msg);
}
err_msg.print("flag value must be an integer");
Expand All @@ -167,7 +167,7 @@ JVMFlag::Error WriteableFlags::set_intx_flag(const char* name, intx value, JVMFl
JVMFlag::Error WriteableFlags::set_uintx_flag(const char* name, const char* arg, JVMFlag::Flags origin, FormatBuffer<80>& err_msg) {
uintx value;

if (sscanf(arg, UINTX_FORMAT, &value)) {
if (sscanf(arg, UINTX_FORMAT, &value) == 1) {
return set_uintx_flag(name, value, origin, err_msg);
}
err_msg.print("flag value must be an unsigned integer");
Expand All @@ -184,7 +184,7 @@ JVMFlag::Error WriteableFlags::set_uintx_flag(const char* name, uintx value, JVM
JVMFlag::Error WriteableFlags::set_uint64_t_flag(const char* name, const char* arg, JVMFlag::Flags origin, FormatBuffer<80>& err_msg) {
uint64_t value;

if (sscanf(arg, UINT64_FORMAT, &value)) {
if (sscanf(arg, UINT64_FORMAT, &value) == 1) {
return set_uint64_t_flag(name, value, origin, err_msg);
}
err_msg.print("flag value must be an unsigned 64-bit integer");
Expand All @@ -201,7 +201,7 @@ JVMFlag::Error WriteableFlags::set_uint64_t_flag(const char* name, uint64_t valu
JVMFlag::Error WriteableFlags::set_size_t_flag(const char* name, const char* arg, JVMFlag::Flags origin, FormatBuffer<80>& err_msg) {
size_t value;

if (sscanf(arg, SIZE_FORMAT, &value)) {
if (sscanf(arg, SIZE_FORMAT, &value) == 1) {
return set_size_t_flag(name, value, origin, err_msg);
}
err_msg.print("flag value must be an unsigned integer");
Expand All @@ -214,6 +214,23 @@ JVMFlag::Error WriteableFlags::set_size_t_flag(const char* name, size_t value, J
return err;
}

// set a double global flag
JVMFlag::Error WriteableFlags::set_double_flag(const char* name, const char* arg, JVMFlag::Flags origin, FormatBuffer<80>& err_msg) {
double value;

if (sscanf(arg, "%lf", &value) == 1) {
return set_double_flag(name, value, origin, err_msg);
}
err_msg.print("flag value must be a double");
return JVMFlag::WRONG_FORMAT;
}

JVMFlag::Error WriteableFlags::set_double_flag(const char* name, double value, JVMFlag::Flags origin, FormatBuffer<80>& err_msg) {
JVMFlag::Error err = JVMFlag::doubleAtPut(name, &value, origin);
print_flag_error_message_if_needed(err, name, err_msg);
return err;
}

// set a string global flag using value from AttachOperation
JVMFlag::Error WriteableFlags::set_ccstr_flag(const char* name, const char* value, JVMFlag::Flags origin, FormatBuffer<80>& err_msg) {
JVMFlag::Error err = JVMFlag::ccstrAtPut((char*)name, &value, origin);
Expand Down Expand Up @@ -286,6 +303,8 @@ JVMFlag::Error WriteableFlags::set_flag_from_char(JVMFlag* f, const void* value,
return set_uint64_t_flag(f->_name, flag_value, origin, err_msg);
} else if (f->is_size_t()) {
return set_size_t_flag(f->_name, flag_value, origin, err_msg);
} else if (f->is_double()) {
return set_double_flag(f->_name, flag_value, origin, err_msg);
} else if (f->is_ccstr()) {
return set_ccstr_flag(f->_name, flag_value, origin, err_msg);
} else {
Expand Down Expand Up @@ -319,6 +338,9 @@ JVMFlag::Error WriteableFlags::set_flag_from_jvalue(JVMFlag* f, const void* valu
} else if (f->is_size_t()) {
size_t svalue = (size_t)new_value.j;
return set_size_t_flag(f->_name, svalue, origin, err_msg);
} else if (f->is_double()) {
double dvalue = (double)new_value.d;
return set_double_flag(f->_name, dvalue, origin, err_msg);
} else if (f->is_ccstr()) {
oop str = JNIHandles::resolve_external_guard(new_value.l);
if (str == NULL) {
Expand Down
4 changes: 4 additions & 0 deletions src/hotspot/share/services/writeableFlags.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ class WriteableFlags : AllStatic {
static JVMFlag::Error set_uint64_t_flag(const char* name, const char* value, JVMFlag::Flags origin, FormatBuffer<80>& err_msg);
// set a size_t global flag using value from AttachOperation
static JVMFlag::Error set_size_t_flag(const char* name, const char* value, JVMFlag::Flags origin, FormatBuffer<80>& err_msg);
// set a double global flag using value from AttachOperation
static JVMFlag::Error set_double_flag(const char* name, const char* value, JVMFlag::Flags origin, FormatBuffer<80>& err_msg);
// set a boolean global flag
static JVMFlag::Error set_bool_flag(const char* name, bool value, JVMFlag::Flags origin, FormatBuffer<80>& err_msg);
// set a int global flag
Expand All @@ -66,6 +68,8 @@ class WriteableFlags : AllStatic {
static JVMFlag::Error set_uint64_t_flag(const char* name, uint64_t value, JVMFlag::Flags origin, FormatBuffer<80>& err_msg);
// set a size_t global flag using value from AttachOperation
static JVMFlag::Error set_size_t_flag(const char* name, size_t value, JVMFlag::Flags origin, FormatBuffer<80>& err_msg);
// set a double global flag using value from AttachOperation
static JVMFlag::Error set_double_flag(const char* name, double value, JVMFlag::Flags origin, FormatBuffer<80>& err_msg);
// set a string global flag
static JVMFlag::Error set_ccstr_flag(const char* name, const char* value, JVMFlag::Flags origin, FormatBuffer<80>& err_msg);

Expand Down

0 comments on commit 466838e

Please sign in to comment.