From: H.J. Lu Date: Wed, 26 Jun 2013 22:23:08 +0000 (-0700) Subject: Add a test for BZ #15674 X-Git-Tag: glibc-2.18~79 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bb5bb87cd2aa7462c88a11c69aa736ca62fd7cd8;p=thirdparty%2Fglibc.git Add a test for BZ #15674 --- diff --git a/ChangeLog b/ChangeLog index fd3a90f87a0..37db6c0a114 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 b30e34d0e43..0420cd0b7b6 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)