Fix ax25_get_socket locking
Subsystems (2)
PATCH 1/1 Fix ax25_get_socket locking
In an attempt to return a locked socket ax25_get_socket() was calling lock_sock() with a spinlock held, bad idea. Making matters worse it's only user is running in bottom half context resulting in a potencial attempt to sleep in bottom half context, so fix the locking there as well.
net/ax25/ax25_in.c +3 -1
@@ -275,6 +275,7 @@/* Now find a suitable dgram socket */ sk =ax25_get_socket (&dest, &src,SOCK_DGRAM );if (sk !=NULL ) { +bh_lock_sock (sk);if (atomic_read (&sk->sk_rmem_alloc) >= sk->sk_rcvbuf) {kfree_skb (skb);
@@ -286,7 +287,8 @@if (sock_queue_rcv_skb (sk, skb) !=0 )kfree_skb (skb); } -release_sock (sk); +bh_unlock_sock (sk); +sock_put (sk); }else {kfree_skb (skb); }
net/ax25/af_ax25.c +1 -2
@@ -180,8 +180,7 @@ !ax25cmp(&s->dest_addr, dest_addr) && s->sk->sk_type == type) { sk = s->sk; -/* XXX Sleeps with spinlock held, use refcounts instead. XXX */ -lock_sock (sk); +sock_hold (sk);break ; } }
David S. Miller
maintainerQuoted 4 lines · On Mon, 14 Mar 2005 08:37:44 +0000 Ralf Baechle DL5RB <[email protected]>…
In an attempt to return a locked socket
ax25_get_socket()was callinglock_sock()with a spinlock held, bad idea. Making matters worse it's only user is running in bottom half context resulting in a potencial attempt to sleep in bottom half context, so fix the locking there as well.
Looks fine. Applied, thanks Ralf.