Skip to contentSkip to conversation

Fix ax25_get_socket locking

PATCH In review Ralf Baechle DL5RB 2 participants 2 messages Mar 14, 2005 – Mar 15, 2005

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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
Index: bk-afu/net/ax25/ax25_in.c
===================================================================
@@ -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
Index: bk-afu/net/ax25/af_ax25.c
===================================================================
@@ -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;
 		}
 	}
maintainer
#1 lore raw
Quoted 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 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.

Looks fine. Applied, thanks Ralf.