Re: [PATCH] gatt: Fix double att_disconnected issue on disconnection

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Yunhan,

On Thu, Oct 25, 2018 at 4:47 AM Yunhan Wang <yunhanw@xxxxxxxxxx> wrote:
>
> Hi, Luiz
>
> I am observing the multiple crashes when doing BLE disconnection using
> latest bluez master..It looks like the two att_disconnect are
> triggered from your last gatt commit.. Please help take a look at this
> workaround and comments.. the better solution might be to figure out
> how to handle the disconnection along with random address and public
> address together regarding the previous issue, Gatt: Subscriptions are
> not cleared after disconnection from a temporary device

Ive pushed a similar fix, it should remove the handler before calling
att_disconnected.

> Thanks
> Best wishes
> Yunhan
> On Wed, Oct 24, 2018 at 5:42 PM yunhanw <yunhanw@xxxxxxxxxx> wrote:
> >
> > When BLE disconnection happens, att_disconnect is triggered from two locations, the new added location is gatt_server_cleanup, it would cause several blueetoothd crashes. This bus is introduced from commit 634f0a6e1125af8d5959bff119d9336a8d81c028, where gatt fix, gatt subscriptions are not cleared after disconnection from a temporary device with private/random address. In order to workaround this issue, btd_gatt_database_att_disconnected can only be triggered when address type is random, and for others, it can continue to use original disconnect code path.
> >
> >     crash 1
> >     Program received signal SIGSEGV, Segmentation fault.
> >     queue_remove (queue=0x30, data=data@entry=0x555555872a40) at /repo/src/shared/queue.c:256
> >     256     for (entry = queue->head, prev = NULL; entry;
> >     (gdb) backtrace
> >         at /bluez/repo/src/gatt-database.c:350
> >         at bluez/repo/src/shared/queue.c:220
> >         at bluez/repo/src/shared/att.c:592
> >         at bluez/repo/src/shared/io-glib.c:170
> >
> >     crash 2
> >         at bluez/repo/src/shared/queue.c:220
> >         at bluez/repo/src/shared/att.c:592
> >         at bluez/repo/src/shared/io-glib.c:170
> >
> >     (gdb) print state->db->adapter
> >     Cannot access memory at address 0x61672f6269727474
> > ---
> >  src/gatt-database.c | 2 ++
> >  1 file changed, 2 insertions(+)
> >
> > diff --git a/src/gatt-database.c b/src/gatt-database.c
> > index 783b692d5..2f0eb83b5 100644
> > --- a/src/gatt-database.c
> > +++ b/src/gatt-database.c
> > @@ -3365,6 +3365,8 @@ void btd_gatt_database_att_disconnected(struct btd_gatt_database *database,
> >
> >         addr = device_get_address(device);
> >         type = btd_device_get_bdaddr_type(device);
> > +    if (type != BDADDR_LE_RANDOM)
> > +        return;
> >
> >         state = find_device_state(database, addr, type);
> >         if (!state)
> > --
> > 2.19.1.568.g152ad8e336-goog
> >



-- 
Luiz Augusto von Dentz




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux