daemon: bounds-check pack_* functions against CAPTURE plane size #21
Reference in New Issue
Block a user
Delete Branch "noether/daemon-pack-bounds-check"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Fixes the daemon SEGV that fires when libavcodec decodes a frame larger than the V4L2 client's currently-mapped CAPTURE dmabuf.
Crash scenario
YouTube DASH stepping resolution mid-stream (e.g. 480p → 720p when bandwidth improves). libva is supposed to handle
V4L2_EVENT_SOURCE_CHANGEwithSTREAMOFF/S_FMT/REQBUFS, but in practice a stale CAPTURE request with the old buffer size sometimes slips through carrying the new (larger) frame. The chroma-interleave inner loop walks past the mapping boundary and the daemon takes SIGSEGV mid-frame.Follow-on damage: the daemon crash leaves V4L2 clients hanging in
vb2_core_dqbuf(D-state — separate follow-up task #146).Fix
All three pack functions get a bounds-check on entry:
pack_nv12_single_to_plane(V4L2_PIX_FMT_NV12, contiguous Y+UV)pack_nv12_to_planes(V4L2_PIX_FMT_NV12M, separate Y and UV planes)pack_p010_to_plane(V4L2_PIX_FMT_P010, 10-bit HDR)Each computes
required = y_size + uv_sizefrom the frame dimensions and compares toplanes->size[N]before any write. On mismatch:log_warnwith both sizes and frame dimensions-EOVERFLOWError contract
The caller (
process_decode_requestloop) already handles negative pack returns:The kernel still gets the response with metadata only; the V4L2 client sees a frame whose pixels are stale but whose buffer-done event fires normally. The next
SOURCE_CHANGEthe client processes resyncs the buffer size — graceful degradation instead of a hard crash that locks every consumer of/dev/video0.The canonical comment lives on
pack_nv12_single_to_plane; the other two reference it.Verification
decoder.ccompiles clean against trixie aarch64 + daedalus-fourier installed prefix (hertz local build).Closes task #145 (daemon SEGV in pack_nv12_single on resolution change). Follow-up #146 (D-state on /dev/video0 release) likely still needs a separate kernel-side fix, but with this change the SEGV that triggers it should be gone.