Re: [PATCH BlueZ] Check whether device is connected before attaching EATT
flat view
From: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
Date: 2021-06-10 20:59:57
Hi Sonny, On Thu, Jun 10, 2021 at 11:20 AM Sonny Sasaka [off-list ref] wrote:
quoted hunk ↗ jump to hunk
Due to a race condition, device_attach_att() may be reached when the dev is actually already disconnected but dev->att is not yet cleaned up by att_disconnect_cb(). Therefore we should check whether the dev is connected before attaching EATT. The race condition is discovered at rare cases when there is a very quick reconnection after disconnection so that device_attach_att() is called even before att_disconnect_cb(). This case is more probable to happen when the host goes to suspend right before dev_disconnected() is invoked and when the host is woken up by a reconnection the reconnection is processed earlier than the cleanup in att_disconnect_cb(). Reviewed-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org> --- src/device.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)diff --git a/src/device.c b/src/device.c index 65838f59f..319a929ee 100644 --- a/src/device.c +++ b/src/device.c@@ -5306,7 +5306,7 @@ bool device_attach_att(struct btd_device *dev, GIOChannel *io) return false; } - if (dev->att) { + if (btd_device_is_connected(dev) && dev->att) { if (btd_opts.gatt_channels == bt_att_get_channels(dev->att)) { DBG("EATT channel limit reached"); return false;
Perhaps we should have this check earlier, also there seems to be something wrong with att_io then, if the device is no longer connected att_io shall have been unrefed as well.
-- 2.31.0
-- Luiz Augusto von Dentz