[pulseaudio-discuss] [PATCH] bluez5: Fix free order of adapters and devices

Alexander E. Patrakov patrakov at gmail.com
Fri Nov 28 06:53:58 PST 2014


28.11.2014 17:43, David Henningsson wrote:
> Because the adapters reference the devices hashmap on free, we mush
> free the adapters hashmap first and then the devices hashmap.

I think the fix is incomplete, or there is more than one problem. If I 
kill pulseaudio that receives audio from my phone (using a2dp profile), 
I get this:

==5256== Invalid read of size 1
==5256==    at 0x5D5FCE0: pa_idxset_string_hash_func (idxset.c:67)
==5256==    by 0x5D5EBF5: remove_entry (hashmap.c:103)
==5256==    by 0x5D5F2BB: pa_hashmap_remove_all (hashmap.c:229)
==5256==    by 0x5D5F341: pa_hashmap_free (hashmap.c:120)
==5256==    by 0x1E50443C: module_bluez5_discover_LTX_pa__done 
(module-bluez5-discover.c:162)
==5256==    by 0x4E60B48: pa_module_free (module.c:227)
==5256==    by 0x4E61929: pa_module_unload_all (module.c:292)
==5256==    by 0x406476: main (main.c:1161)
==5256==  Address 0x1aa7d670 is 0 bytes inside a block of size 38 free'd
==5256==    at 0x4C2A20C: free (in 
/usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==5256==    by 0x510395E: pa_xfree (xmalloc.c:131)
==5256==    by 0x1E70BA4F: device_free (bluez5-util.c:433)
==5256==    by 0x5D5F2DC: pa_hashmap_remove_all (hashmap.c:232)
==5256==    by 0x5D5F341: pa_hashmap_free (hashmap.c:120)
==5256==    by 0x1E70EAB5: pa_bluetooth_discovery_unref (bluez5-util.c:1667)
==5256==    by 0x1E50442E: module_bluez5_discover_LTX_pa__done 
(module-bluez5-discover.c:159)
==5256==    by 0x4E60B48: pa_module_free (module.c:227)
==5256==    by 0x4E61929: pa_module_unload_all (module.c:292)
==5256==    by 0x406476: main (main.c:1161)
==5256==
==5256== Invalid read of size 1
==5256==    at 0x5D5FCFE: pa_idxset_string_hash_func (idxset.c:67)
==5256==    by 0x5D5EBF5: remove_entry (hashmap.c:103)
==5256==    by 0x5D5F2BB: pa_hashmap_remove_all (hashmap.c:229)
==5256==    by 0x5D5F341: pa_hashmap_free (hashmap.c:120)
==5256==    by 0x1E50443C: module_bluez5_discover_LTX_pa__done 
(module-bluez5-discover.c:162)
==5256==    by 0x4E60B48: pa_module_free (module.c:227)
==5256==    by 0x4E61929: pa_module_unload_all (module.c:292)
==5256==    by 0x406476: main (main.c:1161)
==5256==  Address 0x1aa7d671 is 1 bytes inside a block of size 38 free'd
==5256==    at 0x4C2A20C: free (in 
/usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==5256==    by 0x510395E: pa_xfree (xmalloc.c:131)
==5256==    by 0x1E70BA4F: device_free (bluez5-util.c:433)
==5256==    by 0x5D5F2DC: pa_hashmap_remove_all (hashmap.c:232)
==5256==    by 0x5D5F341: pa_hashmap_free (hashmap.c:120)
==5256==    by 0x1E70EAB5: pa_bluetooth_discovery_unref (bluez5-util.c:1667)
==5256==    by 0x1E50442E: module_bluez5_discover_LTX_pa__done 
(module-bluez5-discover.c:159)
==5256==    by 0x4E60B48: pa_module_free (module.c:227)
==5256==    by 0x4E61929: pa_module_unload_all (module.c:292)
==5256==    by 0x406476: main (main.c:1161)
==5256==



>
> Reported-by: Alexander Patrakov <patrakov at gmail.com>
> Signed-off-by: David Henningsson <david.henningsson at canonical.com>
> ---
>   src/modules/bluetooth/bluez5-util.c | 6 +++---
>   1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/src/modules/bluetooth/bluez5-util.c b/src/modules/bluetooth/bluez5-util.c
> index 6894e83..0b234ae 100644
> --- a/src/modules/bluetooth/bluez5-util.c
> +++ b/src/modules/bluetooth/bluez5-util.c
> @@ -1660,12 +1660,12 @@ void pa_bluetooth_discovery_unref(pa_bluetooth_discovery *y) {
>
>       pa_dbus_free_pending_list(&y->pending);
>
> -    if (y->devices)
> -        pa_hashmap_free(y->devices);
> -
>       if (y->adapters)
>           pa_hashmap_free(y->adapters);
>
> +    if (y->devices)
> +        pa_hashmap_free(y->devices);
> +
>       if (y->transports) {
>           pa_assert(pa_hashmap_isempty(y->transports));
>           pa_hashmap_free(y->transports);
>

-- 
Alexander E. Patrakov


More information about the pulseaudio-discuss mailing list