]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-8082 #resolve #comment [mod_rayo] do not remove items from hash while iterating
authorChris Rienzo <chris.rienzo@citrix.com>
Tue, 1 Sep 2015 16:50:02 +0000 (12:50 -0400)
committerChris Rienzo <chris.rienzo@citrix.com>
Tue, 1 Sep 2015 16:50:02 +0000 (12:50 -0400)
src/mod/event_handlers/mod_rayo/mod_rayo.c

index ca63beeb34c9de73cad84887bebcf0d63c6b5069..4a008e9b8487a5668803eefb8b07bd85c280fe55 100644 (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);
                        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;
+                       from_call->num_acps--;
 
                        if (selection != -1) {
                                break;
@@ -3916,16 +3914,35 @@ static int send_offer_to_clients(struct rayo_call *from_call, switch_core_sessio
        }
        switch_safe_free(hi);
 
-       /* queue offer information */
-       if (globals.offer_timeout_us > 0 && sent) {
-               struct offered_call_info *offered_call;
-               switch_zmalloc(offered_call, sizeof(*offered_call));
-               offered_call->offer_time = switch_micro_time_now();
-               offered_call->call_jid = strdup(RAYO_JID(from_call));
-               if (switch_queue_trypush(globals.offer_queue, offered_call) != SWITCH_STATUS_SUCCESS) {
-                       switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "Failed to queue offered call info!  Offer timeout won't work on this call\n");
-                       switch_safe_free(offered_call->call_jid);
-                       switch_safe_free(offered_call);
+       if (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;
+                       switch_zmalloc(offered_call, sizeof(*offered_call));
+                       offered_call->offer_time = switch_micro_time_now();
+                       offered_call->call_jid = strdup(RAYO_JID(from_call));
+                       if (switch_queue_trypush(globals.offer_queue, offered_call) != SWITCH_STATUS_SUCCESS) {
+                               switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "Failed to queue offered call info!  Offer timeout won't work on this call\n");
+                               switch_safe_free(offered_call->call_jid);
+                               switch_safe_free(offered_call);
+                       }
                }
        }