===== include/net/bluetooth/bluetooth.h 1.18 vs edited ===== --- 1.18/include/net/bluetooth/bluetooth.h 2004-07-04 17:27:14 +02:00 +++ edited/include/net/bluetooth/bluetooth.h 2004-09-21 01:26:06 +02:00 @@ -133,6 +133,7 @@ int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo); void bt_accept_enqueue(struct sock *parent, struct sock *sk); +void bt_accept_unlink(struct sock *sk); struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock); /* Skb helpers */ ===== net/bluetooth/af_bluetooth.c 1.36 vs edited ===== --- 1.36/net/bluetooth/af_bluetooth.c 2004-07-13 15:39:15 +02:00 +++ edited/net/bluetooth/af_bluetooth.c 2004-09-21 01:26:17 +02:00 @@ -165,7 +165,7 @@ } EXPORT_SYMBOL(bt_accept_enqueue); -static void bt_accept_unlink(struct sock *sk) +void bt_accept_unlink(struct sock *sk) { BT_DBG("sk %p state %d", sk, sk->sk_state); @@ -174,6 +174,7 @@ bt_sk(sk)->parent = NULL; sock_put(sk); } +EXPORT_SYMBOL(bt_accept_unlink); struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock) { ===== net/bluetooth/l2cap.c 1.44 vs edited ===== --- 1.44/net/bluetooth/l2cap.c 2004-09-04 12:51:17 +02:00 +++ edited/net/bluetooth/l2cap.c 2004-09-21 01:23:41 +02:00 @@ -1005,9 +1005,10 @@ if (err) sk->sk_err = err; - if (parent) + if (parent) { + bt_accept_unlink(sk); parent->sk_data_ready(parent, 0); - else + } else sk->sk_state_change(sk); } ===== net/bluetooth/rfcomm/sock.c 1.29 vs edited ===== --- 1.29/net/bluetooth/rfcomm/sock.c 2004-06-04 02:41:47 +02:00 +++ edited/net/bluetooth/rfcomm/sock.c 2004-09-21 02:09:47 +02:00 @@ -104,8 +104,11 @@ if (d->state == BT_CONNECTED) rfcomm_session_getaddr(d->session, &bt_sk(sk)->src, NULL); sk->sk_state_change(sk); - } else + } else { + if (d->state == BT_CLOSED) + bt_accept_unlink(sk); parent->sk_data_ready(parent, 0); + } bh_unlock_sock(sk); }