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

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

 



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

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
>




[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