address review: checked size arithmetic in the encoder's short-plane guard

This commit is contained in:
Dylan M. Taylor
2026-11-04 04:40:58 +00:00
parent dce47d3f6e
commit 9221d78e85
+7 -3
View File
@@ -236,9 +236,13 @@ impl Vp9Encoder {
/// samples that are not there.
pub fn encode_frame(&mut self, y: &[u8], u: &[u8], v: &[u8], force_key: bool) -> EncodedFrame {
let (w, h) = (self.cfg.width.max(1) as usize, self.cfg.height.max(1) as usize);
let chroma = w.div_ceil(2) * h.div_ceil(2);
if y.len() < w * h || u.len() < chroma || v.len() < chroma {
return EncodedFrame { data: vec![], key: false, q_idx: 0, filter_level: 0 };
let empty = || EncodedFrame { data: vec![], key: false, q_idx: 0, filter_level: 0 };
// Checked: on 32-bit targets (wasm32) a huge size would wrap to a small one.
let (Some(luma), Some(chroma)) = (w.checked_mul(h), w.div_ceil(2).checked_mul(h.div_ceil(2))) else {
return empty();
};
if y.len() < luma || u.len() < chroma || v.len() < chroma {
return empty();
}
let key = self.is_key_due(force_key);
let qidx = self.pick_qidx(key);