unsafe: drain_encoder 中使用 from_raw_parts 应添加 SAFETY 注释 (avhw.rs) #5

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

位置

src/avhw.rs:868-876

严重性

🟢

问题描述

ffmpeg-next 8.x 的 ff::Packet 类型可能提供了安全的 data() 方法(返回 Option<&[u8]>),应优先使用安全 API 来消除 unsafe 块。当前直接通过 from_raw_parts 读取 (*pkt.as_mut_ptr()).data.size 虽然功能正确(avcodec_receive_packet 刚成功返回),但缺少 SAFETY 注释,不符合最小化 unsafe 代码的原则。

建议修复

添加 SAFETY 注释,后续考虑迁移到安全 API:

Some(FrameOutput::Channel(ref tx)) => {
    // SAFETY: avcodec_receive_packet just succeeded (ret >= 0),
    // guaranteeing that pkt.data and pkt.size are valid.
    let data: &[u8] = unsafe {
        std::slice::from_raw_parts(
            (*pkt.as_mut_ptr()).data,
            (*pkt.as_mut_ptr()).size as usize,
        )
    };
    // ... send data ...
}
## 位置 `src/avhw.rs:868-876` ## 严重性 🟢 低 ## 问题描述 `ffmpeg-next` 8.x 的 `ff::Packet` 类型可能提供了安全的 `data()` 方法(返回 `Option<&[u8]>`),应优先使用安全 API 来消除 `unsafe` 块。当前直接通过 `from_raw_parts` 读取 `(*pkt.as_mut_ptr()).data` 和 `.size` 虽然功能正确(`avcodec_receive_packet` 刚成功返回),但缺少 SAFETY 注释,不符合最小化 unsafe 代码的原则。 ## 建议修复 添加 SAFETY 注释,后续考虑迁移到安全 API: ```rust Some(FrameOutput::Channel(ref tx)) => { // SAFETY: avcodec_receive_packet just succeeded (ret >= 0), // guaranteeing that pkt.data and pkt.size are valid. let data: &[u8] = unsafe { std::slice::from_raw_parts( (*pkt.as_mut_ptr()).data, (*pkt.as_mut_ptr()).size as usize, ) }; // ... send data ... } ```
Author
Owner

修复方案

提交: fd170b6

问题: drain_encoderstd::slice::from_raw_parts 缺少 SAFETY 注释,且存在两个潜在 soundness 风险:

  1. pkt.size 为负数时 as usize 会包装成巨大值
  2. pkt.data 为 null 时 from_raw_parts(null, 0) 是 UB

修复:

  • 读入 AVPacket 字段到局部变量,避免重复解引用
  • 添加 size > 0 && !data.is_null() 运行时守卫
  • 补充 SAFETY 注释,与代码库已有 30+ 处风格一致

未改动: let _ = tx.send(...) 的错误静默问题由 #6 单独追踪。

## 修复方案 **提交**: `fd170b6` **问题**: `drain_encoder` 中 `std::slice::from_raw_parts` 缺少 SAFETY 注释,且存在两个潜在 soundness 风险: 1. `pkt.size` 为负数时 `as usize` 会包装成巨大值 2. `pkt.data` 为 null 时 `from_raw_parts(null, 0)` 是 UB **修复**: - 读入 AVPacket 字段到局部变量,避免重复解引用 - 添加 `size > 0 && !data.is_null()` 运行时守卫 - 补充 SAFETY 注释,与代码库已有 30+ 处风格一致 **未改动**: `let _ = tx.send(...)` 的错误静默问题由 #6 单独追踪。
dailz closed this issue 2026-06-06 11:58:29 +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#5