From: Kees Cook <kees@kernel.org>
To: Rosen Penev <rosenp@gmail.com>
Cc: linux-media@vger.kernel.org,
Mauro Carvalho Chehab <mchehab@kernel.org>,
"Gustavo A. R. Silva" <gustavoars@kernel.org>,
open list <linux-kernel@vger.kernel.org>,
"open list:KERNEL HARDENING (not covered by other
areas):Keyword:b__counted_by(_le|_be)?b"
<linux-hardening@vger.kernel.org>
Subject: Re: [PATCH] media: em28xx: kzalloc + kcalloc to kzalloc_flex
Date: Fri, 20 Mar 2026 11:42:16 -0700 [thread overview]
Message-ID: <202603201138.FAEE6A52B@keescook> (raw)
In-Reply-To: <20260320010212.31425-1-rosenp@gmail.com>
On Thu, Mar 19, 2026 at 06:02:12PM -0700, Rosen Penev wrote:
> There's no need to allocate these separately.
>
> Add __counted_by for extra runtime analysis. Moved counting variable
> allocation to right after allocation as required by __counted_by.
>
> Signed-off-by: Rosen Penev <rosenp@gmail.com>
This looks reasonable to me.
One thought I've had while reviewing your flex-array patches is that I
want to make sure you're doing your test builds with
KCFLAGS=-Wflexible-array-member-not-at-end
so that you can validate there's no new uses of the target structures
being composed within other structures while making these changes.
That looks clear here, but I think going forward, it would be worth
mentioning it as part of the commit log. Something like:
This structure is not composed within other structures, confirmed with
builds using -Wflexible-array-member-not-at-end.
or similar.
Reviewed-by: Kees Cook <kees@kernel.org>
-Kees
> ---
> drivers/media/usb/em28xx/em28xx-cards.c | 18 ++----------------
> drivers/media/usb/em28xx/em28xx.h | 3 ++-
> 2 files changed, 4 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/media/usb/em28xx/em28xx-cards.c b/drivers/media/usb/em28xx/em28xx-cards.c
> index d7075ebabceb..c278e48b3428 100644
> --- a/drivers/media/usb/em28xx/em28xx-cards.c
> +++ b/drivers/media/usb/em28xx/em28xx-cards.c
> @@ -3567,9 +3567,6 @@ void em28xx_free_device(struct kref *ref)
> if (!dev->disconnected)
> em28xx_release_resources(dev);
>
> - if (dev->ts == PRIMARY_TS)
> - kfree(dev->alt_max_pkt_size_isoc);
> -
> kfree(dev);
> }
> EXPORT_SYMBOL_GPL(em28xx_free_device);
> @@ -3912,21 +3909,13 @@ static int em28xx_usb_probe(struct usb_interface *intf,
> }
>
> /* allocate memory for our device state and initialize it */
> - dev = kzalloc_obj(*dev);
> + dev = kzalloc_flex(*dev, alt_max_pkt_size_isoc, intf->num_altsetting);
> if (!dev) {
> retval = -ENOMEM;
> goto err;
> }
>
> - /* compute alternate max packet sizes */
> - dev->alt_max_pkt_size_isoc = kcalloc(intf->num_altsetting,
> - sizeof(dev->alt_max_pkt_size_isoc[0]),
> - GFP_KERNEL);
> - if (!dev->alt_max_pkt_size_isoc) {
> - kfree(dev);
> - retval = -ENOMEM;
> - goto err;
> - }
> + dev->num_alt = intf->num_altsetting;
>
> /* Get endpoints */
> for (i = 0; i < intf->num_altsetting; i++) {
> @@ -4028,8 +4017,6 @@ static int em28xx_usb_probe(struct usb_interface *intf,
> dev->dvb_ep_bulk ? " bulk" : "",
> dev->dvb_ep_isoc ? " isoc" : "");
>
> - dev->num_alt = intf->num_altsetting;
> -
> if ((unsigned int)card[nr] < em28xx_bcount)
> dev->model = card[nr];
>
> @@ -4163,7 +4150,6 @@ static int em28xx_usb_probe(struct usb_interface *intf,
> return 0;
>
> err_free:
> - kfree(dev->alt_max_pkt_size_isoc);
> kfree(dev);
>
> err:
> diff --git a/drivers/media/usb/em28xx/em28xx.h b/drivers/media/usb/em28xx/em28xx.h
> index f3449c240d21..1c2f92927889 100644
> --- a/drivers/media/usb/em28xx/em28xx.h
> +++ b/drivers/media/usb/em28xx/em28xx.h
> @@ -730,7 +730,6 @@ struct em28xx {
> int packet_multiplier; // multiplier for wMaxPacketSize, used for
> // URB buffer size definition
> int num_alt; // number of alternative settings
> - unsigned int *alt_max_pkt_size_isoc; // array of isoc wMaxPacketSize
> unsigned int analog_xfer_bulk:1; // use bulk instead of isoc
> // transfers for analog
> int dvb_alt_isoc; // alternate setting for DVB isoc transfers
> @@ -772,6 +771,8 @@ struct em28xx {
>
> struct em28xx *dev_next;
> int ts;
> +
> + unsigned int alt_max_pkt_size_isoc[] __counted_by(num_alt); // array of isoc wMaxPacketSize
> };
>
> #define kref_to_dev(d) container_of(d, struct em28xx, ref)
> --
> 2.53.0
>
>
--
Kees Cook
next prev parent reply other threads:[~2026-03-20 18:42 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-20 1:02 [PATCH] media: em28xx: kzalloc + kcalloc to kzalloc_flex Rosen Penev
2026-03-20 18:42 ` Kees Cook [this message]
2026-03-20 23:04 ` Rosen Penev
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=202603201138.FAEE6A52B@keescook \
--to=kees@kernel.org \
--cc=gustavoars@kernel.org \
--cc=linux-hardening@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=rosenp@gmail.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.