[PATCH] string: Improve test-memchr page cross checks
Wilco Dijkstra
Wilco.Dijkstra@arm.com
Fri May 8 11:14:34 GMT 2026
The tests for memchr attempt to check for accidental overreads that cross a page.
However they weren't done at the end of a page and don't check for the case where
we match right at the end.
OK for commit?
---
diff --git a/string/test-memchr.c b/string/test-memchr.c
index 434b50d0271668100a3d3b984021e1decc458fd8..d6da65df904ce0c3be7256b36fcc2d9474ae04f8 100644
--- a/string/test-memchr.c
+++ b/string/test-memchr.c
@@ -98,10 +98,10 @@ do_test (size_t align, size_t pos, size_t len, size_t n, int seek_char)
}
buf[align + len] = 0;
- if (pos < MIN(n, len))
+ if (pos < MIN (n, len) || (pos == len && n > len))
{
- buf[align + pos] = seek_char;
buf[align + len] = -seek_char;
+ buf[align + pos] = seek_char;
result = (CHAR *) (buf + align + pos);
}
else
@@ -257,12 +257,15 @@ test_main (void)
with address near end of the page. */
for (i = 2; i < 16; ++i)
{
- /* page_size is in fact getpagesize() * 2. */
- do_test (page_size / 2 - i, i, i, 1, 0x9B);
- do_test (page_size / 2 - i, i - 1, i - 1, 1, 0x9B);
- do_test (page_size / 2 - (i * 4), i + 128, i + 128, i, 0x9B);
+ do_test (page_size - i, i, i, 1, 0x9B);
+ do_test (page_size - i, i - 1, i - 1, 1, 0x9B);
+ do_test (page_size - (i * 4), i + 128, i + 128, i, 0x9B);
}
+ /* Check memchr won't overread after matching at the end of a page. */
+ for (i = 1; i <= 256; i += 5)
+ do_test (page_size - i - 1, i, i, 1024, 0x9B);
+
do_random_tests ();
do_overflow_tests ();
return ret;
More information about the Libc-alpha
mailing list