From: Travis Cross Date: Wed, 3 Sep 2014 19:42:25 +0000 (+0000) Subject: Check for null hash or private while holding lock X-Git-Tag: v1.4.8~2^2~61 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7d11e199830cfbb0964f8a9b7936759fe8e5a755;p=thirdparty%2Ffreeswitch.git 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 --- 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;