--- old/test/hotspot/jtreg/vmTestbase/nsk/share/jni/ExceptionCheckingJniEnv.cpp 2018-12-05 11:22:32.720541037 -0800 +++ new/test/hotspot/jtreg/vmTestbase/nsk/share/jni/ExceptionCheckingJniEnv.cpp 2018-12-05 11:22:32.456541843 -0800 @@ -141,18 +141,30 @@ // _file, _line); // but will use strlen + memcpy instead. const char* pre_message = "JNI method "; - size_t pre_len = strlen(pre_message); - size_t base_len = strlen(_base_message); - const char* between_message = " : "; - size_t between_len = strlen(between_message); - const char* from_message = " from "; - size_t from_len = strlen(from_message); - size_t error_len = strlen(_error_message); - const char* file_name = _file ? _file : "Unknown file"; - size_t file_len = strlen(file_name); + const char* between_msg = " : "; + const char* from_msg = " from "; - // +10 for the integer and +1 for the '\0' - size_t len = pre_len + base_len + between_len + error_len + from_len + file_len + between_len + 10 + 1; + const char* file_name = _file ? _file : "Unknown File"; + const char* strs[] = { + pre_message, + _base_message, + between_msg, + _error_message, + from_msg, + file_name, + between_msg, + }; + + size_t msg_number = sizeof(strs) / sizeof(strs[0]); + size_t len = 0; + for (size_t i = 0; i < msg_number; i++) { + len += strlen(strs[i]); + } + + // 32-bit signed means 11 characters due to the '-'. + const int MAX_INTEGER_DIGITS = 11; + // Add for the line number and 1 for the '\0'. + len += MAX_INTEGER_DIGITS + 1; char* full_message = (char*) malloc(len); if (full_message == NULL) { @@ -160,25 +172,31 @@ return; } - // Now we construct the string using memcpy to not use sprintf/std::string + // Now we construct the string using strncat to not use sprintf/std::string // instead of: - // snprintf(full_message, len, "%s : %s", _base_message, _error_message); - memcpy(full_message, pre_message, pre_len); - memcpy(full_message + pre_len, _base_message, base_len); - memcpy(full_message + pre_len + base_len, between_message, between_len); - memcpy(full_message + pre_len + base_len + between_len, _error_message, error_len); - memcpy(full_message + pre_len + base_len + between_len + error_len, from_message, from_len); - memcpy(full_message + pre_len + base_len + between_len + error_len + from_len, file_name, file_len); - memcpy(full_message + pre_len + base_len + between_len + error_len + from_len + file_len, - between_message, between_len); - - DecimalToAscii( - full_message + pre_len + base_len + between_len + error_len + from_len + file_len + between_len, - _line); - - // -1 due to the '\0' not counted by strlen but is counted for the allocation. - if (strlen(full_message) >= len - 1) { - _env->GetJNIEnv()->FatalError("Length of message is greater than expected"); + // snprintf(full_message, len, "JNI method %s : %s from %s:%d", _base_message, + // _error_message, _file, _line); + full_message[0] = '\0'; + size_t current_len = 0; + for (size_t i = 0; i < msg_number; i++) { + size_t current_src_len = strlen(strs[i]); + current_len += current_src_len; + if (current_len >= len) { + _env->GetJNIEnv()->FatalError("Length of message is not what was expected"); + } + + strncat(full_message, strs[i], current_src_len); + } + + // 10 is the max for an integer transformation. + if (current_len + MAX_INTEGER_DIGITS >= len) { + _env->GetJNIEnv()->FatalError("Length of message is not what was expected with line"); + } + + DecimalToAscii(full_message + current_len, _line); + + if (strlen(full_message) >= len) { + _env->GetJNIEnv()->FatalError("Final length of message is not what was expected"); } _env->HandleError(full_message);