FS-8082 #resolve #comment [mod_rayo] do not remove items from hash while iterating

This commit is contained in:
Chris Rienzo 2015-09-01 12:50:02 -04:00
parent 1b8814430e
commit c74264b942

View File

@ -3904,10 +3904,8 @@ static int send_offer_to_clients(struct rayo_call *from_call, switch_core_sessio
iks_insert_attrib(offer, "to", to_client_jid); iks_insert_attrib(offer, "to", to_client_jid);
RAYO_SEND_MESSAGE_DUP(from_call, to_client_jid, offer); RAYO_SEND_MESSAGE_DUP(from_call, to_client_jid, offer);
/* remove client JID from list of available clients */
switch_core_hash_delete(from_call->acps, to_client_jid);
from_call->num_acps--;
sent = 1; sent = 1;
from_call->num_acps--;
if (selection != -1) { if (selection != -1) {
break; break;
@ -3916,8 +3914,26 @@ static int send_offer_to_clients(struct rayo_call *from_call, switch_core_sessio
} }
switch_safe_free(hi); switch_safe_free(hi);
/* queue offer information */ if (sent) {
if (globals.offer_timeout_us > 0 && sent) { /* remove offered client JID(s) from list of available clients */
hi = NULL;
for (hi = switch_core_hash_first(from_call->pcps); hi; hi = switch_core_hash_next(&hi)) {
const char *to_client_jid = NULL;
const void *key;
void *val;
/* get client jid that was sent offer */
switch_core_hash_this(hi, &key, NULL, &val);
to_client_jid = (const char *)key;
switch_assert(to_client_jid);
/* remove client jid from available controlling parties */
switch_core_hash_delete(from_call->acps, to_client_jid);
}
switch_safe_free(hi);
/* remember when offer was sent for this call to track timeouts */
if (globals.offer_timeout_us > 0) {
struct offered_call_info *offered_call; struct offered_call_info *offered_call;
switch_zmalloc(offered_call, sizeof(*offered_call)); switch_zmalloc(offered_call, sizeof(*offered_call));
offered_call->offer_time = switch_micro_time_now(); offered_call->offer_time = switch_micro_time_now();
@ -3928,6 +3944,7 @@ static int send_offer_to_clients(struct rayo_call *from_call, switch_core_sessio
switch_safe_free(offered_call); switch_safe_free(offered_call);
} }
} }
}
if (offer) { if (offer) {
iks_delete(offer); iks_delete(offer);