about summary refs log tree commit diff
path: root/string/strcasestr.c
diff options
context:
space:
mode:
authorWilco Dijkstra <wdijkstr@arm.com>2018-09-19 16:50:18 +0100
committerWilco Dijkstra <wdijkstr@arm.com>2018-09-19 16:50:18 +0100
commit83a552b0bb9fc2a5e80a0ab3723c0a80ce1db9f2 (patch)
tree4861e51f5b6524e080ca62aefceb6a1d052fc652 /string/strcasestr.c
parentd734727837b5135c4c4c540d8c53e5a06aa7556a (diff)
downloadglibc-83a552b0bb9fc2a5e80a0ab3723c0a80ce1db9f2.tar.gz
glibc-83a552b0bb9fc2a5e80a0ab3723c0a80ce1db9f2.tar.xz
glibc-83a552b0bb9fc2a5e80a0ab3723c0a80ce1db9f2.zip
Fix strstr bug with huge needles (bug 23637)
The generic strstr in GLIBC 2.28 fails to match huge needles.  The optimized
AVAILABLE macro reads ahead a large fixed amount to reduce the overhead of
repeatedly checking for the end of the string.  However if the needle length
is larger than this, two_way_long_needle may confuse this as meaning the end
of the string and return NULL.  This is fixed by adding the needle length to
the amount to read ahead.

	[BZ #23637]
	* string/test-strstr.c (pr23637): New function.
	(test_main): Add tests with longer needles.
	* string/strcasestr.c (AVAILABLE): Fix readahead distance.
	* string/strstr.c (AVAILABLE): Likewise.
Diffstat (limited to 'string/strcasestr.c')
-rw-r--r--string/strcasestr.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/string/strcasestr.c b/string/strcasestr.c
index 1f6b7b846f..8aa76037dc 100644
--- a/string/strcasestr.c
+++ b/string/strcasestr.c
@@ -37,8 +37,9 @@
 /* Two-Way algorithm.  */
 #define RETURN_TYPE char *
 #define AVAILABLE(h, h_l, j, n_l)			\
-  (((j) + (n_l) <= (h_l)) || ((h_l) += __strnlen ((void*)((h) + (h_l)), 512), \
-			      (j) + (n_l) <= (h_l)))
+  (((j) + (n_l) <= (h_l)) \
+   || ((h_l) += __strnlen ((void*)((h) + (h_l)), (n_l) + 512), \
+       (j) + (n_l) <= (h_l)))
 #define CHECK_EOL (1)
 #define RET0_IF_0(a) if (!a) goto ret0
 #define CANON_ELEMENT(c) TOLOWER (c)