Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Bluetooth: 6lowpan: add missing l2cap_chan_lock()

l2cap_chan_close() needs to be called in l2cap_chan_lock(), otherwise
l2cap_le_sig_cmd() etc. may run concurrently.

Add missing locks around l2cap_chan_close().

Fixes: 6b8d4a6a0314 ("Bluetooth: 6LoWPAN: Use connected oriented channel instead of fixed one")
Signed-off-by: Pauli Virtanen <pav@iki.fi>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

authored by

Pauli Virtanen and committed by
Luiz Augusto von Dentz
15f32cab 98454bc8

+8
+8
net/bluetooth/6lowpan.c
··· 927 927 928 928 BT_DBG("peer %p chan %p", peer, peer->chan); 929 929 930 + l2cap_chan_lock(peer->chan); 930 931 l2cap_chan_close(peer->chan, ENOENT); 932 + l2cap_chan_unlock(peer->chan); 931 933 932 934 return 0; 933 935 } ··· 1091 1089 1092 1090 mutex_lock(&set_lock); 1093 1091 if (listen_chan) { 1092 + l2cap_chan_lock(listen_chan); 1094 1093 l2cap_chan_close(listen_chan, 0); 1094 + l2cap_chan_unlock(listen_chan); 1095 1095 l2cap_chan_put(listen_chan); 1096 1096 } 1097 1097 ··· 1152 1148 1153 1149 mutex_lock(&set_lock); 1154 1150 if (listen_chan) { 1151 + l2cap_chan_lock(listen_chan); 1155 1152 l2cap_chan_close(listen_chan, 0); 1153 + l2cap_chan_unlock(listen_chan); 1156 1154 l2cap_chan_put(listen_chan); 1157 1155 listen_chan = NULL; 1158 1156 } ··· 1316 1310 debugfs_remove(lowpan_control_debugfs); 1317 1311 1318 1312 if (listen_chan) { 1313 + l2cap_chan_lock(listen_chan); 1319 1314 l2cap_chan_close(listen_chan, 0); 1315 + l2cap_chan_unlock(listen_chan); 1320 1316 l2cap_chan_put(listen_chan); 1321 1317 } 1322 1318