[glibc] string: Improve test-memchr page cross checks
Wilco Dijkstra via Glibc-cvs <[email protected]> Thu, 21 May 2026 16:18:37 +0000 (GMT)
| Newsgroups | gmane.comp.lib.glibc.cvs |
|---|---|
| Message-ID | <[email protected]> |
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=746a560a6296820c6df6eaf2fcc61008ece4b2bb commit 746a560a6296820c6df6eaf2fcc61008ece4b2bb Author: Wilco Dijkstra <[email protected]> Date: Fri May 8 11:06:23 2026 +0000 string: Improve test-memchr page cross checks 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. Add buf1_size/buf2_size to make finding end of buffer easier. Reviewed-by: Yury Khrustalev <[email protected]> Diff: --- string/test-memchr.c | 25 +++++++++++-------------- string/test-string.h | 5 ++++- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/string/test-memchr.c b/string/test-memchr.c index 434b50d027..df9ce0f22c 100644 --- a/string/test-memchr.c +++ b/string/test-memchr.c @@ -85,30 +85,25 @@ do_test (size_t align, size_t pos, size_t len, size_t n, int seek_char) size_t i; CHAR *result; - if ((align + len) * sizeof (CHAR) >= page_size) + if ((align + len) * sizeof (CHAR) >= buf1_size) return; CHAR *buf = (CHAR *) (buf1); - for (i = 0; i < len; ++i) + for (i = 0; i <= len; ++i) { buf[align + i] = 1 + 23 * i % SMALL_CHAR; if (buf[align + i] == seek_char) buf[align + i] = seek_char + 1; } - 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; result = (CHAR *) (buf + align + pos); } else - { - result = NULL; - buf[align + len] = seek_char; - } + result = NULL; FOR_EACH_IMPL (impl, 0) do_one_test (impl, (CHAR *) (buf + align), seek_char, n, result); @@ -152,7 +147,7 @@ do_random_tests (void) size_t i, j, n, align, pos, len; int seek_char; CHAR *result; - UCHAR *p = (UCHAR *) (buf1 + page_size) - 512; + UCHAR *p = (UCHAR *) (buf1 + buf1_size) - 512; for (n = 0; n < ITERATIONS; n++) { @@ -257,12 +252,14 @@ 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 ((buf1_size / sizeof(CHAR)) - i, i - 1, i - 1, 1, 0x9B); + do_test ((buf1_size / sizeof(CHAR)) - (i * 4), 128, i * 4 - 1, i, 0x9B); } + /* Check memchr won't overread after matching at the end of a page. */ + for (i = 1; i <= 256; i += 5) + do_test ((buf1_size / sizeof(CHAR)) - i - 1, i, i, 1024, 0x9B); + do_random_tests (); do_overflow_tests (); return ret; diff --git a/string/test-string.h b/string/test-string.h index f287766227..bc7e8fd0df 100644 --- a/string/test-string.h +++ b/string/test-string.h @@ -69,7 +69,7 @@ extern impl_t __start_impls[], __stop_impls[]; unsigned char *buf1, *buf2; int ret, do_srandom; unsigned int seed; -size_t page_size; +size_t page_size, buf1_size, buf2_size; # ifndef ITERATIONS size_t iterations = 100000; @@ -207,6 +207,9 @@ test_init (void) memset (buf1, 0xa5, BUF1PAGES * page_size); memset (buf2, 0x5a, page_size); + + buf1_size = BUF1PAGES * page_size; + buf2_size = page_size; } #endif