]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-10048: [mod_conference] Possible crash on mass exit of members from a conference...
authorAnthony Minessale <anthm@freeswitch.org>
Wed, 15 Feb 2017 22:21:54 +0000 (16:21 -0600)
committerAnthony Minessale <anthm@freeswitch.org>
Wed, 15 Feb 2017 22:21:54 +0000 (16:21 -0600)
src/mod/applications/mod_conference/conference_cdr.c

index 35e03593e60ff7b66c1926aa1d3bff326f34d8c9..e3ba2d5eca1610b0f9848735dad138cd759268f7 100644 (file)
@@ -488,16 +488,20 @@ cJSON *conference_cdr_json_render(conference_obj_t *conference, cJSON *req)
 
 void conference_cdr_del(conference_member_t *member)
 {
-       if (!member->cdr_node) return;
-
-       if (member->channel) {
-               switch_channel_get_variables(member->channel, &member->cdr_node->var_event);
-       }
+       switch_mutex_lock(member->conference->member_mutex);
        if (member->cdr_node) {
-               member->cdr_node->leave_time = switch_epoch_time_now(NULL);
-               memcpy(member->cdr_node->mflags, member->flags, sizeof(member->flags));
-               member->cdr_node->member = NULL;
+
+               if (member->channel) {
+                       switch_channel_get_variables(member->channel, &member->cdr_node->var_event);
+               }
+
+               if (member->cdr_node) {
+                       member->cdr_node->leave_time = switch_epoch_time_now(NULL);
+                       memcpy(member->cdr_node->mflags, member->flags, sizeof(member->flags));
+                       member->cdr_node->member = NULL;
+               }
        }
+       switch_mutex_unlock(member->conference->member_mutex);
 }
 
 void conference_cdr_add(conference_member_t *member)
@@ -506,10 +510,12 @@ void conference_cdr_add(conference_member_t *member)
        switch_caller_profile_t *cp;
        switch_channel_t *channel;
 
+       switch_mutex_lock(member->conference->member_mutex);
+
        if (zstr(member->conference->log_dir) &&
                (member->conference->cdr_event_mode == CDRE_NONE) &&
                !conference_utils_test_flag(member->conference, CFLAG_RFC4579)) {
-               return;
+               goto end;
        }
 
        np = switch_core_alloc(member->conference->pool, sizeof(*np));
@@ -521,20 +527,22 @@ void conference_cdr_add(conference_member_t *member)
 
        if (!member->session) {
                member->cdr_node->record_path = switch_core_strdup(member->conference->pool, member->rec_path);
-               return;
+               goto end;
        }
 
        channel = switch_core_session_get_channel(member->session);
 
        if (!(cp = switch_channel_get_caller_profile(channel))) {
-               return;
+               goto end;
        }
 
        member->cdr_node->cp = switch_caller_profile_dup(member->conference->pool, cp);
 
        member->cdr_node->id = member->id;
 
+ end:
 
+       switch_mutex_unlock(member->conference->member_mutex);
 
 }