diff options
author | Eric Blake <eblake@redhat.com> | 2010-10-06 13:48:07 -0400 |
---|---|---|
committer | Petr Baudis <pasky@suse.cz> | 2010-11-01 22:25:06 +0100 |
commit | 831daea2c92d35caeba600e9d9052348466e2d83 (patch) | |
tree | 8deee151b31f10d887ea50b8464f714e0d826ad0 | |
parent | 38e894eec8a26e302859840cd1f2de4387e24357 (diff) | |
download | glibc-831daea2c92d35caeba600e9d9052348466e2d83.tar.gz glibc-831daea2c92d35caeba600e9d9052348466e2d83.tar.xz glibc-831daea2c92d35caeba600e9d9052348466e2d83.zip |
Fix strstr and memmem algorithm.
(cherry picked from commit 5fb308bca2f333dcc835945be85e165cd7843d5b)
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | string/bug-strstr1.c | 26 | ||||
-rw-r--r-- | string/str-two-way.h | 2 |
3 files changed, 33 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog index 08e448c309..b83a6b11a1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2010-10-05 Eric Blake <eblake@redhat.com> + + [BZ #12092] + * string/str-two-way.h (two_way_long_needle): Always clear memory + when skipping input due to the shift table. + 2010-10-03 Ulrich Drepper <drepper@gmail.com> [BZ #12077] diff --git a/string/bug-strstr1.c b/string/bug-strstr1.c new file mode 100644 index 0000000000..889de12955 --- /dev/null +++ b/string/bug-strstr1.c @@ -0,0 +1,26 @@ +#include <stdio.h> +#include <string.h> + +int main (int argc, char** argv) +{ + const char haystack[] = + "F_BD_CE_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD_C3_88_20_EF_BF_BD_EF_BF_BD_EF_BF_BD_C3_A7_20_EF_BF_BD"; + + const char needle[] = + "_EF_BF_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD"; + + const char* sub = strstr (haystack, needle); + + if (sub != NULL) + { + int j; + + fprintf (stderr, "BUG: expected NULL, got:\n%s\n%s\n", sub, needle); + for (j = 0; needle[j] != '\0'; ++j) + putchar (needle[j] == sub[j] ? ' ' : '^'); + puts (""); + return 1; + } + + return 0; +} diff --git a/string/str-two-way.h b/string/str-two-way.h index 87ed8a0366..73c99d9188 100644 --- a/string/str-two-way.h +++ b/string/str-two-way.h @@ -350,8 +350,8 @@ two_way_long_needle (const unsigned char *haystack, size_t haystack_len, a byte out of place, there can be no match until after the mismatch. */ shift = needle_len - period; - memory = 0; } + memory = 0; j += shift; continue; } |