# HG changeset patch # User neliasso # Date 1543916820 -3600 # Tue Dec 04 10:47:00 2018 +0100 # Node ID fa48356b6674cc4c42f9e2a0b8c10f4baf572543 # Parent 767678b5e61bee605b8183e16d9a7f310c971f66 8214773: Replace use of thread unsafe strtok Reviewed-by: diff --git a/src/hotspot/os/aix/os_aix.inline.hpp b/src/hotspot/os/aix/os_aix.inline.hpp --- a/src/hotspot/os/aix/os_aix.inline.hpp +++ b/src/hotspot/os/aix/os_aix.inline.hpp @@ -36,6 +36,11 @@ #include #include +// Use threadsafe version of strtok +inline char* os::strtok(char *str, const char *delim, char **saveptr) { + return strtok_r(str, delim, saveptr); +} + // File names are case-insensitive on windows only. inline int os::file_name_strncmp(const char* s1, const char* s2, size_t num) { return strncmp(s1, s2, num); diff --git a/src/hotspot/os/bsd/os_bsd.inline.hpp b/src/hotspot/os/bsd/os_bsd.inline.hpp --- a/src/hotspot/os/bsd/os_bsd.inline.hpp +++ b/src/hotspot/os/bsd/os_bsd.inline.hpp @@ -34,6 +34,11 @@ #include #include +// Use threadsafe version of strtok +inline char* os::strtok(char *str, const char *delim, char **saveptr) { + return strtok_r(str, delim, saveptr); +} + // File names are case-insensitive on windows only inline int os::file_name_strncmp(const char* s1, const char* s2, size_t num) { return strncmp(s1, s2, num); diff --git a/src/hotspot/os/linux/os_linux.inline.hpp b/src/hotspot/os/linux/os_linux.inline.hpp --- a/src/hotspot/os/linux/os_linux.inline.hpp +++ b/src/hotspot/os/linux/os_linux.inline.hpp @@ -34,6 +34,11 @@ #include #include +// Use threadsafe version of strtok +inline char* os::strtok(char *str, const char *delim, char **saveptr) { + return strtok_r(str, delim, saveptr); +} + // File names are case-insensitive on windows only inline int os::file_name_strncmp(const char* s1, const char* s2, size_t num) { return strncmp(s1, s2, num); diff --git a/src/hotspot/os/solaris/os_solaris.inline.hpp b/src/hotspot/os/solaris/os_solaris.inline.hpp --- a/src/hotspot/os/solaris/os_solaris.inline.hpp +++ b/src/hotspot/os/solaris/os_solaris.inline.hpp @@ -37,6 +37,11 @@ #include #include +// Use threadsafe version of strtok +inline char* os::strtok(char *str, const char *delim, char **saveptr) { + return strtok_r(str, delim, saveptr); +} + // File names are case-insensitive on windows only inline int os::file_name_strncmp(const char* s1, const char* s2, size_t num) { return strncmp(s1, s2, num); diff --git a/src/hotspot/os/windows/os_windows.inline.hpp b/src/hotspot/os/windows/os_windows.inline.hpp --- a/src/hotspot/os/windows/os_windows.inline.hpp +++ b/src/hotspot/os/windows/os_windows.inline.hpp @@ -32,6 +32,11 @@ inline const int os::default_file_open_flags() { return O_BINARY | O_NOINHERIT;} +// Use threadsafe version of strtok +inline char* os::strtok(char *str, const char *delim, char **saveptr) { + return strtok_s(str, delim, saveptr); +} + // File names are case-insensitive on windows only inline int os::file_name_strncmp(const char* s, const char* t, size_t num) { return _strnicmp(s, t, num); diff --git a/src/hotspot/share/classfile/vmSymbols.cpp b/src/hotspot/share/classfile/vmSymbols.cpp --- a/src/hotspot/share/classfile/vmSymbols.cpp +++ b/src/hotspot/share/classfile/vmSymbols.cpp @@ -475,13 +475,14 @@ char* local_list = (char*)DirectiveSet::canonicalize_disableintrinsic(DisableIntrinsic); bool found = false; - char* token = strtok(local_list, ","); + char *save_ptr; + char* token = os::strtok(local_list, ",", &save_ptr); while (token != NULL) { if (strcmp(token, vmIntrinsics::name_at(id)) == 0) { found = true; break; } else { - token = strtok(NULL, ","); + token = os::strtok(NULL, ",", &save_ptr); } } diff --git a/src/hotspot/share/compiler/compilerDirectives.cpp b/src/hotspot/share/compiler/compilerDirectives.cpp --- a/src/hotspot/share/compiler/compilerDirectives.cpp +++ b/src/hotspot/share/compiler/compilerDirectives.cpp @@ -30,6 +30,7 @@ #include "compiler/compilerOracle.hpp" #include "memory/allocation.inline.hpp" #include "memory/resourceArea.hpp" +#include "runtime/os.inline.hpp" CompilerDirectives::CompilerDirectives() : _next(NULL), _match(NULL), _ref_count(0) { _c1_store = new DirectiveSet(this); @@ -399,12 +400,13 @@ char* local_list = NEW_RESOURCE_ARRAY(char, length + 1); strncpy(local_list, DisableIntrinsicOption, length + 1); - char* token = strtok(local_list, ","); + char *save_ptr; + char* token = os::strtok(local_list, ",", &save_ptr); while (token != NULL) { if (strcmp(token, vmIntrinsics::name_at(id)) == 0) { return true; } else { - token = strtok(NULL, ","); + token = os::strtok(NULL, ",", &save_ptr); } } diff --git a/src/hotspot/share/gc/g1/g1Arguments.cpp b/src/hotspot/share/gc/g1/g1Arguments.cpp --- a/src/hotspot/share/gc/g1/g1Arguments.cpp +++ b/src/hotspot/share/gc/g1/g1Arguments.cpp @@ -32,6 +32,7 @@ #include "gc/shared/gcArguments.inline.hpp" #include "runtime/globals.hpp" #include "runtime/globals_extension.hpp" +#include "runtime/os.inline.hpp" #include "runtime/vm_version.hpp" size_t G1Arguments::conservative_max_heap_alignment() { @@ -41,13 +42,14 @@ void G1Arguments::initialize_verification_types() { if (strlen(VerifyGCType) > 0) { const char delimiter[] = " ,\n"; + char *save_ptr; size_t length = strlen(VerifyGCType); char* type_list = NEW_C_HEAP_ARRAY(char, length + 1, mtInternal); strncpy(type_list, VerifyGCType, length + 1); - char* token = strtok(type_list, delimiter); + char* token = os::strtok(type_list, delimiter, &save_ptr); while (token != NULL) { parse_verification_type(token); - token = strtok(NULL, delimiter); + token = os::strtok(NULL, delimiter, &save_ptr); } FREE_C_HEAP_ARRAY(char, type_list); } diff --git a/src/hotspot/share/memory/universe.cpp b/src/hotspot/share/memory/universe.cpp --- a/src/hotspot/share/memory/universe.cpp +++ b/src/hotspot/share/memory/universe.cpp @@ -73,6 +73,7 @@ #include "runtime/thread.inline.hpp" #include "runtime/timerTrace.hpp" #include "runtime/vm_operations.hpp" +#include "runtime/os.inline.hpp" #include "services/memoryService.hpp" #include "utilities/align.hpp" #include "utilities/copy.hpp" @@ -1113,13 +1114,14 @@ void Universe::initialize_verify_flags() { verify_flags = 0; + char *save_ptr; const char delimiter[] = " ,"; size_t length = strlen(VerifySubSet); char* subset_list = NEW_C_HEAP_ARRAY(char, length + 1, mtInternal); strncpy(subset_list, VerifySubSet, length + 1); - char* token = strtok(subset_list, delimiter); + char* token = os::strtok(subset_list, delimiter, &save_ptr); while (token != NULL) { if (strcmp(token, "threads") == 0) { verify_flags |= Verify_Threads; @@ -1144,7 +1146,7 @@ } else { vm_exit_during_initialization(err_msg("VerifySubSet: \'%s\' memory sub-system is unknown, please correct it", token)); } - token = strtok(NULL, delimiter); + token = os::strtok(NULL, delimiter, &save_ptr); } FREE_C_HEAP_ARRAY(char, subset_list); } diff --git a/src/hotspot/share/runtime/os.hpp b/src/hotspot/share/runtime/os.hpp --- a/src/hotspot/share/runtime/os.hpp +++ b/src/hotspot/share/runtime/os.hpp @@ -735,6 +735,8 @@ // Like strdup, but exit VM when strdup() returns NULL static char* strdup_check_oom(const char*, MEMFLAGS flags = mtInternal); + static char* strtok(char *str, const char *delim, char **saveptr); + #ifndef PRODUCT static julong num_mallocs; // # of calls to malloc/realloc static julong alloc_bytes; // # of bytes allocated