diff --git a/.hgtags b/.hgtags index 25bd92ea5ece113b267f3b5ea8f979a48a2a1095..0f3c57e05667fb9a62171f08bc7d933c4783320a 100644 --- a/.hgtags +++ b/.hgtags @@ -904,6 +904,7 @@ e4525db272634b980738003eff99ac1588bb79d3 jdk8u111-b05 019b22dd8128840ecdcd1bfebcf4447e28e45068 jdk8u111-b06 3f337aaf090769653ee0a746fbe661d09055a883 jdk8u111-b07 e180e364a40364a059a20c74b97ab4e928e2b676 jdk8u111-b08 +c48b303692bb86c42e928da6dec815e901a24c5b jdk8u111-b09 b09a69142dd3bf78ca66bb0c99046ca7cccbdda9 jdk8u112-b00 cf1faa9100dd8c8df6e1a604aaf613d037f51ebf jdk8u112-b01 f22b5be95347c669a1463d9e05ec3bf11420208e jdk8u112-b02 diff --git a/src/share/vm/prims/jvm.cpp b/src/share/vm/prims/jvm.cpp index f1ed8d6f98dc91185b7c4b754cbe323e2c0c78d9..f1b13f2b16d991cbb1383f2bf7a7b86e9ab4bd28 100644 --- a/src/share/vm/prims/jvm.cpp +++ b/src/share/vm/prims/jvm.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -2872,7 +2872,18 @@ ATTRIBUTE_PRINTF(3, 0) int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args) { // see bug 4399518, 4417214 if ((intptr_t)count <= 0) return -1; - return vsnprintf(str, count, fmt, args); + + int result = vsnprintf(str, count, fmt, args); + // Note: on truncation vsnprintf(3) on Unix returns number of + // characters which would have been written had the buffer been large + // enough; on Windows, it returns -1. We handle both cases here and + // always return -1, and perform null termination. + if ((result > 0 && (size_t)result >= count) || result == -1) { + str[count - 1] = '\0'; + result = -1; + } + + return result; } ATTRIBUTE_PRINTF(3, 0) diff --git a/src/share/vm/runtime/deoptimization.cpp b/src/share/vm/runtime/deoptimization.cpp index 141d06d77cb38d69fe2dbb896439565477f18e3c..387a31c523ecbbb0bf53749ad5c208117d61c822 100644 --- a/src/share/vm/runtime/deoptimization.cpp +++ b/src/share/vm/runtime/deoptimization.cpp @@ -1881,8 +1881,6 @@ const char* Deoptimization::format_trap_state(char* buf, size_t buflen, trap_reason_name(reason), recomp_flag ? " recompiled" : ""); } - if (len >= buflen) - buf[buflen-1] = '\0'; return buf; } @@ -1952,8 +1950,6 @@ const char* Deoptimization::format_trap_request(char* buf, size_t buflen, len = jio_snprintf(buf, buflen, "reason='%s' action='%s' index='%d'", reason, action, unloaded_class_index); } - if (len >= buflen) - buf[buflen-1] = '\0'; return buf; } diff --git a/src/share/vm/runtime/java.cpp b/src/share/vm/runtime/java.cpp index f1444d4a29e96907a622f66590745da645bfc900..faec9bae95ca1ff72d50bd2815da95a9a1daa630 100644 --- a/src/share/vm/runtime/java.cpp +++ b/src/share/vm/runtime/java.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -773,25 +773,36 @@ int JDK_Version::compare(const JDK_Version& other) const { } void JDK_Version::to_string(char* buffer, size_t buflen) const { + assert(buffer && buflen > 0, "call with useful buffer"); size_t index = 0; if (!is_valid()) { jio_snprintf(buffer, buflen, "%s", "(uninitialized)"); } else if (is_partially_initialized()) { jio_snprintf(buffer, buflen, "%s", "(uninitialized) pre-1.6.0"); } else { - index += jio_snprintf( + int rc = jio_snprintf( &buffer[index], buflen - index, "%d.%d", _major, _minor); + if (rc == -1) return; + index += rc; if (_micro > 0) { - index += jio_snprintf(&buffer[index], buflen - index, ".%d", _micro); + rc = jio_snprintf(&buffer[index], buflen - index, ".%d", _micro); + if (rc == -1) return; + index += rc; } if (_update > 0) { - index += jio_snprintf(&buffer[index], buflen - index, "_%02d", _update); + rc = jio_snprintf(&buffer[index], buflen - index, "_%02d", _update); + if (rc == -1) return; + index += rc; } if (_special > 0) { - index += jio_snprintf(&buffer[index], buflen - index, "%c", _special); + rc = jio_snprintf(&buffer[index], buflen - index, "%c", _special); + if (rc == -1) return; + index += rc; } if (_build > 0) { - index += jio_snprintf(&buffer[index], buflen - index, "-b%02d", _build); + rc = jio_snprintf(&buffer[index], buflen - index, "-b%02d", _build); + if (rc == -1) return; + index += rc; } } }