netdev
[Top] [All Lists]

[PATCH] Fix ax25_get_socket locking

To: netdev@xxxxxxxxxxx, linux-hams@xxxxxxxxxxxxxxx
Subject: [PATCH] Fix ax25_get_socket locking
From: Ralf Baechle DL5RB <ralf@xxxxxxxxxxxxxx>
Date: Mon, 14 Mar 2005 08:37:44 +0000
Cc: "David S. Miller" <davem@xxxxxxxxxxxxx>
Sender: netdev-bounce@xxxxxxxxxxx
User-agent: Mutt/1.4.1i
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.

Index: bk-afu/net/ax25/ax25_in.c
===================================================================
--- bk-afu.orig/net/ax25/ax25_in.c      2005-03-14 00:20:42.153164936 +0000
+++ bk-afu/net/ax25/ax25_in.c   2005-03-14 00:21:07.469316296 +0000
@@ -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);
                        }
Index: bk-afu/net/ax25/af_ax25.c
===================================================================
--- bk-afu.orig/net/ax25/af_ax25.c      2005-03-14 00:21:03.757880520 +0000
+++ bk-afu/net/ax25/af_ax25.c   2005-03-14 00:21:07.471315992 +0000
@@ -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;
                }
        }

<Prev in Thread] Current Thread [Next in Thread>