Al Viro
653d48b221
arm: fix really nasty sigreturn bug
...
If a signal hits us outside of a syscall and another gets delivered
when we are in sigreturn (e.g. because it had been in sa_mask for
the first one and got sent to us while we'd been in the first handler),
we have a chance of returning from the second handler to location one
insn prior to where we ought to return. If r0 happens to contain -513
(-ERESTARTNOINTR), sigreturn will get confused into doing restart
syscall song and dance.
Incredible joy to debug, since it manifests as random, infrequent and
very hard to reproduce double execution of instructions in userland
code...
The fix is simple - mark it "don't bother with restarts" in wrapper,
i.e. set r8 to 0 in sys_sigreturn and sys_rt_sigreturn wrappers,
suppressing the syscall restart handling on return from these guys.
They can't legitimately return a restart-worthy error anyway.
Testcase:
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/time.h>
#include <errno.h>
void f(int n)
{
__asm__ __volatile__(
"ldr r0, [%0]\n"
"b 1f\n"
"b 2f\n"
"1:b .\n"
"2:\n" : : "r"(&n));
}
void handler1(int sig) { }
void handler2(int sig) { raise(1); }
void handler3(int sig) { exit(0); }
main()
{
struct sigaction s = {.sa_handler = handler2};
struct itimerval t1 = { .it_value = {1} };
struct itimerval t2 = { .it_value = {2} };
signal(1, handler1);
sigemptyset(&s.sa_mask);
sigaddset(&s.sa_mask, 1);
sigaction(SIGALRM, &s, NULL);
signal(SIGVTALRM, handler3);
setitimer(ITIMER_REAL, &t1, NULL);
setitimer(ITIMER_VIRTUAL, &t2, NULL);
f(-513); /* -ERESTARTNOINTR */
write(1, "buggered\n", 9);
return 1;
}
Signed-off-by: Al Viro <[email protected] >
Acked-by: Russell King <[email protected] >
Cc: [email protected]
Signed-off-by: Linus Torvalds <[email protected] >
2010-09-17 10:22:18 -07:00
..
boot
ARM: Partially revert "Auto calculate ZRELADDR and provide option for exceptions"
2010-09-09 22:39:41 +01:00
common
Revert "[ARM] pxa: remove now unnecessary dma_needs_bounce()"
2010-09-08 12:28:39 +01:00
configs
omap: Fix omap_4430sdp_defconfig for make oldconfig
2010-08-16 09:22:04 +03:00
include /asm
Revert "[ARM] pxa: remove now unnecessary dma_needs_bounce()"
2010-09-08 12:28:39 +01:00
kernel
arm: fix really nasty sigreturn bug
2010-09-17 10:22:18 -07:00
lib
Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm
2010-08-03 14:31:24 -07:00
mach-aaec2000
ARM: Remove DISCONTIGMEM support
2010-07-16 10:57:35 +01:00
mach-at91
AT91: at91sam9261ek: remove C99 comments but keep information
2010-09-10 14:36:06 +02:00
mach-bcmring
ARM: AMBA: Add pclk definition for platforms using primecells
2010-07-22 09:55:38 +01:00
mach-clps711x
ARM: 6283/1: Remove useless PCIO_BASE definitions
2010-08-05 10:35:49 +01:00
mach-cns3xxx
ARM: cns3xxx: Add support for AHCI controllers
2010-06-08 17:37:09 +04:00
mach-davinci
Merge branch 'davinci-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-davinci
2010-08-08 10:00:55 -07:00
mach-dove
[ARM] Dove: platform device registration for the sdio interfaces
2010-07-16 22:01:59 -04:00
mach-ebsa110
mach-ep93xx
ARM: 6359/1: ep93xx: move clock initialization earlier
2010-09-08 12:28:39 +01:00
mach-footbridge
ARM: 6233/1: Delete a wrong redundant right parenthesis
2010-07-22 09:20:50 +01:00
mach-gemini
mach-h720x
ARM: 6283/1: Remove useless PCIO_BASE definitions
2010-08-05 10:35:49 +01:00
mach-imx
ARM: imx: fix build failure concerning otg/ulpi
2010-08-23 20:50:17 -07:00
mach-integrator
ARM: 6283/1: Remove useless PCIO_BASE definitions
2010-08-05 10:35:49 +01:00
mach-iop13xx
Merge branch 'misc' into devel
2010-07-31 14:20:02 +01:00
mach-iop32x
mach-iop33x
mach-ixp4xx
Merge git://git.infradead.org/mtd-2.6
2010-08-15 17:32:47 -07:00
mach-ixp23xx
ARM: 6283/1: Remove useless PCIO_BASE definitions
2010-08-05 10:35:49 +01:00
mach-ixp2000
ARM: 6269/1: Add 'code' parameter for hook_fault_code()
2010-07-27 10:48:34 +01:00
mach-kirkwood
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
2010-08-07 17:07:31 -07:00
mach-ks8695
ARM: 6269/1: Add 'code' parameter for hook_fault_code()
2010-07-27 10:48:34 +01:00
mach-lh7a40x
ARM: Remove DISCONTIGMEM support
2010-07-16 10:57:35 +01:00
mach-loki
mach-lpc32xx
ARM: LPC32XX: Arch config menu supoport and makefiles
2010-07-27 08:46:22 -07:00
mach-mmp
[ARM] mmp: move declarations into SoC specific header file from common.h
2010-08-05 14:34:46 +08:00
mach-msm
Merge branch 'msm-core' of git://codeaurora.org/quic/kernel/dwalker/linux-msm
2010-08-12 10:07:32 -07:00
mach-mv78xx0
mach-mx3
Merge branch 'imx-for-2.6.36' of git://git.pengutronix.de/git/imx/linux-2.6
2010-09-01 10:08:50 +01:00
mach-mx5
mx5/clock: fix clear bit fields issue in _clk_ccgr_disable function
2010-08-21 12:22:43 +02:00
mach-mx25
Merge branch 'imx-for-2.6.36' of git://git.pengutronix.de/git/imx/linux-2.6
2010-09-01 10:08:50 +01:00
mach-mxc91231
ARM: mxc91231: remove paragraphs with old address of the FSF
2010-06-30 09:00:27 +02:00
mach-netx
mach-nomadik
ARM: AMBA: Add pclk definition for platforms using primecells
2010-07-22 09:55:38 +01:00
mach-ns9xxx
ARM: 6263/1: ns9xxx: fix FTBFS for zImage
2010-07-26 10:33:07 +01:00
mach-nuc93x
mach-omap1
Merge branch 'v2.6.35-omap-mailbox-for-next' of git://gitorious.org/~doyu/lk/mainline into omap-for-linus
2010-08-04 16:10:38 +03:00
mach-omap2
OMAP3: PM: ensure IO wakeups are properly disabled
2010-08-16 09:22:05 +03:00
mach-orion5x
ARM: Fix gen_nand probe structures contents
2010-08-12 02:21:18 +01:00
mach-pnx4008
mach-pxa
ARM: pxa: fix CI_HSYNC and CI_VSYNC MFP defines for pxa300
2010-08-30 09:59:43 +08:00
mach-realview
Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm
2010-08-03 14:31:24 -07:00
mach-rpc
mach-s3c24a0/include /mach
mach-s3c64xx
ARM: SAMSUNG: Fix on build warning regarding VMALLOC_END type
2010-08-27 15:28:38 +09:00
mach-s3c2400
mach-s3c2410
ARM: SAMSUNG: Fix on build warning regarding VMALLOC_END type
2010-08-27 15:28:38 +09:00
mach-s3c2412
ARM: Remove DISCONTIGMEM support
2010-07-16 10:57:35 +01:00
mach-s3c2416
s3c-fb: add device name initialization
2010-08-11 08:59:10 -07:00
mach-s3c2440
panic: keep blinking in spite of long spin timer mode
2010-08-11 08:59:22 -07:00
mach-s3c2443
s3c-fb: add device name initialization
2010-08-11 08:59:10 -07:00
mach-s5p6440
ARM: SAMSUNG: Fix on build warning regarding VMALLOC_END type
2010-08-27 15:28:38 +09:00
mach-s5p6442
ARM: SAMSUNG: Fix on build warning regarding VMALLOC_END type
2010-08-27 15:28:38 +09:00
mach-s5pc100
Merge branch 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm
2010-08-11 09:13:19 -07:00
mach-s5pv210
ARM: S5P: VMALLOC_END should be unsigned long
2010-08-23 10:50:36 +09:00
mach-s5pv310
ARM: S5PV310: Fix on Secondary CPU startup
2010-08-27 18:29:58 +09:00
mach-sa1100
Merge branch 'devel' of git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6 into devel-stable
2010-08-06 18:10:25 +01:00
mach-shark
Merge branches 'at91', 'ep93xx', 'kexec', 'iop', 'lmb', 'nomadik', 'nuc', 'pl', 'spear' and 'versatile' into devel
2010-07-31 14:19:35 +01:00
mach-shmobile
ARM: mach-shmobile: ap4evb: fix write protect for SDHI1
2010-08-20 20:41:23 +09:00
mach-spear3xx
ARM: AMBA: Add pclk definition for platforms using primecells
2010-07-22 09:55:38 +01:00
mach-spear6xx
ARM: AMBA: Add pclk definition for platforms using primecells
2010-07-22 09:55:38 +01:00
mach-stmp37xx
mach-stmp378x
mach-tegra
arm: tegra: VMALLOC_END should be unsigned long
2010-08-22 12:54:23 -07:00
mach-u300
ARM: 6297/1: move U300 timer to dynamic clock lookup
2010-08-10 22:10:56 +01:00
mach-ux500
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx
2010-08-09 21:00:07 -07:00
mach-versatile
ARM: 6282/1: Remove useless definitions from versatile hardware.h
2010-08-05 10:35:49 +01:00
mach-vexpress
Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm
2010-08-03 14:31:24 -07:00
mach-w90x900
i2c/nuc900: add i2c driver support for nuc900
2010-08-11 00:34:38 +01:00
mm
ARM: Ensure PTE modifications via dma_alloc_coherent are visible
2010-09-08 16:27:56 +01:00
nwfpe
ARM: arch/arm/nwfpe/fpsr.h: Checkpatch cleanup
2010-05-24 20:40:12 +01:00
oprofile
plat-iop
Merge branch 'misc' into devel
2010-07-31 14:20:02 +01:00
plat-mxc
ARM: imx: set cache line size to 64 bytes for i.MX5
2010-08-21 12:22:43 +02:00
plat-nomadik
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx
2010-08-09 21:00:07 -07:00
plat-omap
omap: Fix sev instruction usage for multi-omap
2010-08-16 09:22:04 +03:00
plat-orion
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
2010-08-07 17:07:31 -07:00
plat-pxa
ARM: pxa: Make id const in pwm_probe()
2010-08-30 09:59:44 +08:00
plat-s3c24xx
Merge branch 'master' into for-next
2010-06-16 18:08:13 +02:00
plat-s5p
ARM: S5PV310: Fix on Secondary CPU startup
2010-08-27 18:29:58 +09:00
plat-samsung
s5pc110: SDHCI-s3c can override host capabilities
2010-08-20 09:34:55 -07:00
plat-spear
Merge branch 'master' into for-next
2010-08-04 15:14:38 +02:00
plat-stmp3xxx
plat-versatile
ARM: 6264/1: fix Versatile Express LED oversight
2010-07-26 10:48:34 +01:00
tools
ARM: Update mach-types
2010-09-09 22:49:26 +01:00
vfp
ARM: 6203/1: Make VFPv3 usable on ARMv6
2010-07-09 14:41:34 +01:00
Kconfig
ARM: Partially revert "Auto calculate ZRELADDR and provide option for exceptions"
2010-09-09 22:39:41 +01:00
Kconfig-nommu
Kconfig.debug
Makefile
ARM: 6328/1: Build with -fno-dwarf2-cfi-asm
2010-08-14 23:58:43 +01:00