diff options
author | Florian Weimer <fweimer@redhat.com> | 2016-06-13 13:08:39 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2016-06-13 16:36:46 +0200 |
commit | 2c41b52901331f5c761015af786a3976e225d779 (patch) | |
tree | 01a09edb1fb8aeb35cc5ad8525be286d08e181ca | |
parent | f5c77f78ec03363d5e550c4996deb75ee3f2e32a (diff) | |
download | glibc-2c41b52901331f5c761015af786a3976e225d779.tar.gz glibc-2c41b52901331f5c761015af786a3976e225d779.tar.xz glibc-2c41b52901331f5c761015af786a3976e225d779.zip |
debug/tst-longjmp_chk2: Make signal handler more conservative [BZ #20248]
Currently, printf needs more stack space than what is available with SIGSTKSZ. This commit use the the write system call directly instead. Also use sig_atomic_t for the “pass” variable (for general correctness), and restore signal handlers to their defaults, to avoid masking crashes.
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | debug/tst-longjmp_chk2.c | 23 |
2 files changed, 27 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog index 53ab8ca7e8..7f8da5ceb5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2016-06-13 Florian Weimer <fweimer@redhat.com> + + [BZ #20248] + * debug/tst-longjmp_chk2.c (pass): Use volatile sig_atomic_t. + (write_message): New function. + (stackoverflow_handler): Call it instead of printf, to avoid + excessive stack usage by printf. + (do_test): Restore SIGSEGV, SIGBUS default handlers. + 2016-06-13 Adhemerval Zanella <adhemerval.zanella@linaro.org> * nptl/pthread_mutex_init.c [__ASSUME_FUTEX_LOCK_PI] diff --git a/debug/tst-longjmp_chk2.c b/debug/tst-longjmp_chk2.c index dae9ca01e5..243568c32e 100644 --- a/debug/tst-longjmp_chk2.c +++ b/debug/tst-longjmp_chk2.c @@ -6,15 +6,25 @@ #include <signal.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> #include <sys/types.h> #include <sys/time.h> #include <sys/resource.h> +#include <unistd.h> static jmp_buf mainloop; static sigset_t mainsigset; -static int pass; +static volatile sig_atomic_t pass; +static void +write_message (const char *message) +{ + ssize_t unused __attribute__ ((unused)); + for (int i = 0; i < pass; ++i) + unused = write (STDOUT_FILENO, " ", 1); + unused = write (STDOUT_FILENO, message, strlen (message)); +} static void stackoverflow_handler (int sig) @@ -25,11 +35,9 @@ stackoverflow_handler (int sig) pass++; assert (pass < 5); sigaltstack (NULL, &altstack); - /* Using printf is not really kosher in signal handlers but we know - it will work. */ - printf ("%*sin signal handler\n", pass, ""); + write_message ("in signal handler\n"); if (altstack.ss_flags & SS_ONSTACK) - printf ("%*son alternate stack\n", pass, ""); + write_message ("on alternate stack\n"); siglongjmp (mainloop, pass); } @@ -112,6 +120,11 @@ do_test (void) else printf ("disabling alternate stack succeeded \n"); + /* Restore the signal handlers, in case we trigger a crash after the + tests above. */ + signal (SIGBUS, SIG_DFL); + signal (SIGSEGV, SIG_DFL); + return 0; } |