OSDN Git Service

* vsnprintf.c (vsnprintf): Don't pad string with extra nulls.
authorghazi <ghazi@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Apr 2003 19:58:57 +0000 (19:58 +0000)
committerghazi <ghazi@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Apr 2003 19:58:57 +0000 (19:58 +0000)
(main): Test that we don't write too much data.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@65955 138bc75d-0d04-0410-961f-82ee72b054a4

libiberty/ChangeLog
libiberty/vsnprintf.c

index 027fe91..ae5a7c5 100644 (file)
@@ -1,3 +1,8 @@
+2003-04-22  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+       * vsnprintf.c (vsnprintf): Don't pad string with extra nulls.
+       (main): Test that we don't write too much data.
+
 2003-04-16  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * configure.in (funcs, AC_CHECK_FUNCS): Add snprintf and
index 9328e43..fd3dd18 100644 (file)
@@ -78,9 +78,13 @@ vsnprintf (s, n, format, ap)
   result = strlen (buf);
   if (n > 0)
     {
-      strncpy (s, buf, n);
-      if (n - 1 < (size_t) result)
-       s[n - 1] = 0;
+      if ((long) n > result)
+       memcpy (s, buf, result+1);
+      else
+        {
+         memcpy (s, buf, n-1);
+         s[n - 1] = 0;
+       }
     }
   free (buf);
   return result;
@@ -114,35 +118,35 @@ main ()
   
   CLEAR (buf);
   status = checkit (buf, 10, "%s:%d", "foobar", 9);
-  VERIFY (status==8 && strcmp (buf, "foobar:9") == 0);
+  VERIFY (status==8 && memcmp (buf, "foobar:9\0XXXXX\0", 15) == 0);
 
   CLEAR (buf);
   status = checkit (buf, 9, "%s:%d", "foobar", 9);
-  VERIFY (status==8 && strcmp (buf, "foobar:9") == 0);
+  VERIFY (status==8 && memcmp (buf, "foobar:9\0XXXXX\0", 15) == 0);
 
   CLEAR (buf);
   status = checkit (buf, 8, "%s:%d", "foobar", 9);
-  VERIFY (status==8 && strcmp (buf, "foobar:") == 0);
+  VERIFY (status==8 && memcmp (buf, "foobar:\0XXXXXX\0", 15) == 0);
 
   CLEAR (buf);
   status = checkit (buf, 7, "%s:%d", "foobar", 9);
-  VERIFY (status==8 && strcmp (buf, "foobar") == 0);
+  VERIFY (status==8 && memcmp (buf, "foobar\0XXXXXXX\0", 15) == 0);
 
   CLEAR (buf);
   status = checkit (buf, 6, "%s:%d", "foobar", 9);
-  VERIFY (status==8 && strcmp (buf, "fooba") == 0);
+  VERIFY (status==8 && memcmp (buf, "fooba\0XXXXXXXX\0", 15) == 0);
 
   CLEAR (buf);
   status = checkit (buf, 2, "%s:%d", "foobar", 9);
-  VERIFY (status==8 && strcmp (buf, "f") == 0);
+  VERIFY (status==8 && memcmp (buf, "f\0XXXXXXXXXXXX\0", 15) == 0);
 
   CLEAR (buf);
   status = checkit (buf, 1, "%s:%d", "foobar", 9);
-  VERIFY (status==8 && strcmp (buf, "") == 0);
+  VERIFY (status==8 && memcmp (buf, "\0XXXXXXXXXXXXX\0", 15) == 0);
 
   CLEAR (buf);
   status = checkit (buf, 0, "%s:%d", "foobar", 9);
-  VERIFY (status==8 && strcmp (buf, "XXXXXXXXXXXXXX") == 0);
+  VERIFY (status==8 && memcmp (buf, "XXXXXXXXXXXXXX\0", 15) == 0);
 
   return 0;
 }