diff mbox series

Check that strnlen won't go beyond the maximum length

Message ID 20210327162449.3215538-1-hjl.tools@gmail.com
State New
Headers show
Series Check that strnlen won't go beyond the maximum length | expand

Commit Message

H.J. Lu March 27, 2021, 4:24 p.m. UTC
Run strnlen tests on strings without the null byte around the page
boundary.
---
 string/test-strnlen.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

Comments

Florian Weimer March 27, 2021, 5:51 p.m. UTC | #1
* H. J. Lu via Libc-alpha:

> Run strnlen tests on strings without the null byte around the page
> boundary.
> ---
>  string/test-strnlen.c | 26 ++++++++++++++++++++++++++
>  1 file changed, 26 insertions(+)
>
> diff --git a/string/test-strnlen.c b/string/test-strnlen.c
> index 61eb521dc1..a49d93afa2 100644
> --- a/string/test-strnlen.c
> +++ b/string/test-strnlen.c
> @@ -196,6 +196,31 @@ do_page_tests (void)
>      }
>  }
>  
> +/* Tests meant to unveil fail on implementation that does not access bytes
> +   without the null character around the page boundary accordingly.  */

I don't understand the comment.  Based on it, I would have expected a
null byte at the page boundary, which is incorrectly ignored by the
implementation.

> +static void
> +do_page_2_tests (void)
> +{
> +  size_t i, exp_len, offset;
> +  size_t last_offset = page_size / sizeof (CHAR);
> +
> +  CHAR *s = (CHAR *) buf2;
> +  memset (s, 65, page_size);

I think this needs to use wmemset for the WIDE case, see
wcsmbs/test-wcsnlen.c.
diff mbox series

Patch

diff --git a/string/test-strnlen.c b/string/test-strnlen.c
index 61eb521dc1..a49d93afa2 100644
--- a/string/test-strnlen.c
+++ b/string/test-strnlen.c
@@ -196,6 +196,31 @@  do_page_tests (void)
     }
 }
 
+/* Tests meant to unveil fail on implementation that does not access bytes
+   without the null character around the page boundary accordingly.  */
+static void
+do_page_2_tests (void)
+{
+  size_t i, exp_len, offset;
+  size_t last_offset = page_size / sizeof (CHAR);
+
+  CHAR *s = (CHAR *) buf2;
+  memset (s, 65, page_size);
+
+  /* Place short strings ending at page boundary.  */
+  offset = last_offset;
+  for (i = 0; i < 128; i++)
+    {
+      /* Decrease offset to stress several sizes and alignments.  */
+      offset--;
+      exp_len = last_offset - offset;
+      FOR_EACH_IMPL (impl, 0)
+        {
+          do_one_test (impl, (CHAR *) (s + offset), exp_len, exp_len);
+        }
+    }
+}
+
 int
 test_main (void)
 {
@@ -242,6 +267,7 @@  test_main (void)
 
   do_random_tests ();
   do_page_tests ();
+  do_page_2_tests ();
   return ret;
 }