pa__done() calls stop_thread(), and stop_thread() already frees the smoother. The duplicate freeing is not strictly a bug, but static analyzers (in this case Coverity) may complain about double-freeing, because when pa__done() "frees" the smoother (which doesn't actually ever happen), the pointer is not nulled. pa__done() then calls bt_transport_release(), which will also free the smoother if it's not NULL. The analyzer complaint could be silenced also by nulling the pointer in pa__done(), but since this is clearly redundant code, I chose to remove it. --- src/modules/bluetooth/module-bluetooth-device.c | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c index 7992e12..d5240f5 100644 --- a/src/modules/bluetooth/module-bluetooth-device.c +++ b/src/modules/bluetooth/module-bluetooth-device.c @@ -3077,9 +3077,6 @@ void pa__done(pa_module *m) { if (u->card) pa_card_free(u->card); - if (u->read_smoother) - pa_smoother_free(u->read_smoother); - shutdown_bt(u); if (u->a2dp.buffer) -- 1.7.8