[pulseaudio-discuss] [PATCH] bluez5-device: Fix memory leak in sco_process_render()
Raman Shishniou
rommer at ibuffed.com
Tue Apr 10 11:04:36 UTC 2018
Hello,
On 04/10/2018 01:38 PM, Georg Chini wrote:
> 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.
>
I seen callback processing during memblock_free()
>> 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