提交 03576e82 authored 作者: Anthony Minessale's avatar Anthony Minessale

FS-10757: [mod_conference] Race condition freeing avatar image #resolve

上级 33006611
...@@ -832,7 +832,9 @@ void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, void *ob ...@@ -832,7 +832,9 @@ void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, void *ob
if (switch_channel_test_flag(channel, CF_VIDEO) && !conference_utils_member_test_flag(member, MFLAG_ACK_VIDEO)) { if (switch_channel_test_flag(channel, CF_VIDEO) && !conference_utils_member_test_flag(member, MFLAG_ACK_VIDEO)) {
conference_utils_member_set_flag_locked(member, MFLAG_ACK_VIDEO); conference_utils_member_set_flag_locked(member, MFLAG_ACK_VIDEO);
switch_mutex_lock(member->flag_mutex);
switch_img_free(&member->avatar_png_img); switch_img_free(&member->avatar_png_img);
switch_mutex_unlock(member->flag_mutex);
conference_video_check_avatar(member, SWITCH_FALSE); conference_video_check_avatar(member, SWITCH_FALSE);
switch_core_session_video_reinit(member->session); switch_core_session_video_reinit(member->session);
conference_video_set_floor_holder(member->conference, member, SWITCH_FALSE); conference_video_set_floor_holder(member->conference, member, SWITCH_FALSE);
......
...@@ -1191,9 +1191,11 @@ switch_status_t conference_member_del(conference_obj_t *conference, conference_m ...@@ -1191,9 +1191,11 @@ switch_status_t conference_member_del(conference_obj_t *conference, conference_m
last = imember; last = imember;
} }
switch_mutex_lock(member->flag_mutex);
switch_img_free(&member->avatar_png_img); switch_img_free(&member->avatar_png_img);
switch_img_free(&member->video_mute_img); switch_img_free(&member->video_mute_img);
switch_img_free(&member->pcanvas_img); switch_img_free(&member->pcanvas_img);
switch_mutex_unlock(member->flag_mutex);
switch_thread_rwlock_unlock(member->rwlock); switch_thread_rwlock_unlock(member->rwlock);
......
...@@ -2371,8 +2371,10 @@ void conference_video_check_avatar(conference_member_t *member, switch_bool_t fo ...@@ -2371,8 +2371,10 @@ void conference_video_check_avatar(conference_member_t *member, switch_bool_t fo
avatar = var; avatar = var;
} }
switch_mutex_lock(member->flag_mutex);
switch_img_free(&member->avatar_png_img); switch_img_free(&member->avatar_png_img);
if (avatar) { if (avatar) {
member->avatar_png_img = switch_img_read_png(avatar, SWITCH_IMG_FMT_I420); member->avatar_png_img = switch_img_read_png(avatar, SWITCH_IMG_FMT_I420);
} }
...@@ -2385,6 +2387,8 @@ void conference_video_check_avatar(conference_member_t *member, switch_bool_t fo ...@@ -2385,6 +2387,8 @@ void conference_video_check_avatar(conference_member_t *member, switch_bool_t fo
member->auto_avatar = 1; member->auto_avatar = 1;
} }
switch_mutex_unlock(member->flag_mutex);
if (canvas) { if (canvas) {
switch_mutex_unlock(canvas->mutex); switch_mutex_unlock(canvas->mutex);
conference_video_release_canvas(&canvas); conference_video_release_canvas(&canvas);
...@@ -2404,7 +2408,9 @@ void conference_video_check_flush(conference_member_t *member, switch_bool_t for ...@@ -2404,7 +2408,9 @@ void conference_video_check_flush(conference_member_t *member, switch_bool_t for
if ((flushed || force) && member->auto_avatar) { if ((flushed || force) && member->auto_avatar) {
switch_channel_video_sync(member->channel); switch_channel_video_sync(member->channel);
switch_mutex_lock(member->flag_mutex);
switch_img_free(&member->avatar_png_img); switch_img_free(&member->avatar_png_img);
switch_mutex_unlock(member->flag_mutex);
member->avatar_patched = 0; member->avatar_patched = 0;
conference_video_reset_video_bitrate_counters(member); conference_video_reset_video_bitrate_counters(member);
member->blanks = 0; member->blanks = 0;
...@@ -3329,6 +3335,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr ...@@ -3329,6 +3335,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
} }
} }
switch_mutex_lock(imember->flag_mutex);
if (imember->avatar_png_img) { if (imember->avatar_png_img) {
if (layer) { if (layer) {
if (!imember->avatar_patched || !layer->cur_img) { if (!imember->avatar_patched || !layer->cur_img) {
...@@ -3342,6 +3349,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr ...@@ -3342,6 +3349,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
} }
switch_img_free(&img); switch_img_free(&img);
} }
switch_mutex_unlock(imember->flag_mutex);
if (imember->video_layer_id < 0) { if (imember->video_layer_id < 0) {
layer = NULL; layer = NULL;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论