You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.9 KiB
91 lines
2.9 KiB
commit e39adf43c7d1979884dd304ed1250baf1f78fadc |
|
Author: Andreas Schwab <schwab@suse.de> |
|
Date: Mon May 20 10:19:31 2013 +0200 |
|
|
|
AArch64: Don't clobber argument for tail call to __sigjmp_save in sigsetjmp |
|
|
|
diff --git glibc-2.17-c758a686/ports/sysdeps/aarch64/setjmp.S glibc-2.17-c758a686/ports/sysdeps/aarch64/setjmp.S |
|
index cff81c7..10e0709 100644 |
|
--- glibc-2.17-c758a686/ports/sysdeps/aarch64/setjmp.S |
|
+++ glibc-2.17-c758a686/ports/sysdeps/aarch64/setjmp.S |
|
@@ -44,8 +44,14 @@ ENTRY (__sigsetjmp) |
|
stp d10, d11, [x0, #JB_D10<<3] |
|
stp d12, d13, [x0, #JB_D12<<3] |
|
stp d14, d15, [x0, #JB_D14<<3] |
|
- mov x1, sp |
|
- str x1, [x0, #JB_SP<<3] |
|
+ mov x2, sp |
|
+ str x2, [x0, #JB_SP<<3] |
|
+#if defined NOT_IN_libc && defined IS_IN_rtld |
|
+ /* In ld.so we never save the signal mask */ |
|
+ mov w0, #0 |
|
+ RET |
|
+#else |
|
b C_SYMBOL_NAME(__sigjmp_save) |
|
+#endif |
|
END (__sigsetjmp) |
|
hidden_def (__sigsetjmp) |
|
diff --git glibc-2.17-c758a686/setjmp/Makefile glibc-2.17-c758a686/setjmp/Makefile |
|
index 6124333..913359c 100644 |
|
--- glibc-2.17-c758a686/setjmp/Makefile |
|
+++ glibc-2.17-c758a686/setjmp/Makefile |
|
@@ -25,7 +25,8 @@ headers := setjmp.h bits/setjmp.h bits/setjmp2.h |
|
routines := setjmp sigjmp bsd-setjmp bsd-_setjmp \ |
|
longjmp __longjmp jmp-unwind |
|
|
|
-tests := tst-setjmp jmpbug bug269-setjmp |
|
+tests := tst-setjmp jmpbug bug269-setjmp \ |
|
+ tst-sigsetjmp |
|
|
|
|
|
include ../Rules |
|
diff --git glibc-2.17-c758a686/setjmp/tst-sigsetjmp.c glibc-2.17-c758a686/setjmp/tst-sigsetjmp.c |
|
new file mode 100644 |
|
index 0000000..467c26a |
|
--- /dev/null |
|
+++ glibc-2.17-c758a686/setjmp/tst-sigsetjmp.c |
|
@@ -0,0 +1,44 @@ |
|
+/* Copyright (C) 2013 Free Software Foundation, Inc. |
|
+ This file is part of the GNU C Library. |
|
+ |
|
+ The GNU C Library is free software; you can redistribute it and/or |
|
+ modify it under the terms of the GNU Lesser General Public |
|
+ License as published by the Free Software Foundation; either |
|
+ version 2.1 of the License, or (at your option) any later version. |
|
+ |
|
+ The GNU C Library is distributed in the hope that it will be useful, |
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
+ Lesser General Public License for more details. |
|
+ |
|
+ You should have received a copy of the GNU Lesser General Public |
|
+ License along with the GNU C Library; if not, see |
|
+ <http://www.gnu.org/licenses/>. */ |
|
+ |
|
+/* Test case for BZ #15493 */ |
|
+ |
|
+#include <stdlib.h> |
|
+#include <signal.h> |
|
+#include <setjmp.h> |
|
+ |
|
+static int |
|
+do_test (void) |
|
+{ |
|
+ sigjmp_buf sj; |
|
+ sigset_t m; |
|
+ |
|
+ sigemptyset (&m); |
|
+ sigprocmask (SIG_SETMASK, &m, NULL); |
|
+ if (sigsetjmp (sj, 0) == 0) |
|
+ { |
|
+ sigaddset (&m, SIGUSR1); |
|
+ sigprocmask (SIG_SETMASK, &m, NULL); |
|
+ siglongjmp (sj, 1); |
|
+ return EXIT_FAILURE; |
|
+ } |
|
+ sigprocmask (SIG_SETMASK, NULL, &m); |
|
+ return sigismember (&m, SIGUSR1) ? EXIT_SUCCESS : EXIT_FAILURE; |
|
+} |
|
+ |
|
+#define TEST_FUNCTION do_test () |
|
+#include "../test-skeleton.c"
|
|
|