From: Paul Eggert Date: Fri, 11 Aug 2006 17:42:19 +0000 (+0000) Subject: * snprintf.c (snprintf): memcpy LEN bytes, not SIZE - 1, when X-Git-Tag: cvs-readonly~2065 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=897f4d069bc7de018639d6937a005fd711a82e5c;p=gnulib.git * snprintf.c (snprintf): memcpy LEN bytes, not SIZE - 1, when LEN is smaller than SIZE. Suggested by Bruno Haible. Also, help the compiler to keep LEN in a register. --- diff --git a/lib/ChangeLog b/lib/ChangeLog index 5cf12553e..e1e4a5103 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,9 @@ +2006-08-11 Paul Eggert + + * snprintf.c (snprintf): memcpy LEN bytes, not SIZE - 1, when + LEN is smaller than SIZE. Suggested by Bruno Haible. + Also, help the compiler to keep LEN in a register. + 2006-08-10 Paul Eggert * .cppi-disable: Add snprintf.h, socket_.h. diff --git a/lib/snprintf.c b/lib/snprintf.c index c281f7c58..ef00f55b4 100644 --- a/lib/snprintf.c +++ b/lib/snprintf.c @@ -45,11 +45,12 @@ snprintf (char *str, size_t size, const char *format, ...) { char *output; size_t len; + size_t lenbuf = size; va_list args; va_start (args, format); - len = size; output = vasnprintf (str, &len, format, args); + len = lenbuf; va_end (args); if (!output) @@ -59,8 +60,9 @@ snprintf (char *str, size_t size, const char *format, ...) { if (size) { - memcpy (str, output, size - 1); - str[size - 1] = '\0'; + size_t pruned_len = (len < size ? len : size - 1); + memcpy (str, output, pruned_len); + str[pruned_len] = '\0'; } free (output);