我在用freeswitch时候,先是点对点视频通话,通过 uuid_transfer -both "answer,conference:3601@video-mcu-stereo-720" inline ,切换到视频会议。有时会发生一侧或者两侧远程视频有玻璃遮罩现象。经过反复测试跟libpng和 vars.xml中 video_mute_png,如果 删除 video_mute_png配置或者禁用libpng类库不会发生这种情况。

最后结论分析如下,仅供参考:
READ 视频合成线程 conference_video_muxing_thread_run conference_video.c:4053 ... && layer->cur_img && ...
WRITE/free 成员/layer 线程 conference_video_reset_layer conference_video.c:438 switch_img_free(&layer->cur_img)
free 侧调用链:conference_video_reset_layer(:438) ← conference_video_detach_video_layer(:1077) ← 会议中 layer 重分配(conference_video.c:1495/1656/2170/3482)及 member_del(:1363)。
为什么是玻璃遮罩
合成线程读到 layer->cur_img(非 NULL),正要拿去合成/编码,另一线程在 reset_layer 里 switch_img_free 把它释放了。合成线程解引用的已是释放后的图像 ->
UAF。读到的不是堆垃圾,而是该图像缓冲被释放前的最后写入内容(陈旧帧 + 已失效的 plane/stride)-> 合成出错 -> 绿/紫色块 = 玻璃遮罩。
我在用freeswitch时候,先是点对点视频通话,通过 uuid_transfer -both "answer,conference:3601@video-mcu-stereo-720" inline ,切换到视频会议。有时会发生一侧或者两侧远程视频有玻璃遮罩现象。经过反复测试跟libpng和 vars.xml中 video_mute_png,如果 删除 video_mute_png配置或者禁用libpng类库不会发生这种情况。
free 侧调用链:conference_video_reset_layer(:438) ← conference_video_detach_video_layer(:1077) ← 会议中 layer 重分配(conference_video.c:1495/1656/2170/3482)及 member_del(:1363)。
为什么是玻璃遮罩
合成线程读到 layer->cur_img(非 NULL),正要拿去合成/编码,另一线程在 reset_layer 里 switch_img_free 把它释放了。合成线程解引用的已是释放后的图像 ->
UAF。读到的不是堆垃圾,而是该图像缓冲被释放前的最后写入内容(陈旧帧 + 已失效的 plane/stride)-> 合成出错 -> 绿/紫色块 = 玻璃遮罩。