unistr/u8-strchr: Fix several bugs.
authorBruno Haible <bruno@clisp.org>
Sat, 31 Jul 2010 19:28:55 +0000 (21:28 +0200)
committerBruno Haible <bruno@clisp.org>
Sat, 31 Jul 2010 19:28:55 +0000 (21:28 +0200)
ChangeLog
lib/unistr/u8-strchr.c

index 264945825fb6ebb0666c14410504c68b8bc401a7..8c83dff08de5e275cfc6005bb34416fc10b894a0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2010-07-31  Bruno Haible  <bruno@clisp.org>
 
+       unistr/u8-strchr: Fix several bugs.
+       * lib/unistr/u8-strchr.c (u8_strchr): Don't search beyond the end of
+       the string. When not found, return NULL, not a pointer near the end.
+
        More tests for unistr/u8-strchr.
        * tests/unistr/test-strchr.h (test_strchr): Renamed from main. Check
        that the function does not read past the first occurrence of the byte
index 03d6138adc51ef1b2367c2807c9bcb312e9fe1b9..a67b8f322e9016d349ee214c3d4a8b1108fefae1 100644 (file)
@@ -62,7 +62,7 @@ u8_strchr (const uint8_t *s, ucs4_t uc)
     switch (u8_uctomb_aux (c, uc, 6))
       {
       case 2:
-        if (*s == 0)
+        if (*s == 0 || s[1] == 0)
           break;
         {
           uint8_t c0 = c[0];
@@ -96,11 +96,11 @@ u8_strchr (const uint8_t *s, ucs4_t uc)
               if (s[1] == 0)
                 break;
             }
-          return (uint8_t *) s;
         }
+        break;
 
       case 3:
-        if (*s == 0 || s[1] == 0)
+        if (*s == 0 || s[1] == 0 || s[2] == 0)
           break;
         {
           uint8_t c0 = c[0];
@@ -147,7 +147,7 @@ u8_strchr (const uint8_t *s, ucs4_t uc)
         }
 
       case 4:
-        if (*s == 0 || s[1] == 0 || s[2] == 0)
+        if (*s == 0 || s[1] == 0 || s[2] == 0 || s[3] == 0)
           break;
         {
           uint8_t c0 = c[0];