Bluetooth: prevent multiple l2cap_sock_kill function calls
Nagarjuna Kristam [Wed, 25 Jul 2012 12:12:19 +0000 (17:12 +0530)]
Remove SOCK_DEAD check inside l2cap_sock_kill, as this prevents cleanup of
l2cap sockets when bluetooth is turned off from UI
Instead of SOCK_DEAD check inside l2cap_sock_kill, add SOCK_DEAD check
inside l2cap_sock_close_cb to prevent multiple l2cap_sock_kill function calls.
This check avoids kernel panic, when l2cap_sock_close_cb function is called with
same socket multiple times.

Bug 1018499

Change-Id: I77388ffb1407138646feb9fbea467ca12e4a0855
Signed-off-by: Nagarjuna Kristam <nkristam@nvidia.com>
Reviewed-on: http://git-master/r/118321
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Rakesh Kumar <krakesh@nvidia.com>
Reviewed-by: Sachin Nikam <snikam@nvidia.com>
Reviewed-by: Varun Wadekar <vwadekar@nvidia.com>

Rebase-Id: R864df060c128d25aafc8cc9b0040b14e25758efc

net/bluetooth/l2cap_sock.c

index 457cfe3..81b2de6 100644 (file)
@@ -844,8 +844,7 @@ done:
  */
 static void l2cap_sock_kill(struct sock *sk)
 {
-       if (!sock_flag(sk, SOCK_ZAPPED) || sock_flag(sk, SOCK_DEAD) ||
-                               sk->sk_socket)
+       if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
                return;
 
        BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
@@ -1007,7 +1006,8 @@ static void l2cap_sock_close_cb(struct l2cap_chan *chan)
 {
        struct sock *sk = chan->data;
 
-       l2cap_sock_kill(sk);
+       if (!sock_flag(sk, SOCK_DEAD))
+               l2cap_sock_kill(sk);
 }
 
 static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err)