summaryrefslogtreecommitdiff
path: root/ipc
diff options
context:
space:
mode:
authorRainer Weikusat <rweikusat@mobileactivedefense.com>2011-02-28 04:50:55 (GMT)
committerDavid S. Miller <davem@davemloft.net>2011-03-07 23:31:16 (GMT)
commitb3ca9b02b00704053a38bfe4c31dbbb9c13595d0 (patch)
treeaee22e55bb36b3f8cffc22f840a958a8a6ea184b /ipc
parent2ea6d8c446752008df7f37867f0cf7483533b05e (diff)
downloadlinux-b3ca9b02b00704053a38bfe4c31dbbb9c13595d0.tar.xz
net: fix multithreaded signal handling in unix recv routines
The unix_dgram_recvmsg and unix_stream_recvmsg routines in net/af_unix.c utilize mutex_lock(&u->readlock) calls in order to serialize read operations of multiple threads on a single socket. This implies that, if all n threads of a process block in an AF_UNIX recv call trying to read data from the same socket, one of these threads will be sleeping in state TASK_INTERRUPTIBLE and all others in state TASK_UNINTERRUPTIBLE. Provided that a particular signal is supposed to be handled by a signal handler defined by the process and that none of this threads is blocking the signal, the complete_signal routine in kernel/signal.c will select the 'first' such thread it happens to encounter when deciding which thread to notify that a signal is supposed to be handled and if this is one of the TASK_UNINTERRUPTIBLE threads, the signal won't be handled until the one thread not blocking on the u->readlock mutex is woken up because some data to process has arrived (if this ever happens). The included patch fixes this by changing mutex_lock to mutex_lock_interruptible and handling possible error returns in the same way interruptions are handled by the actual receive-code. Signed-off-by: Rainer Weikusat <rweikusat@mobileactivedefense.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'ipc')
0 files changed, 0 insertions, 0 deletions