mirror of
git://sourceware.org/git/glibc.git
synced 2025-03-25 13:51:04 +08:00
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.
This commit is contained in:
parent
f5c77f78ec
commit
2c41b52901
@ -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]
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user