From 7d11e199830cfbb0964f8a9b7936759fe8e5a755 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 3 Sep 2014 19:42:25 +0000 Subject: [PATCH] Check for null hash or private while holding lock What if the hash were destroyed by one thread holding the lock while another thread was waiting for the lock? The waiting thread would have already checked that the hash was non-null and would proceed on that assumption after acquiring the lock. With this commit we check only after acquiring the lock. ref: FS-6783 ref: FS-6775 --- src/mod/applications/mod_hash/mod_hash.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/mod/applications/mod_hash/mod_hash.c b/src/mod/applications/mod_hash/mod_hash.c index 133f05de3e..fdc12bee2b 100644 --- a/src/mod/applications/mod_hash/mod_hash.c +++ b/src/mod/applications/mod_hash/mod_hash.c @@ -280,12 +280,13 @@ SWITCH_LIMIT_RELEASE(limit_release_hash) limit_hash_private_t *pvt = switch_channel_get_private(channel, "limit_hash"); limit_hash_item_t *item = NULL; + switch_thread_rwlock_wrlock(globals.limit_hash_rwlock); + if (!pvt || !pvt->hash) { + switch_thread_rwlock_unlock(globals.limit_hash_rwlock); return SWITCH_STATUS_SUCCESS; } - switch_thread_rwlock_wrlock(globals.limit_hash_rwlock); - /* clear for uuid */ if (realm == NULL && resource == NULL) { switch_hash_index_t *hi = NULL;