Implement longjmp checking for s390.

This commit is contained in:
Ulrich Drepper 2009-05-29 11:58:04 -07:00
parent 1de0c16183
commit b8bb339f7d
5 changed files with 102 additions and 2 deletions

View File

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

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

View File

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

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

View File

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