summary refs log tree commit diff
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2006-02-20 21:48:49 +0000
committerRoland McGrath <roland@gnu.org>2006-02-20 21:48:49 +0000
commit24d58fb41db26300aa7ebfdf7b373860f636979a (patch)
treef513237bfb4238bd5f54277bb94c1b05178dea0f
parent25bc77e6da7f3f767ec002d2cbb022803229a1d9 (diff)
downloadglibc-24d58fb41db26300aa7ebfdf7b373860f636979a.tar.gz
glibc-24d58fb41db26300aa7ebfdf7b373860f636979a.tar.xz
glibc-24d58fb41db26300aa7ebfdf7b373860f636979a.zip
* string/tester.c (test_strnlen): New function.
	(test_strchr): Call it.
	(test_strncat): Test lengths where the sign bit is set.
	(test_strncmp): Likewise.
-rw-r--r--ChangeLog7
-rw-r--r--string/tester.c31
2 files changed, 38 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 7d478859dc..ac56616287 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2006-02-13  Mike Frysinger  <vapier@gentoo.org>
+
+	* string/tester.c (test_strnlen): New function.
+	(test_strchr): Call it.
+	(test_strncat): Test lengths where the sign bit is set.
+	(test_strncmp): Likewise.
+
 2006-02-17  Jakub Jelinek  <jakub@redhat.com>
 
 	* include/atomic.h (atomic_and, atomic_or): Define.
diff --git a/string/tester.c b/string/tester.c
index f95270efb4..cccef3ad9d 100644
--- a/string/tester.c
+++ b/string/tester.c
@@ -344,6 +344,9 @@ test_strncat (void)
 
   (void) strncat (one, "gh", 2);
   equal (one, "abcdgh", 12);		/* Count and length equal. */
+
+  (void) strncat (one, "ij", (size_t)-1);	/* set sign bit in count */
+  equal (one, "abcdghij", 13);
 }
 
 static void
@@ -364,6 +367,8 @@ test_strncmp (void)
   check (strncmp ("abce", "abc", 3) == 0, 11);	/* Count == length. */
   check (strncmp ("abcd", "abce", 4) < 0, 12);	/* Nudging limit. */
   check (strncmp ("abc", "def", 0) == 0, 13);	/* Zero count. */
+  check (strncmp ("abc", "", (size_t)-1) > 0, 14);	/* set sign bit in count */
+  check (strncmp ("abc", "abc", (size_t)-2) == 0, 15);
 }
 
 static void
@@ -430,6 +435,29 @@ test_strlen (void)
 }
 
 static void
+test_strnlen (void)
+{
+  it = "strnlen";
+  check (strnlen ("", 10) == 0, 1);		/* Empty. */
+  check (strnlen ("a", 10) == 1, 2);		/* Single char. */
+  check (strnlen ("abcd", 10) == 4, 3);		/* Multiple chars. */
+  check (strnlen ("foo", (size_t)-1) == 3, 4);	/* limits of n. */
+
+  {
+    char buf[4096];
+    int i;
+    char *p;
+    for (i=0; i < 0x100; i++)
+      {
+	p = (char *) ((unsigned long int)(buf + 0xff) & ~0xff) + i;
+	strcpy (p, "OK");
+	strcpy (p+3, "BAD/WRONG");
+	check (strnlen (p, 100) == 2, 5+i);
+      }
+   }
+}
+
+static void
 test_strchr (void)
 {
   it = "strchr";
@@ -1382,6 +1410,9 @@ main (void)
   /* strlen.  */
   test_strlen ();
 
+  /* strnlen.  */
+  test_strnlen ();
+
   /* strchr.  */
   test_strchr ();