From bb5bb87cd2aa7462c88a11c69aa736ca62fd7cd8 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Wed, 26 Jun 2013 15:23:08 -0700 Subject: [PATCH] Add a test for BZ #15674 --- ChangeLog | 3 +++ string/test-memcmp.c | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/ChangeLog b/ChangeLog index fd3a90f87a..37db6c0a11 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,9 @@ 2013-06-26 Liubov Dmitrieva [BZ #15674] + * string/test-memcmp.c (check2): New. + (main): Call check2. + * sysdeps/x86_64/multiarch/memcmp-ssse3.S: Fix buffers overrun. 2013-06-26 Maciej W. Rozycki diff --git a/string/test-memcmp.c b/string/test-memcmp.c index b30e34d0e4..0420cd0b7b 100644 --- a/string/test-memcmp.c +++ b/string/test-memcmp.c @@ -448,6 +448,29 @@ check1 (void) } } +/* This test checks that memcmp doesn't overrun buffers. */ +static void +check2 (void) +{ + size_t max_length = page_size / sizeof (CHAR); + + /* Initialize buf2 to the same values as buf1. The bug requires the + last compared byte to be different. */ + memcpy (buf2, buf1, page_size); + ((char *) buf2)[page_size - 1] ^= 0x11; + + for (size_t length = 1; length < max_length; length++) + { + CHAR *s1 = (CHAR *) buf1 + max_length - length; + CHAR *s2 = (CHAR *) buf2 + max_length - length; + + const int exp_result = SIMPLE_MEMCMP (s1, s2, length); + + FOR_EACH_IMPL (impl, 0) + check_result (impl, s1, s2, length, exp_result); + } +} + int test_main (void) { @@ -456,6 +479,7 @@ test_main (void) test_init (); check1 (); + check2 (); printf ("%23s", ""); FOR_EACH_IMPL (impl, 0) -- 2.11.4.GIT