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; 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; } -- 2.14.1