NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

kern/38947: minor race for signals with multithreaded process



>Number:         38947
>Category:       kern
>Synopsis:       minor race for signals with multithreaded process
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Thu Jun 12 15:15:00 +0000 2008
>Originator:     Andrew Doran
>Release:        4.99.64
>Organization:
The NetBSD Project
>Environment:
n/a
>Description:
Seems like a bad thing to do, but I don't know if it really is a problem:

A process has two threads.

A signal arrives for the process and neither thread has it masked.

Both threads notice the signal pending in sleepq_block(), and return EINTR 
or ERESTART.
 
The two threads then race to get to userret() on the kernel/user boundary,
where the signal will be dispatched.

Only one thread can dequeue and process the signal, but both will return
an error.

>How-To-Repeat:
Code inspection.

>Fix:
Maybe have the issignal() in sleepq_block() dequeue the signal from the 
process pending list and enqueue it to the per-thread pending list if
it's known that the signal can be handled. We would need to handle cases
where the thread doesn't get to the kernel/user boundary which would be
tricky.




Home | Main Index | Thread Index | Old Index