From: Kees Cook <kees@kernel.org>
To: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Cc: Vlastimil Babka <vbabka@suse.cz>, Miguel Ojeda <ojeda@kernel.org>,
"Gustavo A. R. Silva" <gustavoars@kernel.org>,
Nathan Chancellor <nathan@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Nick Desaulniers <nick.desaulniers+lkml@gmail.com>,
Marco Elver <elver@google.com>,
linux-hardening@vger.kernel.org, Christoph Lameter <cl@linux.com>,
Pekka Enberg <penberg@kernel.org>,
David Rientjes <rientjes@google.com>,
Joonsoo Kim <iamjoonsoo.kim@lge.com>,
Andrew Morton <akpm@linux-foundation.org>,
Roman Gushchin <roman.gushchin@linux.dev>,
Hyeonggon Yoo <42.hyeyoo@gmail.com>,
Bill Wendling <morbo@google.com>,
Justin Stitt <justinstitt@google.com>,
Jann Horn <jannh@google.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Sasha Levin <sashal@kernel.org>, Jonathan Corbet <corbet@lwn.net>,
Jakub Kicinski <kuba@kernel.org>,
Yafang Shao <laoar.shao@gmail.com>,
Tony Ambardar <tony.ambardar@gmail.com>,
Alexander Lobakin <aleksander.lobakin@intel.com>,
Jan Hendrik Farr <kernel@jfarr.cc>,
Alexander Potapenko <glider@google.com>,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
linux-doc@vger.kernel.org, llvm@lists.linux.dev
Subject: Re: [PATCH v4 1/2] compiler_types: Introduce __flex_counter() and family
Date: Mon, 17 Mar 2025 09:22:46 -0700 [thread overview]
Message-ID: <202503170918.A53A0F2@keescook> (raw)
In-Reply-To: <44a00ad4-b05d-4fb8-87f2-fccbaa068872@intel.com>
On Mon, Mar 17, 2025 at 10:43:38AM +0100, Przemek Kitszel wrote:
> On 3/17/25 10:26, Przemek Kitszel wrote:
> > On 3/15/25 04:15, Kees Cook wrote:
> > > Introduce __flex_counter() which wraps __builtin_counted_by_ref(),
> > > as newly introduced by GCC[1] and Clang[2]. Use of __flex_counter()
> > > allows access to the counter member of a struct's flexible array member
> > > when it has been annotated with __counted_by().
> > >
> > > Introduce typeof_flex_counter(), can_set_flex_counter(), and
> > > set_flex_counter() to provide the needed _Generic() wrappers to get sane
> > > results out of __flex_counter().
> > >
> > > For example, with:
> > >
> > > struct foo {
> > > int counter;
> > > short array[] __counted_by(counter);
> > > } *p;
> > >
> > > __flex_counter(p->array) will resolve to: &p->counter
> > >
> > > typeof_flex_counter(p->array) will resolve to "int". (If p->array was not
> > > annotated, it would resolve to "size_t".)
> > >
> > > can_set_flex_counter(p->array, COUNT) is the same as:
> > >
> > > COUNT <= type_max(p->counter) && COUNT >= type_min(p->counter)
> > >
> > > (If p->array was not annotated it would return true since everything
> > > fits in size_t.)
> > >
> > > set_flex_counter(p->array, COUNT) is the same as:
> > >
> > > p->counter = COUNT;
> > >
> > > (It is a no-op if p->array is not annotated with __counted_by().)
> > >
> > > Signed-off-by: Kees Cook <kees@kernel.org>
> >
> > I agree that there is no suitable fallback handy, but I see counter
> > as integral part of the struct (in contrast to being merely annotation),
> > IOW, without set_flex_counter() doing the assignment, someone will
> > reference it later anyway, without any warning when kzalloc()'d
> >
> > So, maybe BUILD_BUG() instead of no-op?
>
> I get that so far this is only used as an internal helper (in the next
> patch), so for me it would be also fine to just add __ prefix:
> __set_flex_counter(), at least until the following is true:
> "manual initialization of the flexible array counter is still
> required (at some point) after allocation as not all compiler versions
> support the __counted_by annotation yet"
Yeah, that's fair. I will rename set_... and can_set_...
Thought FWIW I'm not sure we'll ever want a BUILD_BUG_ON() just because
there will be flex arrays with future annotations that can't have their
counter set (e.g. annotations that indicate globals, expressions, etc --
support for these cases is coming, if slowly[1]).
-Kees
[1] loooong thread https://gcc.gnu.org/pipermail/gcc-patches/2025-March/677024.html
--
Kees Cook
next prev parent reply other threads:[~2025-03-17 16:22 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-15 3:15 [PATCH v4 0/2] slab: Introduce kmalloc_obj() and family Kees Cook
2025-03-15 3:15 ` [PATCH v4 1/2] compiler_types: Introduce __flex_counter() " Kees Cook
2025-03-15 4:53 ` Randy Dunlap
2025-03-15 18:34 ` Kees Cook
2025-03-15 19:47 ` Miguel Ojeda
2025-03-15 21:06 ` Kees Cook
2025-03-17 9:26 ` Przemek Kitszel
2025-03-17 9:43 ` Przemek Kitszel
2025-03-17 16:22 ` Kees Cook [this message]
2025-03-15 3:15 ` [PATCH v4 2/2] slab: Introduce kmalloc_obj() " Kees Cook
2025-03-15 5:18 ` Gustavo A. R. Silva
2025-03-15 18:02 ` Randy Dunlap
2025-03-15 18:39 ` Kees Cook
2025-03-15 18:31 ` Linus Torvalds
2025-03-15 18:56 ` Kees Cook
2025-03-15 19:06 ` Linus Torvalds
2025-10-07 2:07 ` Matthew Wilcox
2025-10-07 17:17 ` Kees Cook
2025-10-07 17:47 ` Christoph Lameter (Ampere)
2025-10-07 18:18 ` Marco Elver
2025-10-08 4:20 ` Kees Cook
2025-10-08 7:49 ` Vegard Nossum
2025-10-09 12:07 ` Marco Elver
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=202503170918.A53A0F2@keescook \
--to=kees@kernel.org \
--cc=42.hyeyoo@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=aleksander.lobakin@intel.com \
--cc=cl@linux.com \
--cc=corbet@lwn.net \
--cc=elver@google.com \
--cc=glider@google.com \
--cc=gregkh@linuxfoundation.org \
--cc=gustavoars@kernel.org \
--cc=iamjoonsoo.kim@lge.com \
--cc=jannh@google.com \
--cc=justinstitt@google.com \
--cc=kernel@jfarr.cc \
--cc=kuba@kernel.org \
--cc=laoar.shao@gmail.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-hardening@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=llvm@lists.linux.dev \
--cc=morbo@google.com \
--cc=nathan@kernel.org \
--cc=nick.desaulniers+lkml@gmail.com \
--cc=ojeda@kernel.org \
--cc=penberg@kernel.org \
--cc=peterz@infradead.org \
--cc=przemyslaw.kitszel@intel.com \
--cc=rientjes@google.com \
--cc=roman.gushchin@linux.dev \
--cc=sashal@kernel.org \
--cc=tony.ambardar@gmail.com \
--cc=torvalds@linux-foundation.org \
--cc=vbabka@suse.cz \
/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.