# HG changeset patch # User jcbeyler # Date 1542227115 28800 # Node ID 40098289d5804c3b5e7074bc75501a81e70d9b0d # Parent f5011100c920654980e671133a3cc3482189fed3 8213622: Windows VS2013 build failure - "'snprintf': identifier not found" Summary: Replace snprintf with strlen and memcpy Reviewed-by: dholmes, mvala, kbarrett diff -r f5011100c920 -r 40098289d580 test/hotspot/jtreg/vmTestbase/nsk/share/jni/ExceptionCheckingJniEnv.cpp --- a/test/hotspot/jtreg/vmTestbase/nsk/share/jni/ExceptionCheckingJniEnv.cpp Wed Nov 14 11:42:40 2018 -0800 +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jni/ExceptionCheckingJniEnv.cpp Wed Nov 14 12:25:15 2018 -0800 @@ -23,6 +23,7 @@ */ #include +#include #include "ExceptionCheckingJniEnv.hpp" @@ -48,12 +49,21 @@ } void ProcessReturnError() { - int len = snprintf(NULL, 0, "%s : %s", _base_msg, _return_error) + 1; + // This is error prone, but: + // - Seems like we cannot use std::string (due to windows/solaris not + // building when used, seemingly due to exception libraries not linking). + // - Seems like we cannot use sprintf due to VS2013 (JDK-8213622). + // + // We are aiming to do: + // snprintf(full_message, len, "%s : %s", _base_msg, _return_error); + // but will use strlen + memcpy instead. + size_t base_len = strlen(_base_msg); + const char* between_msg = " : "; + size_t between_len = strlen(between_msg); + size_t return_len = strlen(_return_error); - if (len <= 0) { - _env->HandleError(_return_error); - return; - } + // +1 for the '\0' + size_t len = base_len + between_len + return_len + 1; char* full_message = (char*) malloc(len); if (full_message == NULL) { @@ -61,7 +71,18 @@ return; } - snprintf(full_message, len, "%s : %s", _base_msg, _return_error); + // Now we construct the string using memcpy to not use sprintf/std::string + // instead of: + // snprintf(full_message, len, "%s : %s", _base_msg, _return_error); + memcpy(full_message, _base_msg, base_len); + memcpy(full_message + base_len, between_msg, between_len); + memcpy(full_message + base_len + between_len, _return_error, return_len); + full_message[len - 1] = '\0'; + + // -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 not what was expected"); + } _env->HandleError(full_message); free(full_message);