Thread (3 messages) 3 messages, 3 authors, 2021-06-10

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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help