From 97c5f9143ca0a7764f014314bf5cf3b4b1e65ad6 Mon Sep 17 00:00:00 2001 From: KimJeongYeon Date: Fri, 8 Jan 2016 11:24:19 +0900 Subject: [PATCH] memblock: Fix double lock/unlock pa_memexport_process_release() was self-locked function, but some caller used lock/unlock again. (e.g pa_memexport_free(), memexport_revoke_blocks()) Signed-off-by: KimJeongYeon --- src/pulsecore/memblock.c | 15 +++++++++------ src/pulsecore/memblock.h | 2 +- src/pulsecore/pstream.c | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/pulsecore/memblock.c b/src/pulsecore/memblock.c index 9b6810d..215e519 100644 --- a/src/pulsecore/memblock.c +++ b/src/pulsecore/memblock.c @@ -1116,7 +1116,7 @@ void pa_memexport_free(pa_memexport *e) { pa_mutex_lock(e->mutex); while (e->used_slots) - pa_memexport_process_release(e, (uint32_t) (e->used_slots - e->slots + e->baseidx)); + pa_memexport_process_release(e, (uint32_t) (e->used_slots - e->slots + e->baseidx), false); pa_mutex_unlock(e->mutex); pa_mutex_lock(e->pool->mutex); @@ -1128,12 +1128,13 @@ void pa_memexport_free(pa_memexport *e) { } /* Self-locked */ -int pa_memexport_process_release(pa_memexport *e, uint32_t id) { +int pa_memexport_process_release(pa_memexport *e, uint32_t id, bool use_lock) { pa_memblock *b; pa_assert(e); - pa_mutex_lock(e->mutex); + if (use_lock) + pa_mutex_lock(e->mutex); if (id < e->baseidx) goto fail; @@ -1151,7 +1152,8 @@ int pa_memexport_process_release(pa_memexport *e, uint32_t id) { PA_LLIST_REMOVE(struct memexport_slot, e->used_slots, &e->slots[id]); PA_LLIST_PREPEND(struct memexport_slot, e->free_slots, &e->slots[id]); - pa_mutex_unlock(e->mutex); + if (use_lock) + pa_mutex_unlock(e->mutex); /* pa_log("Processing release for %u", id); */ @@ -1166,7 +1168,8 @@ int pa_memexport_process_release(pa_memexport *e, uint32_t id) { return 0; fail: - pa_mutex_unlock(e->mutex); + if (use_lock) + pa_mutex_unlock(e->mutex); return -1; } @@ -1189,7 +1192,7 @@ static void memexport_revoke_blocks(pa_memexport *e, pa_memimport *i) { idx = (uint32_t) (slot - e->slots + e->baseidx); e->revoke_cb(e, idx, e->userdata); - pa_memexport_process_release(e, idx); + pa_memexport_process_release(e, idx, false); } pa_mutex_unlock(e->mutex); diff --git a/src/pulsecore/memblock.h b/src/pulsecore/memblock.h index 4faef75..54cd77a 100644 --- a/src/pulsecore/memblock.h +++ b/src/pulsecore/memblock.h @@ -142,6 +142,6 @@ int pa_memimport_process_revoke(pa_memimport *i, uint32_t block_id); pa_memexport* pa_memexport_new(pa_mempool *p, pa_memexport_revoke_cb_t cb, void *userdata); void pa_memexport_free(pa_memexport *e); int pa_memexport_put(pa_memexport *e, pa_memblock *b, uint32_t *block_id, uint32_t *shm_id, size_t *offset, size_t *size); -int pa_memexport_process_release(pa_memexport *e, uint32_t id); +int pa_memexport_process_release(pa_memexport *e, uint32_t id, bool use_lock); #endif diff --git a/src/pulsecore/pstream.c b/src/pulsecore/pstream.c index 98a8382..5e5ee14 100644 --- a/src/pulsecore/pstream.c +++ b/src/pulsecore/pstream.c @@ -794,7 +794,7 @@ static int do_read(pa_pstream *p, struct pstream_read *re) { /* pa_log("Got release frame for %u", ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_OFFSET_HI])); */ pa_assert(p->export); - pa_memexport_process_release(p->export, ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_OFFSET_HI])); + pa_memexport_process_release(p->export, ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_OFFSET_HI]), true); goto frame_done; -- 1.7.9.5