From 9a09e8291d1bd692b26684c2bb7d9379593e8846 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sat, 31 Jul 2010 21:28:55 +0200 Subject: [PATCH] unistr/u8-strchr: Fix several bugs. --- ChangeLog | 4 ++++ lib/unistr/u8-strchr.c | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 264945825..8c83dff08 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2010-07-31 Bruno Haible + 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 diff --git a/lib/unistr/u8-strchr.c b/lib/unistr/u8-strchr.c index 03d6138ad..a67b8f322 100644 --- a/lib/unistr/u8-strchr.c +++ b/lib/unistr/u8-strchr.c @@ -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]; -- 2.11.0