--- a/jdk/src/windows/bin/java_md.c Thu Nov 08 15:41:01 2012 -0800
+++ b/jdk/src/windows/bin/java_md.c Fri Nov 09 14:36:10 2012 -0800
@@ -526,27 +526,35 @@
}
return (counts * 1000 * 1000)/counterFrequency.QuadPart;
}
-
/*
* windows snprintf does not guarantee a null terminator in the buffer,
* if the computed size is equal to or greater than the buffer size,
- * as well as error conditions, this function guarantees a null terminator
- * under all these conditions. An unreasonable buffer size will return
- * an error value.
+ * as well as error conditions. This function guarantees a null terminator
+ * under all these conditions. An unreasonable buffer or size will return
+ * an error value. Under all other conditions this function will return the
+ * size of the bytes actually written minus the null terminator, similar
+ * to ansi snprintf api. Thus when calling this function the caller must
+ * ensure storage for the null terminator.
*/
-size_t
-JLI_Snprintf(char* buffer, size_t size, const char* format, ...)
-{
- size_t rc;
+int
+JLI_Snprintf(char* buffer, size_t size, const char* format, ...) {
+ int rc;
va_list vl;
- if (size <= 0)
+ if (size == 0 || buffer == NULL)
return -1;
+ buffer[0] = '\0';
va_start(vl, format);
- rc = vsnprintf(buffer, size - 1, format, vl);
+ rc = vsnprintf(buffer, size, format, vl);
+ va_end(vl);
/* force a null terminator, if something is amiss */
- if (rc < 0 || rc >= size)
+ if (rc < 0) {
+ /* apply ansi semantics */
buffer[size - 1] = '\0';
- va_end(vl);
+ return size;
+ } else if (rc == size) {
+ /* force a null terminator */
+ buffer[size - 1] = '\0';
+ }
return rc;
}
@@ -1441,7 +1449,10 @@
// we add the indicator
tlen = 1 + JLI_StrLen(strv[i]) + 1;
nargv[i] = (char *) JLI_MemAlloc(tlen);
- JLI_Snprintf(nargv[i], tlen, "%c%s", arg_expand ? 'T' : 'F', strv[i]);
+ if (JLI_Snprintf(nargv[i], tlen, "%c%s", arg_expand ? 'T' : 'F',
+ strv[i]) < 0) {
+ return NULL;
+ }
JLI_TraceLauncher("%s\n", nargv[i]);
}