Re: restarting SYSCALL system call on amd64 loses arguments

From: Jilles Tjoelker <jilles_at_stack.nl>
Date: Tue, 24 Sep 2013 21:19:49 +0200
On Tue, Sep 24, 2013 at 12:37:30AM +0300, Konstantin Belousov wrote:
> On Mon, Sep 23, 2013 at 10:26:13PM +0200, Tijl Coosemans wrote:
> > Has anyone taken a look at this PR yet?

> > http://www.freebsd.org/cgi/query-pr.cgi?pr=182161

> This looks like a valid bug, but probably not a valid testcase.

> Let me elaborate.  When a signal is delivered, return from the signal
> handler is performed by the sigreturn(2), which reloads the whole
> register file when crossing kernel->user boundary due to sys_sigreturn(9)
> setting PCB_FULL_IRET flag.  As result, the whole trap frame at the
> time of the syscall entry is restored, and ERESTART return is not
> exercised.

> I was not able to reproduce the issue with the supplied test program
> on HEAD.  I suspect that the program actually exposed the bug in the
> signal delivery in the threaded processes, which I introduced for 9.1
> and fixed in r251047 & r251365.

The ERESTART return happens if there is no signal or no longer a signal.
The latter is how the bug in the PR occurs: a SIGCHLD delivery via
handler in one thread races with a SIGCHLD acceptance in wait4() in
another thread. Note wait4() returning a value in the other thread in
the fourth line of the kdump output in the PR.

For some reason, I can reproduce this easily on my local quad-core
r255729 stable/9 system but not on ref9-amd64.freebsd.org or
ref10-amd64.freebsd.org.

I can also reproduce the bug on my local system by racing signal
delivery via handler with acceptance in sigtimedwait().

-- 
Jilles Tjoelker
Received on Tue Sep 24 2013 - 17:19:54 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:41 UTC