i386: Fix i386 sigaction sa_restorer initialization (BZ#21269)
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Fri, 17 Nov 2017 18:04:29 +0000 (16:04 -0200)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Mon, 5 Mar 2018 21:08:27 +0000 (18:08 -0300)
commit68448be208ee06e76665918b37b0a57e3e00c8b4
tree07c9ed97d7afa4a6516db76079638e7329c12504
parent8d965cde7a2bc18a010325607f6f526db86cdaf0
i386: Fix i386 sigaction sa_restorer initialization (BZ#21269)

This patch fixes the i386 sa_restorer field initialization for sigaction
syscall for kernel with vDSO.  As described in bug report, i386 Linux
(and compat on x86_64) interprets SA_RESTORER clear with nonzero
sa_restorer as a request for stack switching if the SS segment is 'funny'.
This means that anything that tries to mix glibc's signal handling with
segmentation (for instance through modify_ldt syscall) is randomly broken
depending on what values lands in sa_restorer.

The testcase added  is based on Linux test tools/testing/selftests/x86/ldt_gdt.c,
more specifically in do_multicpu_tests function.  The main changes are:

  - C11 atomics instead of plain access.

  - Remove x86_64 support which simplifies the syscall handling and fallbacks.

  - Replicate only the test required to trigger the issue.

Checked on i686-linux-gnu.

[BZ #21269]
* sysdeps/unix/sysv/linux/i386/Makefile (tests): Add tst-bz21269.
* sysdeps/unix/sysv/linux/i386/sigaction.c (SET_SA_RESTORER): Clear
sa_restorer for vDSO case.
* sysdeps/unix/sysv/linux/i386/tst-bz21269.c: New file.
ChangeLog
sysdeps/unix/sysv/linux/i386/Makefile
sysdeps/unix/sysv/linux/i386/sigaction.c
sysdeps/unix/sysv/linux/i386/tst-bz21269.c [new file with mode: 0644]