summary refs log tree commit diff
path: root/net/nfc/llcp_core.c
diff options
context:
space:
mode:
authorThierry Escande <thierry.escande@linux.intel.com>2013-06-04 11:34:51 +0200
committerSamuel Ortiz <sameo@linux.intel.com>2013-06-14 13:45:05 +0200
commit17f7ae16aef1f58bc4af4c7a16b8778a91a30255 (patch)
tree02ee0a69207c231a5bd3939ccee7021cbbaddd65 /net/nfc/llcp_core.c
parent58e3dd1558f56e95e7077a63340bb33e7aa42946 (diff)
downloadlinux-17f7ae16aef1f58bc4af4c7a16b8778a91a30255.tar.gz
NFC: Keep socket alive until the DISC PDU is actually sent
This patch keeps the socket alive and therefore does not remove
it from the sockets list in the local until the DISC PDU has been
actually sent. Otherwise we would reply with DM PDUs before sending
the DISC one.

Signed-off-by: Thierry Escande <thierry.escande@linux.intel.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'net/nfc/llcp_core.c')
-rw-r--r--net/nfc/llcp_core.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/net/nfc/llcp_core.c b/net/nfc/llcp_core.c
index 158bdbf668cc..1c4c048e0a1b 100644
--- a/net/nfc/llcp_core.c
+++ b/net/nfc/llcp_core.c
@@ -730,6 +730,13 @@ static void nfc_llcp_tx_work(struct work_struct *work)
 				       DUMP_PREFIX_OFFSET, 16, 1,
 				       skb->data, skb->len, true);
 
+			if (ptype == LLCP_PDU_DISC && sk != NULL &&
+			    sk->sk_state == LLCP_DISCONNECTING) {
+				nfc_llcp_sock_unlink(&local->sockets, sk);
+				sock_orphan(sk);
+				sock_put(sk);
+			}
+
 			if (ptype == LLCP_PDU_I)
 				copy_skb = skb_copy(skb, GFP_ATOMIC);