-
Notifications
You must be signed in to change notification settings - Fork 248
Description
Hardware: RK3588
Kernel: rockchip-linux/kernel 5.10.160 (also seen on 6.1/6.6 lines)
GStreamer: 1.18.5
Related kernel issue (driver side): rockchip-linux/kernel#362
Summary
During H.264/H.265 playback a reproducible kernel crash is triggered in the RKVDEC path
(mpp_dma_release → mpp_task_finalize → rkvdec*_free_task). The stream contains PPS with scaling-list fields that appear out-of-range / malformed.
Note: The analysis below reflects our idea/hypothesis; please verify feasibility and correctness on the MPP side.
Suspected userspace (MPP) problems
-
Decoder parser does not fully validate PPS/SPS scaling-list lengths/offsets before
building buffers/offsets that are later mapped into the kernel. This can allow out-of-bounds
reads/writes when the driver copies PPS data (see kernel issue above for details). -
Task lifecycle robustness: on error paths, MPP may submit or finalize a "partially initialized"
task (e.g., dma/cmd buffers not fully prepared), which then causes invalid resource releases
in the driver.
Why MPP is likely involved
- MPP parses parameter sets and forms the PPS/SPS structures and offsets consumed by the kernel.
If malformed fields are not clamped/validated in userspace, the kernel can still be crashed even if it adds checks. - MPP release notes show nearby fixes (e.g.,
h264e_pps: add pic_scaling_matrix_present check
,
h2645d_sei: fix read byte overflow error
), suggesting similar bounds checks may be needed on the decoder PPS/ScalingList path.
Minimal reproducer
GStreamer:
H.265:
gst-launch-1.0 -v rtspsrc location="" protocols=tcp latency=200 !
rtph265depay ! h265parse ! mppvideodec ! fakesink sync=false
H.264:
gst-launch-1.0 -v rtspsrc location="" protocols=tcp latency=200 !
rtph264depay ! h264parse ! mppvideodec ! fakesink sync=false
Observed behavior
- Kernel Oops in mutex_lock → mpp_dma_release → mpp_task_finalize → rkvdec*_free_task.
- Occurs shortly after PPS is parsed / task prepared.
What would help to fix in MPP
- Add strict validation for PPS/SPS scaling-list presence, lengths, and derived offsets in
h264d/h265d parser code before any buffer/offset is exposed to the kernel. - Guard task finalize paths to tolerate partially constructed tasks (no unconditional finalize).
- Optionally add a contract check to refuse tasks that would map pointers beyond PPS buffers
(defensive programming on the userspace side, mirroring kernel checks).
This reflects our current hypothesis; please verify feasibility and correctness on the MPP side. Thank you.