diff options
-rw-r--r-- | ChangeLog | 14 | ||||
-rw-r--r-- | string/Makefile | 4 | ||||
-rw-r--r-- | string/tst-strcoll-overflow.c | 38 |
3 files changed, 32 insertions, 24 deletions
@@ -1,3 +1,17 @@ +2017-01-25 Florian Weimer <fweimer@redhat.com> + + * string/Makefile (xtests): Add comment. + (LOCALES): Add en_GB.UTF-8. + (tst-strcoll-overflow.out): Depend on generated locales. + * string/tst-strcoll-overflow.c: Convert to support/test-driver.c. + (SIZE, TIMEOUT): Update comments. + (do_test): Define as static. Fail test if setlocale fails. + Return EXIT_UNSUPPORTED if insufficient memory. Enhance output + messages. + (EXPECTED_SIGNAL, EXPECTED_STATUS, TEST_FUNCTION): Remove. + TIMEOUT at 300 seconds should be enough to run this test + successfully. + 2017-01-24 Jakub Jelinek <jakub@redhat.com> * soft-fp/op-common.h (_FP_MUL, _FP_FMA, _FP_DIV): Add diff --git a/string/Makefile b/string/Makefile index 901c4d4..f317d02 100644 --- a/string/Makefile +++ b/string/Makefile @@ -59,6 +59,7 @@ tests := tester inl-tester noinl-tester testcopy test-ffs \ tst-strtok_r bug-strcoll2 tst-cmp tst-xbzero-opt \ test-endian-types +# This test allocates a lot of memory and can run for a long time. xtests = tst-strcoll-overflow ifeq ($(run-built-tests),yes) @@ -94,7 +95,7 @@ $(objpfx)tst-svc-cmp.out: tst-svc.expect $(objpfx)tst-svc.out LOCALES := de_DE.UTF-8 en_US.ISO-8859-1 en_US.UTF-8 \ tr_TR.ISO-8859-9 tr_TR.UTF-8 cs_CZ.UTF-8 \ - da_DK.ISO-8859-1 + da_DK.ISO-8859-1 en_GB.UTF-8 include ../gen-locales.mk $(objpfx)test-strcasecmp.out: $(gen-locales) @@ -103,5 +104,6 @@ $(objpfx)tst-strxfrm.out: $(gen-locales) $(objpfx)tst-strxfrm2.out: $(gen-locales) # bug-strcoll2 needs cs_CZ.UTF-8 and da_DK.ISO-8859-1. $(objpfx)bug-strcoll2.out: $(gen-locales) +$(objpfx)tst-strcoll-overflow.out: $(gen-locales) endif diff --git a/string/tst-strcoll-overflow.c b/string/tst-strcoll-overflow.c index ab76736..ee694b6 100644 --- a/string/tst-strcoll-overflow.c +++ b/string/tst-strcoll-overflow.c @@ -21,42 +21,34 @@ #include <stdlib.h> #include <string.h> -/* Verify that strcoll does not crash for large strings for which it cannot - cache weight lookup results. The size is large enough to cause integer - overflows on 32-bit as well as buffer overflows on 64-bit. The test should - work reasonably reliably when overcommit is disabled, but it obviously - depends on how much memory the system has. There's a limitation to this - test in that it does not run to completion. Actually collating such a - large string can take days and we can't have xcheck running that long. For - that reason, we run the test for about 5 minutes and then assume that - everything is fine if there are no crashes. */ +#include <support/check.h> +#include <support/test-driver.h> + +/* Verify that strcoll does not crash for large strings for which it + cannot cache weight lookup results. The size is large enough to + cause integer overflows on 32-bit as well as buffer overflows on + 64-bit. */ #define SIZE 0x40000000ul -int +static int do_test (void) { - if (setlocale (LC_COLLATE, "en_GB.UTF-8") == NULL) - { - puts ("setlocale failed, cannot test for overflow"); - return 0; - } + TEST_VERIFY_EXIT (setlocale (LC_COLLATE, "en_GB.UTF-8") != NULL); char *p = malloc (SIZE); - if (p == NULL) { - puts ("could not allocate memory"); - return 1; + puts ("info: could not allocate memory, cannot run test"); + return EXIT_UNSUPPORTED; } memset (p, 'x', SIZE - 1); p[SIZE - 1] = 0; - printf ("%d\n", strcoll (p, p)); + printf ("info: strcoll result: %d\n", strcoll (p, p)); return 0; } +/* This test can rung for a long time, but it should complete within + this time on reasonably current hardware. */ #define TIMEOUT 300 -#define EXPECTED_SIGNAL SIGALRM -#define EXPECTED_STATUS 0 -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" +#include <support/test-driver.c> |