All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kees Cook <kees@kernel.org>
To: Jesse Taube <jtaubepe@redhat.com>
Cc: linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org,
	"Gustavo A. R. Silva" <gustavoars@kernel.org>,
	Przemek Kitszel <przemyslaw.kitszel@intel.com>,
	Christoph Hellwig <hch@infradead.org>,
	John Meneghini <jmeneghi@redhat.com>,
	Chris Leech <cleech@redhat.com>,
	Jesse Taube <mr.bossman075@gmail.com>
Subject: Re: [RFC PATCH] overflow: Add DECLARE_SIZED_FLEX() helper family
Date: Wed, 15 Jul 2026 09:12:18 -0700	[thread overview]
Message-ID: <202607150906.33F01B40@keescook> (raw)
In-Reply-To: <20260714151818.538869-1-jtaubepe@redhat.com>

On Tue, Jul 14, 2026 at 11:18:18AM -0400, Jesse Taube wrote:
> Add new DECLARE_SIZED_FLEX() helper to set the default size of a
> flexible-array member. The code is identical to the declaration in
> __DEFINE_FLEX() which has also been changed to use DECLARE_SIZED_FLEX().
> 
> Add DECLARE_COUNTED_FLEX_ARRAY() helper which is a variant of
> DECLARE_FLEX_ARRAY() with a counted-by attribute.
> 
> Also add default sized variants of
> DECLARE_FLEX_ARRAY(), DECLARE_SIZED_FLEX(), and
> DECLARE_COUNTED_FLEX_ARRAY(), DECLARE_COUNTED_SIZED_FLEX().

Where do you want to use these new helpers?

> Signed-off-by: Jesse Taube <jtaubepe@redhat.com>
> ---
>  include/linux/overflow.h | 58 +++++++++++++++++++++++++++++++++++++---
>  1 file changed, 54 insertions(+), 4 deletions(-)
> 
> diff --git a/include/linux/overflow.h b/include/linux/overflow.h
> index a8cb6319b4fb..a3384cae49e5 100644
> --- a/include/linux/overflow.h
> +++ b/include/linux/overflow.h
> @@ -464,6 +464,59 @@ static __always_inline size_t __must_check size_sub(size_t minuend, size_t subtr
>   */
>  #define struct_offset(p, member) (offsetof(typeof(*(p)), member))
>  
> +/**
> + * __DECLARE_SIZED_FLEX() - helper macro for DECLARE_SIZED_FLEX() family.
> + * Allows for easily declaring a structure with a trailing flexible array member
> + * to have a specific size.
> + *
> + * @obj: object to be given a specific size
> + * @name: Name of the array member.
> + * @count: Number of elements in the array; must be compile-time const.
> + */
> +#define __DECLARE_SIZED_FLEX(obj, name, count)	\
> +	_Static_assert(__builtin_constant_p(count),		\
> +		       "default sized flex array members require compile-time const count");	\
> +	union {							\
> +		u8 bytes[struct_size_t(obj, name, count)];	\
> +		obj;						\
> +	}
> +
> +/**
> + * DECLARE_COUNTED_FLEX_ARRAY() - Declare a counted flexible array
> + *
> + * @type: Type name.
> + * @name: Name of the array member.
> + * @counter: Name of the __counted_by member.
> + */
> +#define DECLARE_COUNTED_FLEX_ARRAY(type, name, counter)\
> +	struct { \
> +		size_t counter; \
> +		type name[] __counted_by(counter); \
> +	}
> +
> +/**
> + * DECLARE_SIZED_FLEX() - Declare a structure with a trailing flexible array
> + * member with a default size.
> + *
> + * @type: Type name.
> + * @name: Name of the array member.
> + * @count: Number of elements in the array; must be compile-time const.
> + */
> +#define DECLARE_SIZED_FLEX(type, name, count)	\
> +	__DECLARE_SIZED_FLEX(type name[], name, count)
> +
> +/**
> + * DECLARE_COUNTED_SIZED_FLEX() - Declare a structure with a trailing flexible
> + * array member counted by count, with a default size.
> + *
> + * @type: Type name.
> + * @name: Name of the array member.
> + * @counter: Name of the __counted_by member.
> + * @count: Number of elements in the array; must be compile-time const.
> + */
> +#define DECLARE_COUNTED_SIZED_FLEX(type, name, counter, count)	\
> +	__DECLARE_SIZED_FLEX(DECLARE_COUNTED_FLEX_ARRAY(type, name, counter), name, count)

I ask about where these will be used because one of the things I want to
keep tied together is the "counter" and "count", which usually means the
declaration should be combined with an initializer in some way so that
the counter gets assigned, as DEFINE_FLEX() ultimately does.

I'm worried that extracting the internal construction of __DEFINE_FLEX
means we may run the risk of increasing the risk of losing that tie.

So, I'd love to understand how you want to use this, as that would help
my understanding and potentially shape the design so we can keep counter
and count strongly associated.

> +
>  /**
>   * __DEFINE_FLEX() - helper macro for DEFINE_FLEX() family.
>   * Enables caller macro to pass arbitrary trailing expressions
> @@ -477,10 +530,7 @@ static __always_inline size_t __must_check size_sub(size_t minuend, size_t subtr
>  #define __DEFINE_FLEX(type, name, member, count, trailer...)			\
>  	_Static_assert(__builtin_constant_p(count),				\
>  		       "onstack flex array members require compile-time const count"); \
> -	union {									\
> -		u8 bytes[struct_size_t(type, member, count)];			\
> -		type obj;							\
> -	} name##_u trailer;							\
> +	__DECLARE_SIZED_FLEX(type obj, member, count) name##_u trailer;		\
>  	type *name = (type *)&name##_u

-Kees

-- 
Kees Cook

      reply	other threads:[~2026-07-15 16:12 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-14 15:18 [RFC PATCH] overflow: Add DECLARE_SIZED_FLEX() helper family Jesse Taube
2026-07-15 16:12 ` Kees Cook [this message]

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=202607150906.33F01B40@keescook \
    --to=kees@kernel.org \
    --cc=cleech@redhat.com \
    --cc=gustavoars@kernel.org \
    --cc=hch@infradead.org \
    --cc=jmeneghi@redhat.com \
    --cc=jtaubepe@redhat.com \
    --cc=linux-hardening@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mr.bossman075@gmail.com \
    --cc=przemyslaw.kitszel@intel.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.