]> git.ipfire.org Git - thirdparty/glibc.git/commit
x86: Use pad in pthread_unwind_buf to preserve shadow stack register
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 2 May 2018 13:17:20 +0000 (06:17 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 2 May 2018 13:17:41 +0000 (06:17 -0700)
commitd6cc1829aa31b6fb060f24dffd28aa6705cdd33a
tree197e7983f66d43765505f94a5a29d254d27f6d02
parentb109fbfe4dd2ca77656157ddaded773e0da630a2
x86: Use pad in pthread_unwind_buf to preserve shadow stack register

The pad array in struct pthread_unwind_buf is used by setjmp to save
shadow stack register.  We assert that size of struct pthread_unwind_buf
is no less than offset of shadow stack pointer + shadow stack pointer
size.

Since functions, like LIBC_START_MAIN, START_THREAD_DEFN as well as
these with thread cancellation, call setjmp, but never return after
__libc_unwind_longjmp, __libc_unwind_longjmp, which is defined as
__libc_longjmp on x86, doesn't need to restore shadow stack register.
__libc_longjmp, which is a private interface for thread cancellation
implementation in libpthread, is changed to call __longjmp_cancel,
instead of __longjmp.  __longjmp_cancel is a new internal function
in libc, which is similar to __longjmp, but doesn't restore shadow
stack register.

The compatibility longjmp and siglongjmp in libpthread.so are changed
to call __libc_siglongjmp, instead of __libc_longjmp, so that they will
restore shadow stack register.

Tested with build-many-glibcs.py.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
* nptl/pthread_create.c (START_THREAD_DEFN): Clear previous
handlers after setjmp.
* setjmp/longjmp.c (__libc_longjmp): Don't define alias if
defined.
* sysdeps/unix/sysv/linux/x86/setjmpP.h: Include
<libc-pointer-arith.h>.
(_JUMP_BUF_SIGSET_BITS_PER_WORD): New.
(_JUMP_BUF_SIGSET_NSIG): Changed to 96.
(_JUMP_BUF_SIGSET_NWORDS): Changed to use ALIGN_UP and
_JUMP_BUF_SIGSET_BITS_PER_WORD.
* sysdeps/x86/Makefile (sysdep_routines): Add __longjmp_cancel.
* sysdeps/x86/__longjmp_cancel.S: New file.
* sysdeps/x86/longjmp.c: Likewise.
* sysdeps/x86/nptl/pt-longjmp.c: Likewise.
ChangeLog
nptl/pthread_create.c
setjmp/longjmp.c
sysdeps/unix/sysv/linux/x86/setjmpP.h
sysdeps/x86/Makefile
sysdeps/x86/__longjmp_cancel.S [new file with mode: 0644]
sysdeps/x86/longjmp.c [new file with mode: 0644]
sysdeps/x86/nptl/pt-longjmp.c [new file with mode: 0644]