fix false negatives with periodic needles in strstr, wcsstr, and memmem
authorRich Felker <dalias@aerifal.cx>
Fri, 18 Apr 2014 21:38:35 +0000 (17:38 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 20 May 2014 21:58:24 +0000 (17:58 -0400)
in cases where the memorized match range from the right factor
exceeded the length of the left factor, it was wrongly treated as a
mismatch rather than a match.

issue reported by Yves Bastide.

(cherry picked from commit 476cd1d96560aaf7f210319597556e7fbcd60469)

src/string/memmem.c
src/string/strstr.c
src/string/wcsstr.c

index a5a249f2ca04a350e77d9bc7ff1ca31891b32c1b..3b1ae18316a1d355bc6e2eabb46648060cf7decb 100644 (file)
@@ -120,7 +120,7 @@ static char *twoway_memmem(const unsigned char *h, const unsigned char *z, const
                }
                /* Compare left half */
                for (k=ms+1; k>mem && n[k-1] == h[k-1]; k--);
-               if (k == mem) return (char *)h;
+               if (k <= mem) return (char *)h;
                h += p;
                mem = mem0;
        }
index 915c0a22f6c239125bafbec63571519d9ac52bd7..cd0691275b2e4880853837738a1569ad1d06fc80 100644 (file)
@@ -130,7 +130,7 @@ static char *twoway_strstr(const unsigned char *h, const unsigned char *n)
                }
                /* Compare left half */
                for (k=ms+1; k>mem && n[k-1] == h[k-1]; k--);
-               if (k == mem) return (char *)h;
+               if (k <= mem) return (char *)h;
                h += p;
                mem = mem0;
        }
index 3e28e287f25fa7a8f51f3da15f7cf342bd1ab0e4..4caaef3c94bf1a43ec462264fad90ca914c82da0 100644 (file)
@@ -84,7 +84,7 @@ static wchar_t *twoway_wcsstr(const wchar_t *h, const wchar_t *n)
                }
                /* Compare left half */
                for (k=ms+1; k>mem && n[k-1] == h[k-1]; k--);
-               if (k == mem) return (wchar_t *)h;
+               if (k <= mem) return (wchar_t *)h;
                h += p;
                mem = mem0;
        }