Bug: poll_rtc 始终返回 Ok(false),断连后资源永久泄漏 (webrtc.rs) #10

Closed
opened 2026-06-04 20:59:25 +08:00 by dailz · 1 comment
Owner

位置

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 到达时被替换。若客户端不再重连,这些资源将永久泄漏。

建议修复

DisconnectedFailed 事件分支中返回 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);  // 触发清理
}
## 位置 `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`: ```rust 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); // 触发清理 } ```
Author
Owner

修复信息

提交: 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 缓冲区持续占用,若客户端不再重连则永久泄漏。

审核备注:

  • 当前依赖 str0m 0.20 的 IceConnectionState 枚举中 Failed 变体不存在(已注释),故仅对 Disconnected 分支做修复
  • self.connected = false 保留,确保对象内部状态一致
  • write_h264_frame 中 poll_rtc() 返回值被丢弃,清理延迟到下一次 poll_and_feed(),当前调用链逻辑自洽
## 修复信息 **提交**: 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 缓冲区持续占用,若客户端不再重连则永久泄漏。 **审核备注**: - 当前依赖 str0m 0.20 的 IceConnectionState 枚举中 Failed 变体不存在(已注释),故仅对 Disconnected 分支做修复 - self.connected = false 保留,确保对象内部状态一致 - write_h264_frame 中 poll_rtc() 返回值被丢弃,清理延迟到下一次 poll_and_feed(),当前调用链逻辑自洽
dailz closed this issue 2026-06-06 20:58:16 +08:00
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dailz/wl-webrtc#10