提交 622e0e1a authored 作者: Travis Cross's avatar Travis Cross

Check for null hash on increment of mod_hash limit

When we specifically release all limits on a channel we destroy the
hash table stored in the "limit_hash" private channel data but we
don't destroy the private data as it will be reclaimed as part of the
session.  If limit increment is called after the limit release we can
reuse that channel private, but we need to check whether the hash
table is null first.  Fortunately this makes the code look better
anyway.

FS-6775 #resolve
FS-6783 #resolve
上级 c8afe476
...@@ -150,21 +150,15 @@ SWITCH_LIMIT_INCR(limit_incr_hash) ...@@ -150,21 +150,15 @@ SWITCH_LIMIT_INCR(limit_incr_hash)
switch_core_hash_insert(globals.limit_hash, hashkey, item); switch_core_hash_insert(globals.limit_hash, hashkey, item);
} }
/* Did we already run on this channel before? */ if (!(pvt = switch_channel_get_private(channel, "limit_hash"))) {
if ((pvt = switch_channel_get_private(channel, "limit_hash"))) {
/* Yes, but check if we did that realm+resource
If we didnt, allow incrementing the counter.
If we did, dont touch it but do the validation anyways
*/
increment = !switch_core_hash_find(pvt->hash, hashkey);
} else {
/* This is the first limit check on this channel, create a hashtable, set our private data */
pvt = (limit_hash_private_t *) switch_core_session_alloc(session, sizeof(limit_hash_private_t)); pvt = (limit_hash_private_t *) switch_core_session_alloc(session, sizeof(limit_hash_private_t));
memset(pvt, 0, sizeof(limit_hash_private_t)); memset(pvt, 0, sizeof(limit_hash_private_t));
switch_core_hash_init(&pvt->hash);
switch_channel_set_private(channel, "limit_hash", pvt); switch_channel_set_private(channel, "limit_hash", pvt);
} }
if (!(pvt->hash)) {
switch_core_hash_init(&pvt->hash);
}
increment = !switch_core_hash_find(pvt->hash, hashkey);
remote_usage = get_remote_usage(hashkey); remote_usage = get_remote_usage(hashkey);
if (interval > 0) { if (interval > 0) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论