src/webrtc.rs:339-377
🔴 高
WebRtcInner::poll_rtc 在所有路径上都返回 Ok(false),包括检测到 IceConnectionState::Disconnected 时也只设置 self.connected = false 而未返回 true。
WebRtcInner::poll_rtc
Ok(false)
IceConnectionState::Disconnected
self.connected = false
true
WebRtcState::poll_rtc 依赖 inner.poll_rtc()? 返回 true 来触发 self.inner = None 的清理逻辑。由于始终返回 false,断连后 UDP socket、Rtc 实例及 65KB 缓冲区持续占用资源,直至新 SDP offer 到达时被替换。若客户端不再重连,这些资源将永久泄漏。
WebRtcState::poll_rtc
inner.poll_rtc()?
self.inner = None
false
在 Disconnected 和 Failed 事件分支中返回 Ok(true),通知上层销毁 inner:
Disconnected
Failed
Ok(true)
inner
Event::IceConnectionStateChange(IceConnectionState::Disconnected) => { tracing::warn!("WebRTC disconnected"); self.connected = false; return Ok(true); // 触发清理 } Event::IceConnectionStateChange(IceConnectionState::Failed) => { tracing::error!("WebRTC connection failed"); self.connected = false; return Ok(true); // 触发清理 }
提交: fc4733f
fc4733f
改动: src/webrtc.rs L360 — 在 IceConnectionState::Disconnected 分支添加 return Ok(true);
原理: WebRtcInner::poll_rtc() 始终返回 Ok(false),导致上层 WebRtcState::poll_rtc() 永远不触发 self.inner = None 的清理逻辑。断连后 UDP socket、Rtc 实例及 65KB 缓冲区持续占用,若客户端不再重连则永久泄漏。
审核备注:
No dependencies set.
The note is not visible to the blocked user.
位置
src/webrtc.rs:339-377严重性
🔴 高
问题描述
WebRtcInner::poll_rtc在所有路径上都返回Ok(false),包括检测到IceConnectionState::Disconnected时也只设置self.connected = false而未返回true。WebRtcState::poll_rtc依赖inner.poll_rtc()?返回true来触发self.inner = None的清理逻辑。由于始终返回false,断连后 UDP socket、Rtc 实例及 65KB 缓冲区持续占用资源,直至新 SDP offer 到达时被替换。若客户端不再重连,这些资源将永久泄漏。建议修复
在
Disconnected和Failed事件分支中返回Ok(true),通知上层销毁inner:修复信息
提交:
fc4733f改动: src/webrtc.rs L360 — 在 IceConnectionState::Disconnected 分支添加 return Ok(true);
原理: WebRtcInner::poll_rtc() 始终返回 Ok(false),导致上层 WebRtcState::poll_rtc() 永远不触发 self.inner = None 的清理逻辑。断连后 UDP socket、Rtc 实例及 65KB 缓冲区持续占用,若客户端不再重连则永久泄漏。
审核备注: