Some(FrameOutput::Channel(reftx))=>{// SAFETY: avcodec_receive_packet just succeeded (ret >= 0),
// guaranteeing that pkt.data and pkt.size are valid.
letdata: &[u8]=unsafe{std::slice::from_raw_parts((*pkt.as_mut_ptr()).data,(*pkt.as_mut_ptr()).sizeasusize,)};// ... 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 ...
}
```
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
位置
src/avhw.rs:868-876严重性
🟢 低
问题描述
ffmpeg-next8.x 的ff::Packet类型可能提供了安全的data()方法(返回Option<&[u8]>),应优先使用安全 API 来消除unsafe块。当前直接通过from_raw_parts读取(*pkt.as_mut_ptr()).data和.size虽然功能正确(avcodec_receive_packet刚成功返回),但缺少 SAFETY 注释,不符合最小化 unsafe 代码的原则。建议修复
添加 SAFETY 注释,后续考虑迁移到安全 API:
修复方案
提交:
fd170b6问题:
drain_encoder中std::slice::from_raw_parts缺少 SAFETY 注释,且存在两个潜在 soundness 风险:pkt.size为负数时as usize会包装成巨大值pkt.data为 null 时from_raw_parts(null, 0)是 UB修复:
size > 0 && !data.is_null()运行时守卫未改动:
let _ = tx.send(...)的错误静默问题由 #6 单独追踪。