]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
debug/tst-longjmp_chk2: Make signal handler more conservative [BZ #20248]
authorFlorian Weimer <fweimer@redhat.com>
Mon, 13 Jun 2016 11:08:39 +0000 (13:08 +0200)
committerFlorian Weimer <fweimer@redhat.com>
Mon, 13 Jun 2016 14:36:46 +0000 (16:36 +0200)
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.

ChangeLog
debug/tst-longjmp_chk2.c

index 53ab8ca7e8387ddbe543bbfa9f8e34ef3ea057df..7f8da5ceb5cca7c96ef43b4f040693d7ca2e7d53 100644 (file)
--- 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]
index dae9ca01e5b21c7f9c7bce5237a62d42a1c96215..243568c32e7809cadfdade8b0837c73ff4eb0ca0 100644 (file)
@@ -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;
 }