[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