net/unix: sk_socket can disappear when state is unlocked
Subsystems (3)
PATCH v3 1/1 net/unix: sk_socket can disappear when state is unlocked
got a rare NULL pointer dereference in clear_bit
Signed-off-by Mark Salyzyn <[email protected]>
----
v2: switch to sock_flag(sk, SOCK_DEAD) and added net/caif/caif_socket.c
v3: return -ECONNRESET in upstream caller of wait function for SOCK_DEAD
--- net/caif/caif_socket.c | 8 ++++++++ net/unix/af_unix.c | 8 ++++++++ 2 files changed, 16 insertions(+)
net/caif/caif_socket.c +8 -0
@@ -330,6 +330,10 @@ static long caif_stream_data_wait(struct sock *sk, long timeo)release_sock (sk); timeo =schedule_timeout (timeo);lock_sock (sk); + +if (sock_flag (sk,SOCK_DEAD )) +break ; +clear_bit (SOCK_ASYNC_WAITDATA , &sk->sk_socket->flags); }
@@ -373,6 +377,10 @@ static int caif_stream_recvmsg(struct socket *sock, struct msghdr *msg,struct sk_buff *skb;lock_sock (sk); +if (sock_flag (sk,SOCK_DEAD )) { + err = -ECONNRESET ; + goto unlock; + } skb =skb_dequeue (&sk->sk_receive_queue);caif_check_flow_release (sk);
net/unix/af_unix.c +8 -0
@@ -1880,6 +1880,10 @@ static long unix_stream_data_wait(struct sock *sk, long timeo,unix_state_unlock (sk); timeo =freezable_schedule_timeout (timeo);unix_state_lock (sk); + +if (sock_flag (sk,SOCK_DEAD )) +break ; +clear_bit (SOCK_ASYNC_WAITDATA , &sk->sk_socket->flags); }
@@ -1939,6 +1943,10 @@ static int unix_stream_recvmsg(struct socket *sock, struct msghdr *msg,struct sk_buff *skb, *last;unix_state_lock (sk); +if (sock_flag (sk,SOCK_DEAD )) { + err = -ECONNRESET ; + goto unlock; + } last = skb =skb_peek (&sk->sk_receive_queue); again:if (skb ==NULL ) {
Signature · 1 line
2.2.0.rc0.207.ga3a616c
Hi,
Quoted 3 lines · Mark Salyzyn
got a rare NULL pointer dereference in
clear_bitSigned-off-by Mark Salyzyn <[email protected]>
IMHO, this is the right approach, I didn't came up with something easier, thanks!
David Miller
maintainerFrom: Hannes Frederic Sowa <[email protected]>
Date: Tue, 26 May 2015 23:24:59 +0200
Quoted 9 lines · Mark Salyzyn
Quoted 3 lines
got a rare NULL pointer dereference in
clear_bitSigned-off-by Mark Salyzyn <[email protected]>IMHO, this is the right approach, I didn't came up with something easier, thanks!
Applied and queued up for -stable, thanks!