aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorGianluca Anzolin <gianluca@sottospazio.it>2013-07-29 17:08:13 +0200
committerGustavo Padovan <gustavo.padovan@collabora.co.uk>2013-08-21 16:47:08 +0200
commitffe6b68cc5999a3f91a15b6667e69e14186e337d (patch)
tree4b9732f2d2ce8e6368a77d1d4b6490e3c1312c29 /net
parentBluetooth: Fix the reference counting of tty_port (diff)
downloadlinux-dev-ffe6b68cc5999a3f91a15b6667e69e14186e337d.tar.xz
linux-dev-ffe6b68cc5999a3f91a15b6667e69e14186e337d.zip
Bluetooth: Purge the dlc->tx_queue to avoid circular dependency
In rfcomm_tty_cleanup we purge the dlc->tx_queue which may contain socket buffers referencing the tty_port and thus preventing the tty_port destruction. Signed-off-by: Gianluca Anzolin <gianluca@sottospazio.it> Reviewed-by: Peter Hurley <peter@hurleysoftware.com> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Diffstat (limited to 'net')
-rw-r--r--net/bluetooth/rfcomm/tty.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c
index 3e078b73cc22..6d126faf145f 100644
--- a/net/bluetooth/rfcomm/tty.c
+++ b/net/bluetooth/rfcomm/tty.c
@@ -668,6 +668,12 @@ static void rfcomm_tty_cleanup(struct tty_struct *tty)
tty->driver_data = NULL;
rfcomm_dlc_unlock(dev->dlc);
+ /*
+ * purge the dlc->tx_queue to avoid circular dependencies
+ * between dev and dlc
+ */
+ skb_queue_purge(&dev->dlc->tx_queue);
+
tty_port_put(&dev->port);
}