From c5bb8e2399f55c09a98c66936940ba744b5841da Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Sun, 29 Dec 2013 23:13:20 +0000 Subject: [PATCH] tests: unify fortification handler logic We have multiple tests that copy & paste the same logic for disabling the fortification output. Let's unify this in the test-skeleton instead. Signed-off-by: Mike Frysinger --- ChangeLog | 10 ++++++++++ benchtests/bench-strcpy_chk.c | 25 +++++-------------------- debug/test-strcpy_chk.c | 26 ++++++-------------------- debug/tst-chk1.c | 21 ++------------------- debug/tst-longjmp_chk.c | 27 +++++++-------------------- test-skeleton.c | 28 ++++++++++++++++++++++++++++ 6 files changed, 58 insertions(+), 79 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4e0aab0125..610eef671a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2014-02-08 Mike Frysinger + + * benchtests/bench-strcpy_chk.c: Move test-skeleton.c to top. + (test_main): Replace code with set_fortify_handler call. + * debug/test-strcpy_chk.c: Likewise. + * debug/tst-chk1.c: Likewise. + * debug/tst-longjmp_chk.c: Likewise. + * test-skeleton.c: Include fcntl.h & paths.h + (set_fortify_handler): Define. + 2014-02-08 Mike Frysinger * debug/tst-longjmp_chk.c: Add header comment and include diff --git a/benchtests/bench-strcpy_chk.c b/benchtests/bench-strcpy_chk.c index 8accb61716..828c9bce0c 100644 --- a/benchtests/bench-strcpy_chk.c +++ b/benchtests/bench-strcpy_chk.c @@ -53,6 +53,9 @@ simple_strcpy_chk (char *dst, const char *src, size_t len) #include #include +static int test_main (void); +#include "../test-skeleton.c" + volatile int chk_fail_ok; jmp_buf chk_fail_buf; @@ -156,28 +159,12 @@ do_test (size_t align1, size_t align2, size_t len, size_t dlen, int max_char) putchar ('\n'); } -int +static int test_main (void) { size_t i; - struct sigaction sa; - sa.sa_handler = handler; - sa.sa_flags = 0; - sigemptyset (&sa.sa_mask); - - sigaction (SIGABRT, &sa, NULL); - - /* Avoid all the buffer overflow messages on stderr. */ - int fd = open (_PATH_DEVNULL, O_WRONLY); - if (fd == -1) - close (STDERR_FILENO); - else - { - dup2 (fd, STDERR_FILENO); - close (fd); - } - setenv ("LIBC_FATAL_STDERR_", "1", 1); + set_fortify_handler (handler); test_init (); @@ -254,5 +241,3 @@ test_main (void) return 0; } - -#include "../test-skeleton.c" diff --git a/debug/test-strcpy_chk.c b/debug/test-strcpy_chk.c index 62a581d190..0e683becf1 100644 --- a/debug/test-strcpy_chk.c +++ b/debug/test-strcpy_chk.c @@ -54,6 +54,10 @@ simple_strcpy_chk (char *dst, const char *src, size_t len) #include #include +static int test_main (void); +#define TEST_FUNCTION test_main () +#include "../test-skeleton.c" + volatile int chk_fail_ok; jmp_buf chk_fail_buf; @@ -266,28 +270,12 @@ Iteration %zd - different strings, %s (%zd, %zd, %zd)\n", } } -int +static int test_main (void) { size_t i; - struct sigaction sa; - sa.sa_handler = handler; - sa.sa_flags = 0; - sigemptyset (&sa.sa_mask); - - sigaction (SIGABRT, &sa, NULL); - - /* Avoid all the buffer overflow messages on stderr. */ - int fd = open (_PATH_DEVNULL, O_WRONLY); - if (fd == -1) - close (STDERR_FILENO); - else - { - dup2 (fd, STDERR_FILENO); - close (fd); - } - setenv ("LIBC_FATAL_STDERR_", "1", 1); + set_fortify_handler (handler); test_init (); @@ -365,5 +353,3 @@ test_main (void) do_random_tests (); return ret; } - -#include "../test-skeleton.c" diff --git a/debug/tst-chk1.c b/debug/tst-chk1.c index f0b86a0aa6..33931537cc 100644 --- a/debug/tst-chk1.c +++ b/debug/tst-chk1.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -119,23 +118,7 @@ int num2 = 987654; static int do_test (void) { - struct sigaction sa; - sa.sa_handler = handler; - sa.sa_flags = 0; - sigemptyset (&sa.sa_mask); - - sigaction (SIGABRT, &sa, NULL); - - /* Avoid all the buffer overflow messages on stderr. */ - int fd = open (_PATH_DEVNULL, O_WRONLY); - if (fd == -1) - close (STDERR_FILENO); - else - { - dup2 (fd, STDERR_FILENO); - close (fd); - } - setenv ("LIBC_FATAL_STDERR_", "1", 1); + set_fortify_handler (handler); struct A { char buf1[9]; char buf2[1]; } a; struct wA { wchar_t buf1[9]; wchar_t buf2[1]; } wa; @@ -1366,7 +1349,7 @@ do_test (void) ret = 1; } - fd = posix_openpt (O_RDWR); + int fd = posix_openpt (O_RDWR); if (fd != -1) { char enough[1000]; diff --git a/debug/tst-longjmp_chk.c b/debug/tst-longjmp_chk.c index dba1855f4a..e4e93d2a36 100644 --- a/debug/tst-longjmp_chk.c +++ b/debug/tst-longjmp_chk.c @@ -10,6 +10,12 @@ #include #include + +static int do_test(void); +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" + + static jmp_buf b; @@ -48,23 +54,7 @@ handler (int sig) static int do_test (void) { - struct sigaction sa; - sa.sa_handler = handler; - sa.sa_flags = 0; - sigemptyset (&sa.sa_mask); - - sigaction (SIGABRT, &sa, NULL); - - /* Avoid all the buffer overflow messages on stderr. */ - int fd = open (_PATH_DEVNULL, O_WRONLY); - if (fd == -1) - close (STDERR_FILENO); - else - { - dup2 (fd, STDERR_FILENO); - close (fd); - } - setenv ("LIBC_FATAL_STDERR_", "1", 1); + set_fortify_handler (handler); expected_to_fail = false; @@ -86,6 +76,3 @@ do_test (void) puts ("second longjmp returned"); return 1; } - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" diff --git a/test-skeleton.c b/test-skeleton.c index b08cfb596c..d7d2f750b7 100644 --- a/test-skeleton.c +++ b/test-skeleton.c @@ -18,8 +18,10 @@ . */ #include +#include #include #include +#include #include #include #include @@ -194,6 +196,32 @@ signal_handler (int sig __attribute__ ((unused))) exit (1); } +/* Set fortification error handler. Used when tests want to verify that bad + code is caught by the library. */ +static void +__attribute__ ((unused)) +set_fortify_handler (void (*handler) (int sig)) +{ + struct sigaction sa; + + sa.sa_handler = handler; + sa.sa_flags = 0; + sigemptyset (&sa.sa_mask); + + sigaction (SIGABRT, &sa, NULL); + + /* Avoid all the buffer overflow messages on stderr. */ + int fd = open (_PATH_DEVNULL, O_WRONLY); + if (fd == -1) + close (STDERR_FILENO); + else + { + dup2 (fd, STDERR_FILENO); + close (fd); + } + setenv ("LIBC_FATAL_STDERR_", "1", 1); +} + /* We provide the entry point here. */ int main (int argc, char *argv[])