* snprintf.c (snprintf): memcpy LEN bytes, not SIZE - 1, when
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 11 Aug 2006 17:42:19 +0000 (17:42 +0000)
committerPaul Eggert <eggert@cs.ucla.edu>
Fri, 11 Aug 2006 17:42:19 +0000 (17:42 +0000)
LEN is smaller than SIZE.  Suggested by Bruno Haible.
Also, help the compiler to keep LEN in a register.

lib/ChangeLog
lib/snprintf.c

index 5cf1255..e1e4a51 100644 (file)
@@ -1,3 +1,9 @@
+2006-08-11  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * 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  <eggert@cs.ucla.edu>
 
        * .cppi-disable: Add snprintf.h, socket_.h.
index c281f7c..ef00f55 100644 (file)
@@ -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);