kernel-netlink: Check proper watcher state in parallel mode
authorTobias Brunner <tobias@strongswan.org>
Wed, 4 May 2016 13:39:51 +0000 (15:39 +0200)
committerTobias Brunner <tobias@strongswan.org>
Fri, 6 May 2016 14:00:32 +0000 (16:00 +0200)
commitfee991c2597abbb6de75fb4a256f4fd8fe5b5f1b
treeb27ed9992bc64775970b35fd21b1dcd475e0dcef
parent9c01e0142070d3e93c0dc2687020acd51879f7cd
kernel-netlink: Check proper watcher state in parallel mode

After adding the read callback the state is WATCHER_QUEUED and it is
switched to WATCHER_RUNNING only later by an asynchronous job. This means
that a thread that sent a Netlink message shortly after registration
might see the state as WATCHER_QUEUED.  If it then tries to read the
response and the watcher thread is quicker to actually read the message
from the socket, it could block on recv() while still holding the lock.
And the asynchronous job that actually read the message and tries to queue
it will block while trying to acquire the lock, so we'd end up in a deadlock.

This is probably mostly a problem in the unit tests.
src/libcharon/plugins/kernel_netlink/kernel_netlink_shared.c