Re: [RFC] unix: fix use-after-free in unix_dgram_poll()
From: Jason Baron <jbaron@akamai.com>
Date: 2015-10-28 17:57:51
Also in:
lkml
On 10/28/2015 12:46 PM, Rainer Weikusat wrote:
Rainer Weikusat [off-list ref] writes:quoted
Jason Baron [off-list ref] writes:[...]quoted
quoted
2) For the case of epoll() in edge triggered mode we need to ensure that when we return -EAGAIN from unix_dgram_sendmsg() when unix_recvq_full() is true, we need to add a unix_peer_wake_connect() call to guarantee a wakeup. Otherwise, we are going to potentially hang there.I consider this necessary.(As already discussed privately) just doing this would open up another way for sockets to be enqueued on the peer_wait queue of the peer forever despite no one wants to be notified of write space availability. Here's another RFC patch addressing the issues so far plus this one by breaking the connection to the peer socket from the wake up relaying function. This has the nice additional property that the dgram_poll code becomes somewhat simpler as the "dequeued where we didn't enqueue" situation can no longer occur and the not-so-nice additional property that the connect and disconnect functions need to take the peer_wait.lock spinlock explicitly so that this lock is used to ensure that no two threads modifiy the private pointer of the client wait_queue_t.
Hmmm...I thought these were already all guarded by unix_state_lock(sk). In any case, rest of the patch overall looks good to me. Thanks, -Jason