mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-21 01:12:26 +08:00
Fix __longjmp_chk on s390/s390x.
s390/s390x hasn't been updated to handle alternate stacks properly.
This commit is contained in:
parent
3d60eb1734
commit
6dfeb5245b
@ -1,3 +1,10 @@
|
||||
2009-09-08 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* sysdeps/s390/s390-32/____longjmp_chk.c: Removed.
|
||||
* sysdeps/s390/s390-64/____longjmp_chk.c: Removed.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/____longjmp_chk.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-64/____longjmp_chk.c: New file.
|
||||
|
||||
2009-09-07 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* locale/programs/ld-collate.c (struct locale_collate_t): Add
|
||||
|
@ -24,6 +24,9 @@
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <signal.h>
|
||||
#include <sys/syscall.h>
|
||||
|
||||
#define __longjmp ____longjmp_chk
|
||||
|
||||
@ -35,7 +38,18 @@
|
||||
__asm ("lr %0, %%r15" : "=r" (cur_sp)); \
|
||||
new_sp ^= guard; \
|
||||
if (new_sp < cur_sp) \
|
||||
__fortify_fail ("longjmp causes uninitialized stack frame"); \
|
||||
{ \
|
||||
stack_t oss; \
|
||||
INTERNAL_SYSCALL_DECL (err); \
|
||||
int res = INTERNAL_SYSCALL (sigaltstack, err, 2, NULL, &oss); \
|
||||
if (!INTERNAL_SYSCALL_ERROR_P (res, err)) \
|
||||
{ \
|
||||
if ((oss.ss_flags & SS_ONSTACK) == 0 \
|
||||
|| ((uintptr_t) (oss.ss_sp + oss.ss_size) - new_sp \
|
||||
>= oss.ss_size)) \
|
||||
__fortify_fail ("longjmp causes uninitialized stack frame");\
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#include "__longjmp.c"
|
@ -24,6 +24,9 @@
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <signal.h>
|
||||
#include <sys/syscall.h>
|
||||
|
||||
#define __longjmp ____longjmp_chk
|
||||
|
||||
@ -35,7 +38,18 @@
|
||||
__asm ("lgr %0, %%r15" : "=r" (cur_sp)); \
|
||||
new_sp ^= guard; \
|
||||
if (new_sp < cur_sp) \
|
||||
__fortify_fail ("longjmp causes uninitialized stack frame"); \
|
||||
{ \
|
||||
stack_t oss; \
|
||||
INTERNAL_SYSCALL_DECL (err); \
|
||||
int res = INTERNAL_SYSCALL (sigaltstack, err, 2, NULL, &oss); \
|
||||
if (!INTERNAL_SYSCALL_ERROR_P (res, err)) \
|
||||
{ \
|
||||
if ((oss.ss_flags & SS_ONSTACK) == 0 \
|
||||
|| ((uintptr_t) (oss.ss_sp + oss.ss_size) - new_sp \
|
||||
>= oss.ss_size)) \
|
||||
__fortify_fail ("longjmp causes uninitialized stack frame");\
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#include "__longjmp.c"
|
Loading…
Reference in New Issue
Block a user