[pulseaudio-discuss] [PATCH] bluez5-device: Fix memory leak in sco_process_render()
Georg Chini
georg at chini.tk
Tue Apr 10 10:38:45 UTC 2018
On 10.04.2018 10:21, Raman Shishniou wrote:
> Hello,
>
> On 04/09/2018 07:15 PM, Georg Chini wrote:
>> sco_process_render does not unref the memblock when it encounters an error.
>>
>> This patch fixes the issue. It also changes the return value to 1 in the case
>> of EAGAIN. Because the data was already rendered and cannot be re-sent, we
>> have to discard the block.
>> ---
>> src/modules/bluetooth/module-bluez5-device.c | 12 +++++++++---
>> 1 file changed, 9 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/modules/bluetooth/module-bluez5-device.c b/src/modules/bluetooth/module-bluez5-device.c
>> index 95d288ef..b81c233c 100644
>> --- a/src/modules/bluetooth/module-bluez5-device.c
>> +++ b/src/modules/bluetooth/module-bluez5-device.c
>> @@ -282,9 +282,13 @@ static int sco_process_render(struct userdata *u) {
>> if (errno == EINTR)
>> /* Retry right away if we got interrupted */
>> continue;
>> - else if (errno == EAGAIN)
>> - /* Hmm, apparently the socket was not writable, give up for now */
>> - return 0;
>> +
>> + pa_memblock_unref(memchunk.memblock);
>> +
>> + if (errno == EAGAIN)
>> + /* Hmm, apparently the socket was not writable, give up for now.
>> + * Because the data was already rendered, let's discard the block. */
>> + return 1;
>>
> 1. errno value can be changed during pa_memblock_unref()
I don't think so. The only possible system calls used during unref should be
calls to free() and because we always use pa_xfree(), the errno value will
be preserved.
> 2. I think the same changes are required for a2dp_process_render() too.
No, a2dp_process_render() works slightly different. It keeps the memchunk
in userdata and tries to re-send the same block again.
>
>
>> pa_log_error("Failed to write data to SCO socket: %s", pa_cstrerror(errno));
>> return -1;
>> @@ -296,6 +300,8 @@ static int sco_process_render(struct userdata *u) {
>> pa_log_error("Wrote memory block to socket only partially! %llu written, wanted to write %llu.",
>> (unsigned long long) l,
>> (unsigned long long) memchunk.length);
>> +
>> + pa_memblock_unref(memchunk.memblock);
>> return -1;
>> }
>>
>>
> --
> Raman
More information about the pulseaudio-discuss
mailing list