mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-21 01:12:26 +08:00
Implement longjmp checking for s390.
This commit is contained in:
parent
1de0c16183
commit
b8bb339f7d
@ -1,3 +1,11 @@
|
||||
2009-05-29 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* sysdeps/s390/s390-32/__longjmp.c (__longjmp): If CHECK_SP is
|
||||
defined, use it.
|
||||
* sysdeps/s390/s390-64/__longjmp.c (__longjmp): Likewise.
|
||||
* sysdeps/s390/s390-32/____longjmp_chk.c: New file.
|
||||
* sysdeps/s390/s390-64/____longjmp_chk.c: New file.
|
||||
|
||||
2009-05-29 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* sysdeps/x86_64/cacheinfo.c: Compact intel_02_known array. Adjust
|
||||
|
41
sysdeps/s390/s390-32/____longjmp_chk.c
Normal file
41
sysdeps/s390/s390-32/____longjmp_chk.c
Normal file
@ -0,0 +1,41 @@
|
||||
/* Copyright (C) 2009 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jakub@redhat.com>.
|
||||
|
||||
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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <sysdep.h>
|
||||
#include <setjmp.h>
|
||||
#include <bits/setjmp.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define __longjmp ____longjmp_chk
|
||||
|
||||
#define CHECK_SP(env, guard) \
|
||||
do \
|
||||
{ \
|
||||
uintptr_t cur_sp; \
|
||||
uintptr_t new_sp = env->__gregs[9]; \
|
||||
__asm ("lr %0, %%r15" : "=r" (cur_sp)); \
|
||||
new_sp ^= guard; \
|
||||
if (new_sp < cur_sp) \
|
||||
__fortify_fail ("longjmp causes uninitialized stack frame"); \
|
||||
} while (0)
|
||||
|
||||
#include "__longjmp.c"
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2000, 2001, 2005 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2000, 2001, 2005, 2009 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
|
||||
@ -33,6 +33,11 @@ __longjmp (__jmp_buf env, int val)
|
||||
#ifdef PTR_DEMANGLE
|
||||
register uintptr_t r3 __asm ("%r3") = THREAD_GET_POINTER_GUARD ();
|
||||
register void *r1 __asm ("%r1") = (void *) env;
|
||||
# ifdef CHECK_SP
|
||||
CHECK_SP (env, r3);
|
||||
# endif
|
||||
#elif defined CHECK_SP
|
||||
CHECK_SP (env, 0);
|
||||
#endif
|
||||
/* Restore registers and jump back. */
|
||||
asm volatile ("ld %%f6,48(%1)\n\t"
|
||||
|
41
sysdeps/s390/s390-64/____longjmp_chk.c
Normal file
41
sysdeps/s390/s390-64/____longjmp_chk.c
Normal file
@ -0,0 +1,41 @@
|
||||
/* Copyright (C) 2009 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jakub@redhat.com>.
|
||||
|
||||
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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <sysdep.h>
|
||||
#include <setjmp.h>
|
||||
#include <bits/setjmp.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define __longjmp ____longjmp_chk
|
||||
|
||||
#define CHECK_SP(env, guard) \
|
||||
do \
|
||||
{ \
|
||||
uintptr_t cur_sp; \
|
||||
uintptr_t new_sp = env->__gregs[9]; \
|
||||
__asm ("lgr %0, %%r15" : "=r" (cur_sp)); \
|
||||
new_sp ^= guard; \
|
||||
if (new_sp < cur_sp) \
|
||||
__fortify_fail ("longjmp causes uninitialized stack frame"); \
|
||||
} while (0)
|
||||
|
||||
#include "__longjmp.c"
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2001, 2005 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2001, 2005, 2009 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
|
||||
@ -33,6 +33,11 @@ __longjmp (__jmp_buf env, int val)
|
||||
#ifdef PTR_DEMANGLE
|
||||
register uintptr_t r3 __asm ("%r3") = THREAD_GET_POINTER_GUARD ();
|
||||
register void *r1 __asm ("%r1") = (void *) env;
|
||||
# ifdef CHECK_SP
|
||||
CHECK_SP (env, r3);
|
||||
# endif
|
||||
#elif defined CHECK_SP
|
||||
CHECK_SP (env, 0);
|
||||
#endif
|
||||
/* Restore registers and jump back. */
|
||||
asm volatile ("ld %%f7,104(%1)\n\t"
|
||||
|
Loading…
Reference in New Issue
Block a user