Bug: poll_output() 错误被静默吞没,WebRTC 进入僵尸状态 (webrtc.rs:370) #14
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
位置
src/webrtc.rs:370-373严重性
🟡 中
问题描述
当
self.rtc.poll_output()返回Err时,代码仅记录日志后break退出循环,最终返回Ok(false)。这意味着上层WebRtcState::poll_rtc无法感知内部 Rtc 已进入不可恢复的错误状态,self.inner不会被清理。后续每次调用都会重复同样的日志→继续循环的模式,形成无效轮询。建议修复
对于不可恢复的错误,返回
Err让上层决定是否销毁inner;或者至少返回Ok(true)触发清理路径:或者更简单的方案(与 issue #10 配合):
修复方案(Oracle 审核)
按 Oracle 建议采用方案 B:不仅修复
Err分支,同时修复write_h264_frame中清理信号丢失问题。改动清单
1.
WebRtcInner::poll_rtcErr 分支(line 380)break→self.connected = false; return Ok(true)2.
WebRtcInner::write_h264_frame(line 427)Result<()>→Result<bool>poll_rtc()的清理信号(should_destroy)3.
WebRtcState::write_h264_frame(line 248)should_destroy,触发时self.inner = NoneResult<()>,外部调用方无需变更未改动
IceConnectionState::Failed/Closed:str0m 0.20.0 的 is 0.9.1 中这两个变体已被注释掉,不存在验证
cargo build编译通过(无新增 warning)Commit:
f3da1e4