Al Viro 392fb6e354 alpha: unb0rk sigsuspend() and rt_sigsuspend()
Old code used to set regs->r0 and regs->r19 to force the right
return value.  Leaving that after switch to ERESTARTNOHAND
was a Bad Idea(tm), since now that screws the restart - if we
hit the case when get_signal_to_deliver() returns 0, we will
step back to syscall insn, with v0 set to EINTR and a3 to 1.
The latter won't matter, since EINTR is 4, aka __NR_write.

Testcase:

	#include <signal.h>
	#define _GNU_SOURCE
	#include <unistd.h>
	#include <sys/syscall.h>

	main()
	{
		sigset_t mask;
		sigemptyset(&mask);
		sigaddset(&mask, SIGCONT);
		sigprocmask(SIG_SETMASK, &mask, NULL);
		kill(0, SIGCONT);
		syscall(__NR_sigsuspend, 1, "b0rken\n", 7);
	}

results on alpha in immediate message to stdout...

Fix is obvious; moreover, since we don't need regs anymore, we can
switch to normal prototypes for these guys and lose the wrappers.
Even better, rt_sigsuspend() is identical to generic version in
kernel/signal.c now.

Tested-by: Michael Cree <mcree@orcon.net.nz>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Matt Turner <mattst88@gmail.com>
2010-09-18 23:08:28 -04:00
..
2009-05-02 15:36:10 -07:00
2010-06-15 14:19:07 -04:00
2009-12-16 07:20:12 -08:00
2009-06-07 05:01:00 -07:00
2009-12-17 11:03:24 -05:00
2009-05-02 15:36:10 -07:00
2008-12-29 08:29:51 +01:00
2010-08-10 13:47:39 -07:00
2010-08-14 22:26:51 +02:00
2010-06-09 11:12:36 +02:00
2010-01-05 15:34:49 +09:00
2009-06-30 18:55:59 -07:00
2010-03-12 15:52:38 -08:00
2009-01-15 16:39:40 -08:00
2009-02-01 11:01:22 +05:30
2009-02-01 11:01:22 +05:30
2009-04-01 08:59:16 -07:00
2009-05-02 15:36:10 -07:00
2009-04-01 08:59:16 -07:00