From 6dfeb5245bca9f2ef94815ed9a7b979a9e0be744 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 8 Sep 2009 16:00:25 -0700 Subject: Fix __longjmp_chk on s390/s390x. s390/s390x hasn't been updated to handle alternate stacks properly. --- ChangeLog | 7 +++ sysdeps/s390/s390-32/____longjmp_chk.c | 41 ---------------- sysdeps/s390/s390-64/____longjmp_chk.c | 41 ---------------- .../unix/sysv/linux/s390/s390-32/____longjmp_chk.c | 55 ++++++++++++++++++++++ .../unix/sysv/linux/s390/s390-64/____longjmp_chk.c | 55 ++++++++++++++++++++++ 5 files changed, 117 insertions(+), 82 deletions(-) delete mode 100644 sysdeps/s390/s390-32/____longjmp_chk.c delete mode 100644 sysdeps/s390/s390-64/____longjmp_chk.c create mode 100644 sysdeps/unix/sysv/linux/s390/s390-32/____longjmp_chk.c create mode 100644 sysdeps/unix/sysv/linux/s390/s390-64/____longjmp_chk.c diff --git a/ChangeLog b/ChangeLog index d6cd79dfbb..1ae8348773 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2009-09-08 Jakub Jelinek + + * 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 * locale/programs/ld-collate.c (struct locale_collate_t): Add diff --git a/sysdeps/s390/s390-32/____longjmp_chk.c b/sysdeps/s390/s390-32/____longjmp_chk.c deleted file mode 100644 index c5eb721e0e..0000000000 --- a/sysdeps/s390/s390-32/____longjmp_chk.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (C) 2009 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek . - - 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 -#include -#include -#include -#include -#include -#include - -#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" diff --git a/sysdeps/s390/s390-64/____longjmp_chk.c b/sysdeps/s390/s390-64/____longjmp_chk.c deleted file mode 100644 index 241822ce4a..0000000000 --- a/sysdeps/s390/s390-64/____longjmp_chk.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (C) 2009 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek . - - 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 -#include -#include -#include -#include -#include -#include - -#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" diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/____longjmp_chk.c b/sysdeps/unix/sysv/linux/s390/s390-32/____longjmp_chk.c new file mode 100644 index 0000000000..b28e587498 --- /dev/null +++ b/sysdeps/unix/sysv/linux/s390/s390-32/____longjmp_chk.c @@ -0,0 +1,55 @@ +/* Copyright (C) 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek . + + 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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) \ + { \ + 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" diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/____longjmp_chk.c b/sysdeps/unix/sysv/linux/s390/s390-64/____longjmp_chk.c new file mode 100644 index 0000000000..dcf58fb50b --- /dev/null +++ b/sysdeps/unix/sysv/linux/s390/s390-64/____longjmp_chk.c @@ -0,0 +1,55 @@ +/* Copyright (C) 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek . + + 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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) \ + { \ + 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" -- cgit v1.2.3