From: Nicolas Dufresne <nicolas.dufresne@collabora.com>
To: Michael Bommarito <michael.bommarito@gmail.com>,
Hans Verkuil <hverkuil@kernel.org>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
Sakari Ailus <sakari.ailus@linux.intel.com>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Benjamin Gaignard <benjamin.gaignard@collabora.com>,
Detlev Casanova <detlev.casanova@collabora.com>,
Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>,
Yunfei Dong <yunfei.dong@mediatek.com>,
Jonas Karlman <jonas@kwiboo.se>, Heiko Stuebner <heiko@sntech.de>,
Kees Cook <kees@kernel.org>,
linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org,
linux-mediatek@lists.infradead.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 0/9] media: bound stateless HEVC/AV1 tile counts
Date: Wed, 15 Jul 2026 21:03:57 -0400 [thread overview]
Message-ID: <90c559a54b31e4cd762b7091e83eb8f83d36419e.camel@collabora.com> (raw)
In-Reply-To: <20260617021906.2746743-1-michael.bommarito@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 5368 bytes --]
Hi,
there was a problem with patchwork regarding that series. Mind trying to resent
to see if it can fix it ?
Nicolas
Le mardi 16 juin 2026 à 22:18 -0400, Michael Bommarito a écrit :
> The stateless HEVC and AV1 controls carry tile counts that several SoC
> decoder drivers consume as loop bounds and array indices when laying out
> fixed-size hardware descriptor buffers. std_validate_compound() does not
> bound them, so a crafted HEVC PPS or AV1 frame control can drive
> out-of-bounds writes and an AV1 divide-by-zero in the rkvdec, hantro,
> rockchip and mediatek decoders.
>
> 1-2 reject out-of-range HEVC and AV1 tile counts in
> std_validate_compound() (one patch per codec). For AV1 the per-
> dimension bound is V4L2_AV1_MAX_TILE_{COLS,ROWS} and the total is
> V4L2_AV1_MAX_TILE_COUNT.
> 3 add <media/v4l2-hevc.h> with bounded tile-count helpers.
> 4-5 use the helpers in rkvdec and hantro instead of open-coding the
> clamp; rkvdec also bails before indexing the hardware
> parameter-set table with an out-of-range HEVC PPS id.
> 6 guard the rockchip VPU981 AV1 divisor against tile_cols == 0 and
> keep the descriptor writes inside the AV1_MAX_TILES buffer.
> 7 reject a rockchip AV1 frame whose tile_cols * tile_rows exceeds the
> submitted tile group entry count or the AV1_MAX_TILES descriptor
> capacity, which set_tile_info() would otherwise read past or leave
> under-described while programming the larger geometry.
> 8 bound the mediatek AV1 tile-start copy.
> 9 KUnit coverage for the tile-count validation.
>
> Changes since v2:
> - Split the combined HEVC+AV1 validation into one patch per codec, each
> with a single Fixes tag (Benjamin Gaignard).
> - Move the AV1 total-tile bound into validate_av1_tile_info() using the
> uAPI V4L2_AV1_MAX_TILE_COUNT, instead of clamping tile_cols/tile_rows
> in the rockchip driver, which would have corrupted the values written
> to the hardware registers (Benjamin Gaignard's NACK on v2 4/6).
> - Add <media/v4l2-hevc.h> with shared bounded tile-count helpers so
> rkvdec and hantro no longer duplicate the clamp (Benjamin Gaignard).
> - New patch 7: reject a rockchip AV1 frame that claims more tiles than
> the submitted tile group entry array holds (set_tile_info() indexes
> it by tile_cols * tile_rows) or more than AV1_MAX_TILES (the hardware
> descriptor buffer), which would otherwise leave the hardware
> programmed for more tiles than the buffer describes. mediatek already
> guards the entry count; rockchip now guards both.
>
> checkpatch --strict: 0 errors on all nine. Patches 3 and 9 each carry one
> "added file ... does MAINTAINERS need updating?" warning for the new
> <media/v4l2-hevc.h> and the KUnit test file; both already fall under the
> existing include/media/ and drivers/media/v4l2-core/ MAINTAINERS entries,
> so no MAINTAINERS change is needed. (checkpatch's SPDX sub-check did not
> run in my environment -- spdxcheck.py needs python3-ply -- but the SPDX
> headers are present on both new files.)
>
> The tile-count validation is exercised with KUnit (patch 9): in-range
> HEVC/AV1 counts pass, out-of-range per-dimension counts and an AV1 grid
> whose product exceeds V4L2_AV1_MAX_TILE_COUNT are rejected, and the
> zero-initialised AV1 frame control that v4l2-compliance and existing
> userspace submit still passes.
>
> v2:
> https://lore.kernel.org/all/20260614155609.3107600-1-michael.bommarito@gmail.com/
>
> Michael Bommarito (9):
> media: v4l2-ctrls: validate HEVC tile counts
> media: v4l2-ctrls: validate AV1 tile counts
> media: hevc: add bounded tile-count helpers
> media: rkvdec: bound HEVC tile loops and PPS id to the array capacity
> media: verisilicon: hantro: bound G2 HEVC tile loop to the buffer
> capacity
> media: verisilicon: rockchip: guard VPU981 AV1 divisor and tile buffer
> media: verisilicon: rockchip: reject AV1 frames exceeding the tile
> capacity
> media: mediatek: vcodec: bound AV1 tile-start copy to the array
> capacity
> media: v4l2-ctrls: add KUnit tests for compound control tile
> validation
>
> .../vcodec/decoder/vdec/vdec_av1_req_lat_if.c | 5 +-
> .../rockchip/rkvdec/rkvdec-hevc-common.c | 14 +-
> .../platform/rockchip/rkvdec/rkvdec-hevc.c | 7 +-
> .../rockchip/rkvdec/rkvdec-vdpu381-hevc.c | 2 +
> .../platform/verisilicon/hantro_g2_hevc_dec.c | 6 +-
> .../verisilicon/rockchip_vpu981_hw_av1_dec.c | 57 +++++--
> drivers/media/v4l2-core/Kconfig | 12 ++
> .../media/v4l2-core/v4l2-ctrls-core-test.c | 145 ++++++++++++++++++
> drivers/media/v4l2-core/v4l2-ctrls-core.c | 36 +++++
> include/media/v4l2-hevc.h | 41 +++++
> 10 files changed, 306 insertions(+), 19 deletions(-)
> create mode 100644 drivers/media/v4l2-core/v4l2-ctrls-core-test.c
> create mode 100644 include/media/v4l2-hevc.h
>
>
> base-commit: e24a98d6884a6e4203a77a94f070a59fcab95208
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: Nicolas Dufresne <nicolas.dufresne@collabora.com>
To: Michael Bommarito <michael.bommarito@gmail.com>,
Hans Verkuil <hverkuil@kernel.org>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
Sakari Ailus <sakari.ailus@linux.intel.com>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Benjamin Gaignard <benjamin.gaignard@collabora.com>,
Detlev Casanova <detlev.casanova@collabora.com>,
Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>,
Yunfei Dong <yunfei.dong@mediatek.com>,
Jonas Karlman <jonas@kwiboo.se>, Heiko Stuebner <heiko@sntech.de>,
Kees Cook <kees@kernel.org>,
linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org,
linux-mediatek@lists.infradead.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 0/9] media: bound stateless HEVC/AV1 tile counts
Date: Wed, 15 Jul 2026 21:03:57 -0400 [thread overview]
Message-ID: <90c559a54b31e4cd762b7091e83eb8f83d36419e.camel@collabora.com> (raw)
In-Reply-To: <20260617021906.2746743-1-michael.bommarito@gmail.com>
[-- Attachment #1.1: Type: text/plain, Size: 5368 bytes --]
Hi,
there was a problem with patchwork regarding that series. Mind trying to resent
to see if it can fix it ?
Nicolas
Le mardi 16 juin 2026 à 22:18 -0400, Michael Bommarito a écrit :
> The stateless HEVC and AV1 controls carry tile counts that several SoC
> decoder drivers consume as loop bounds and array indices when laying out
> fixed-size hardware descriptor buffers. std_validate_compound() does not
> bound them, so a crafted HEVC PPS or AV1 frame control can drive
> out-of-bounds writes and an AV1 divide-by-zero in the rkvdec, hantro,
> rockchip and mediatek decoders.
>
> 1-2 reject out-of-range HEVC and AV1 tile counts in
> std_validate_compound() (one patch per codec). For AV1 the per-
> dimension bound is V4L2_AV1_MAX_TILE_{COLS,ROWS} and the total is
> V4L2_AV1_MAX_TILE_COUNT.
> 3 add <media/v4l2-hevc.h> with bounded tile-count helpers.
> 4-5 use the helpers in rkvdec and hantro instead of open-coding the
> clamp; rkvdec also bails before indexing the hardware
> parameter-set table with an out-of-range HEVC PPS id.
> 6 guard the rockchip VPU981 AV1 divisor against tile_cols == 0 and
> keep the descriptor writes inside the AV1_MAX_TILES buffer.
> 7 reject a rockchip AV1 frame whose tile_cols * tile_rows exceeds the
> submitted tile group entry count or the AV1_MAX_TILES descriptor
> capacity, which set_tile_info() would otherwise read past or leave
> under-described while programming the larger geometry.
> 8 bound the mediatek AV1 tile-start copy.
> 9 KUnit coverage for the tile-count validation.
>
> Changes since v2:
> - Split the combined HEVC+AV1 validation into one patch per codec, each
> with a single Fixes tag (Benjamin Gaignard).
> - Move the AV1 total-tile bound into validate_av1_tile_info() using the
> uAPI V4L2_AV1_MAX_TILE_COUNT, instead of clamping tile_cols/tile_rows
> in the rockchip driver, which would have corrupted the values written
> to the hardware registers (Benjamin Gaignard's NACK on v2 4/6).
> - Add <media/v4l2-hevc.h> with shared bounded tile-count helpers so
> rkvdec and hantro no longer duplicate the clamp (Benjamin Gaignard).
> - New patch 7: reject a rockchip AV1 frame that claims more tiles than
> the submitted tile group entry array holds (set_tile_info() indexes
> it by tile_cols * tile_rows) or more than AV1_MAX_TILES (the hardware
> descriptor buffer), which would otherwise leave the hardware
> programmed for more tiles than the buffer describes. mediatek already
> guards the entry count; rockchip now guards both.
>
> checkpatch --strict: 0 errors on all nine. Patches 3 and 9 each carry one
> "added file ... does MAINTAINERS need updating?" warning for the new
> <media/v4l2-hevc.h> and the KUnit test file; both already fall under the
> existing include/media/ and drivers/media/v4l2-core/ MAINTAINERS entries,
> so no MAINTAINERS change is needed. (checkpatch's SPDX sub-check did not
> run in my environment -- spdxcheck.py needs python3-ply -- but the SPDX
> headers are present on both new files.)
>
> The tile-count validation is exercised with KUnit (patch 9): in-range
> HEVC/AV1 counts pass, out-of-range per-dimension counts and an AV1 grid
> whose product exceeds V4L2_AV1_MAX_TILE_COUNT are rejected, and the
> zero-initialised AV1 frame control that v4l2-compliance and existing
> userspace submit still passes.
>
> v2:
> https://lore.kernel.org/all/20260614155609.3107600-1-michael.bommarito@gmail.com/
>
> Michael Bommarito (9):
> media: v4l2-ctrls: validate HEVC tile counts
> media: v4l2-ctrls: validate AV1 tile counts
> media: hevc: add bounded tile-count helpers
> media: rkvdec: bound HEVC tile loops and PPS id to the array capacity
> media: verisilicon: hantro: bound G2 HEVC tile loop to the buffer
> capacity
> media: verisilicon: rockchip: guard VPU981 AV1 divisor and tile buffer
> media: verisilicon: rockchip: reject AV1 frames exceeding the tile
> capacity
> media: mediatek: vcodec: bound AV1 tile-start copy to the array
> capacity
> media: v4l2-ctrls: add KUnit tests for compound control tile
> validation
>
> .../vcodec/decoder/vdec/vdec_av1_req_lat_if.c | 5 +-
> .../rockchip/rkvdec/rkvdec-hevc-common.c | 14 +-
> .../platform/rockchip/rkvdec/rkvdec-hevc.c | 7 +-
> .../rockchip/rkvdec/rkvdec-vdpu381-hevc.c | 2 +
> .../platform/verisilicon/hantro_g2_hevc_dec.c | 6 +-
> .../verisilicon/rockchip_vpu981_hw_av1_dec.c | 57 +++++--
> drivers/media/v4l2-core/Kconfig | 12 ++
> .../media/v4l2-core/v4l2-ctrls-core-test.c | 145 ++++++++++++++++++
> drivers/media/v4l2-core/v4l2-ctrls-core.c | 36 +++++
> include/media/v4l2-hevc.h | 41 +++++
> 10 files changed, 306 insertions(+), 19 deletions(-)
> create mode 100644 drivers/media/v4l2-core/v4l2-ctrls-core-test.c
> create mode 100644 include/media/v4l2-hevc.h
>
>
> base-commit: e24a98d6884a6e4203a77a94f070a59fcab95208
[-- Attachment #1.2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
[-- Attachment #2: Type: text/plain, Size: 170 bytes --]
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
next prev parent reply other threads:[~2026-07-16 1:04 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-17 2:18 [PATCH v3 0/9] media: bound stateless HEVC/AV1 tile counts Michael Bommarito
2026-06-17 2:18 ` Michael Bommarito
2026-06-17 2:18 ` [PATCH v3 1/9] media: v4l2-ctrls: validate HEVC " Michael Bommarito
2026-06-17 2:18 ` Michael Bommarito
2026-09-03 6:50 ` Benjamin Gaignard
2026-09-03 6:50 ` Benjamin Gaignard
2026-06-17 2:18 ` [PATCH v3 2/9] media: v4l2-ctrls: validate AV1 " Michael Bommarito
2026-06-17 2:18 ` Michael Bommarito
2026-09-03 6:50 ` Benjamin Gaignard
2026-09-03 6:50 ` Benjamin Gaignard
2026-06-17 2:19 ` [PATCH v3 3/9] media: hevc: add bounded tile-count helpers Michael Bommarito
2026-06-17 2:19 ` Michael Bommarito
2026-09-03 6:51 ` Benjamin Gaignard
2026-09-03 6:51 ` Benjamin Gaignard
2026-06-17 2:19 ` [PATCH v3 4/9] media: rkvdec: bound HEVC tile loops and PPS id to the array capacity Michael Bommarito
2026-06-17 2:19 ` Michael Bommarito
2026-06-17 2:19 ` [PATCH v3 5/9] media: verisilicon: hantro: bound G2 HEVC tile loop to the buffer capacity Michael Bommarito
2026-06-17 2:19 ` Michael Bommarito
2026-09-03 6:51 ` Benjamin Gaignard
2026-09-03 6:51 ` Benjamin Gaignard
2026-06-17 2:19 ` [PATCH v3 6/9] media: verisilicon: rockchip: guard VPU981 AV1 divisor and tile buffer Michael Bommarito
2026-06-17 2:19 ` Michael Bommarito
2026-09-03 6:52 ` Benjamin Gaignard
2026-09-03 6:52 ` Benjamin Gaignard
2026-06-17 2:19 ` [PATCH v3 7/9] media: verisilicon: rockchip: reject AV1 frames exceeding the tile capacity Michael Bommarito
2026-06-17 2:19 ` Michael Bommarito
2026-09-03 6:53 ` Benjamin Gaignard
2026-09-03 6:53 ` Benjamin Gaignard
2026-06-17 2:19 ` [PATCH v3 8/9] media: mediatek: vcodec: bound AV1 tile-start copy to the array capacity Michael Bommarito
2026-06-17 2:19 ` Michael Bommarito
2026-06-17 2:19 ` [PATCH v3 9/9] media: v4l2-ctrls: add KUnit tests for compound control tile validation Michael Bommarito
2026-06-17 2:19 ` Michael Bommarito
2026-07-16 1:03 ` Nicolas Dufresne [this message]
2026-07-16 1:03 ` [PATCH v3 0/9] media: bound stateless HEVC/AV1 tile counts Nicolas Dufresne
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=90c559a54b31e4cd762b7091e83eb8f83d36419e.camel@collabora.com \
--to=nicolas.dufresne@collabora.com \
--cc=benjamin.gaignard@collabora.com \
--cc=detlev.casanova@collabora.com \
--cc=ezequiel@vanguardiasur.com.ar \
--cc=heiko@sntech.de \
--cc=hverkuil@kernel.org \
--cc=jonas@kwiboo.se \
--cc=kees@kernel.org \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=linux-rockchip@lists.infradead.org \
--cc=mchehab@kernel.org \
--cc=michael.bommarito@gmail.com \
--cc=sakari.ailus@linux.intel.com \
--cc=yunfei.dong@mediatek.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.