Subject: Re: port-sparc64/29824
To: Chuck Silvers <chuq@chuq.com>
From: Matthias Scheler <tron@zhadum.de>
List: netbsd-bugs
Date: 05/01/2005 22:44:20
On Sun, May 01, 2005 at 02:37:17PM -0700, Chuck Silvers wrote:
> > Responsible-Changed-From-To: xsrc-manager->port-sparc64-maintainer
> > Responsible-Changed-By: tron@netbsd.org
> > Responsible-Changed-When: Sun, 01 May 2005 18:14:03 +0000
> > Responsible-Changed-Why:
> > 1.) XFree86's signal handling code does *not* cause this. It will not
> >     unblock SIGIO from a the SIGIO signal handler.
> 
> I just read the code again, it sure looks like it does to me.
> the call stack in the initial PR comments looks like it could really happen.

How?


1.) xf86BlockSIGIO() returns whether the signal has been blocked before:

int
xf86BlockSIGIO (void)
{
    sigset_t    set, old;

    sigemptyset (&set);
    sigaddset (&set, SIGIO);
    sigprocmask (SIG_BLOCK, &set, &old);
    return sigismember (&old, SIGIO);
}

2.) xf86SigioReadInput() remembers that flag and passed it to
    xf86UnblockSIGIO():

static void
xf86SigioReadInput(int fd,
                   void *closure)
{
    int sigstate = xf86BlockSIGIO();
[...]
    xf86UnblockSIGIO(sigstate);
}

3.) void xf86UnblockSIGIO() only unblocks the signal if it has not been
    blocked before:

void
xf86UnblockSIGIO (int wasset)
{
    sigset_t    set;

    if (!wasset)
    {
        sigemptyset (&set);
        sigaddset (&set, SIGIO);
        sigprocmask (SIG_UNBLOCK, &set, NULL);
    }
}

That looks safe to me.

	Kind regards

-- 
Matthias Scheler                                  http://scheler.de/~matthias/