AArch64: Don't clobber argument for tail call to __sigjmp_save in sigsetjmp

This commit is contained in:
Andreas Schwab 2013-05-20 10:19:31 +02:00
parent 6c14f68aab
commit e39adf43c7
6 changed files with 68 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2013-05-21 Andreas Schwab <schwab@suse.de>
[BZ #15493]
* setjmp/Makefile (tests): Add tst-sigsetjmp.
* setjmp/tst-sigsetjmp.c: New test.
2013-05-20 Ondřej Bílka <neleai@seznam.cz> 2013-05-20 Ondřej Bílka <neleai@seznam.cz>
* sysdeps/x86_64/memset.S (memset): New implementation. * sysdeps/x86_64/memset.S (memset): New implementation.

2
NEWS
View File

@ -18,7 +18,7 @@ Version 2.18
15305, 15307, 15309, 15327, 15330, 15335, 15336, 15337, 15342, 15346, 15305, 15307, 15309, 15327, 15330, 15335, 15336, 15337, 15342, 15346,
15359, 15361, 15366, 15380, 15394, 15395, 15405, 15406, 15409, 15416, 15359, 15361, 15366, 15380, 15394, 15395, 15405, 15406, 15409, 15416,
15418, 15419, 15423, 15424, 15426, 15429, 15442, 15448, 15480, 15485, 15418, 15419, 15423, 15424, 15426, 15429, 15442, 15448, 15480, 15485,
15488, 15490, 15497. 15488, 15490, 15493, 15497.
* CVE-2013-0242 Buffer overrun in regexp matcher has been fixed (Bugzilla * CVE-2013-0242 Buffer overrun in regexp matcher has been fixed (Bugzilla
#15078). #15078).

View File

@ -1,3 +1,10 @@
2013-05-21 Andreas Schwab <schwab@suse.de>
[BZ #15493]
* sysdeps/aarch64/setjmp.S (__sigsetjmp): Don't clobber register
x1.
[NOT_IN_libc && IS_IN_rtld]: Don't call __sigjmp_save.
2013-05-21 Marcus Shawcroft <marcus.shawcroft@linaro.org> 2013-05-21 Marcus Shawcroft <marcus.shawcroft@linaro.org>
* sysdeps/aarch64/libm-test-ulps: Regenerate. * sysdeps/aarch64/libm-test-ulps: Regenerate.

View File

@ -44,8 +44,14 @@ ENTRY (__sigsetjmp)
stp d10, d11, [x0, #JB_D10<<3] stp d10, d11, [x0, #JB_D10<<3]
stp d12, d13, [x0, #JB_D12<<3] stp d12, d13, [x0, #JB_D12<<3]
stp d14, d15, [x0, #JB_D14<<3] stp d14, d15, [x0, #JB_D14<<3]
mov x1, sp mov x2, sp
str x1, [x0, #JB_SP<<3] 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) b C_SYMBOL_NAME(__sigjmp_save)
#endif
END (__sigsetjmp) END (__sigsetjmp)
hidden_def (__sigsetjmp) hidden_def (__sigsetjmp)

View File

@ -25,7 +25,8 @@ headers := setjmp.h bits/setjmp.h bits/setjmp2.h
routines := setjmp sigjmp bsd-setjmp bsd-_setjmp \ routines := setjmp sigjmp bsd-setjmp bsd-_setjmp \
longjmp __longjmp jmp-unwind longjmp __longjmp jmp-unwind
tests := tst-setjmp jmpbug bug269-setjmp tst-setjmp-fp tests := tst-setjmp jmpbug bug269-setjmp tst-setjmp-fp \
tst-sigsetjmp
include ../Rules include ../Rules

44
setjmp/tst-sigsetjmp.c Normal file
View File

@ -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"