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
This commit is contained in:
Travis Cross 2014-09-03 19:42:25 +00:00
parent 82a28e76e4
commit 7d11e19983
1 changed files with 3 additions and 2 deletions

View File

@ -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;