fix search past the end of haystack in memmem
authorTimo Teräs <timo.teras@iki.fi>
Thu, 10 Apr 2014 01:06:17 +0000 (21:06 -0400)
committerRich Felker <dalias@aerifal.cx>
Wed, 16 Apr 2014 06:46:05 +0000 (02:46 -0400)
to optimize the search, memchr is used to find the first occurrence of
the first character of the needle in the haystack before switching to
a search for the full needle. however, the number of characters
skipped by this first step were not subtracted from the haystack
length, causing memmem to search past the end of the haystack.

(cherry picked from commit 6fbdeff0e51f6afc38fbb1476a4db81322779da4)

src/string/memmem.c

index 5211d7599884478984466ab1447eb0991bdbdf08..a5a249f2ca04a350e77d9bc7ff1ca31891b32c1b 100644 (file)
@@ -139,6 +139,7 @@ void *memmem(const void *h0, size_t k, const void *n0, size_t l)
        /* Use faster algorithms for short needles */
        h = memchr(h0, *n, k);
        if (!h || l==1) return (void *)h;
+       k -= h - (const unsigned char *)h0;
        if (l==2) return twobyte_memmem(h, k, n);
        if (l==3) return threebyte_memmem(h, k, n);
        if (l==4) return fourbyte_memmem(h, k, n);