This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[PATCH] Fix strnlen


Hi!

Matt Wilson found that strnlen("foo", -1) now gives wrong answer.
Following patch should fix it, provided that we don't care about wrapping
around in address space (otherwise we'd have to decrease len and increase
ptr in each step instead of just increasing ptr).

2001-08-27  Jakub Jelinek  <jakub@redhat.com>

	* string/tst-strlen.c (main): Test strnlen (, -1) too.
	* sysdeps/generic/strnlen.c (__strnlen): Fix for maxlens with top
	bit set.

--- libc/string/tst-strlen.c.jj	Sat Jul  4 12:28:00 1998
+++ libc/string/tst-strlen.c	Mon Aug 27 22:56:58 2001
@@ -31,7 +31,8 @@ main(int argc, char *argv[])
 	      buf[words * 4 + 3] = (last & 8) != 0 ? 'e' : '\0';
 	      buf[words * 4 + 4] = '\0';
 
-	      if (strlen (buf) != words * 4 + lens[last])
+	      if (strlen (buf) != words * 4 + lens[last]
+		  || strnlen (buf, -1) != words * 4 + lens[last])
 		{
 		  printf ("failed for base=%Zu, words=%Zu, and last=%Zu\n",
 			  base, words, last);
--- libc/sysdeps/generic/strnlen.c.jj	Wed Aug 22 18:57:24 2001
+++ libc/sysdeps/generic/strnlen.c	Mon Aug 27 22:54:43 2001
@@ -36,6 +36,9 @@ __strnlen (const char *str, size_t maxle
   if (maxlen == 0)
     return 0;
 
+  if (__builtin_expect (end_ptr < str, 0))
+    end_ptr = (const char *) ~0UL;
+
   /* Handle the first few characters by reading one character at a time.
      Do this until CHAR_PTR is aligned on a longword boundary.  */
   for (char_ptr = str; ((unsigned long int) char_ptr

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]