From: Kees Cook <kees@kernel.org>
To: Suren Baghdasaryan <surenb@google.com>
Cc: akpm@linux-foundation.org, kent.overstreet@linux.dev,
nathan@kernel.org, ndesaulniers@google.com, morbo@google.com,
justinstitt@google.com, linux-mm@kvack.org,
linux-kernel@vger.kernel.org, llvm@lists.linux.dev,
kernel test robot <lkp@intel.com>
Subject: Re: [PATCH 1/1] alloc_tag: work around clang-14 issue with __builtin_object_size()
Date: Wed, 5 Feb 2025 11:18:35 -0800 [thread overview]
Message-ID: <202502051056.B910C691C@keescook> (raw)
In-Reply-To: <20250201200503.2532357-1-surenb@google.com>
On Sat, Feb 01, 2025 at 12:05:03PM -0800, Suren Baghdasaryan wrote:
> Additional condition in the allocation hooks causes Clang version 14
> (tested on 14.0.6) to treat the allocated object size as unknown at
> compile-time (__builtin_object_size(obj, 1) returns -1) even though
> both branches of that condition yield the same result. Other versions
> of Clang (tested with 13.0.1, 15.0.7, 16.0.6 and 17.0.6) compile the
> same code without issues. Add build-time Clang version check which
> removes this condition and effectively restores the unconditional tag
> store/restore flow when compiled with clang-14.
>
> Fixes: 07438779313c ("alloc_tag: avoid current->alloc_tag manipulations when profiling is disabled")
> Reported-by: kernel test robot <lkp@intel.com>
> Closes: https://lore.kernel.org/oe-kbuild-all/202501310832.kiAeOt2z-lkp@intel.com/
> Signed-off-by: Suren Baghdasaryan <surenb@google.com>
> ---
> include/linux/alloc_tag.h | 15 ++++++++++++++-
> 1 file changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/alloc_tag.h b/include/linux/alloc_tag.h
> index a946e0203e6d..df432c2c3483 100644
> --- a/include/linux/alloc_tag.h
> +++ b/include/linux/alloc_tag.h
> @@ -222,10 +222,23 @@ static inline void alloc_tag_sub(union codetag_ref *ref, size_t bytes) {}
>
> #endif /* CONFIG_MEM_ALLOC_PROFILING */
>
> +/* See https://lore.kernel.org/all/202501310832.kiAeOt2z-lkp@intel.com/ */
> +#if defined(CONFIG_CC_IS_CLANG) && CONFIG_CLANG_VERSION >= 140000 && CONFIG_CLANG_VERSION < 150000
FWIW, this could just be "< 150000" -- < 14 doesn't warn because (as
Nathan mentioned to me today) it didn't support the build-time error
attribute, so it wouldn't have warned even if it did trip over it.
> +static inline bool store_current_tag(void)
> +{
> + return true;
> +}
> +#else
> +static inline bool store_current_tag(void)
> +{
> + return mem_alloc_profiling_enabled();
> +}
> +#endif
> +
> #define alloc_hooks_tag(_tag, _do_alloc) \
> ({ \
> typeof(_do_alloc) _res; \
> - if (mem_alloc_profiling_enabled()) { \
> + if (store_current_tag()) { \
> struct alloc_tag * __maybe_unused _old; \
> _old = alloc_tag_save(_tag); \
> _res = _do_alloc; \
I think the work-around is fine, but I'm trying to dig into the root
cause here.
As you found, it fails on the final strtomem_pad:
strtomem_pad(key->u.kbd.press_str, press, '\0');
strtomem_pad(key->u.kbd.repeat_str, repeat, '\0');
strtomem_pad(key->u.kbd.release_str, release, '\0');
(but not the earlier calls??) The destinations are:
char press_str[sizeof(void *) + sizeof(int)] __nonstring;
char repeat_str[sizeof(void *) + sizeof(int)] __nonstring;
char release_str[sizeof(void *) + sizeof(int)] __nonstring;
Random thoughts include "this is the last array in the struct" which might
imply bad compiler behavior about its sizing via __builtin_object_size()
(i.e. trailing array must always be unknown size to deal with
fake flex arrays), but that wasn't fixed until Clang 16 (with
-fstrict-flex-arrays=3), so that it doesn't trip in Clang 15 is odd.
To Kent's comment[1], I believe I was using __builtin_object_size() here
because I have a knee-jerk aversion to sizeof() due to it blowing up on
flexible arrays, but that's not relevant here. ARRAY_SIZE() would work,
but only if type checking to "char *" succeeds, as Kent suggests.
Let me see if making those changes survives testing...
-Kees
[1] https://lore.kernel.org/all/qbmazoiryyqygjk2x6bc7puqvmik7gyitzo3xnryzsodnrrjek@tahia33lvpli/
>
> base-commit: 60c828cf80c07394762a1edfaff63bea55cc8e45
> --
> 2.48.1.362.g079036d154-goog
>
--
Kees Cook
next prev parent reply other threads:[~2025-02-05 19:18 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-01 20:05 [PATCH 1/1] alloc_tag: work around clang-14 issue with __builtin_object_size() Suren Baghdasaryan
2025-02-05 19:18 ` Kees Cook [this message]
2025-02-05 19:57 ` Nathan Chancellor
2025-02-05 20:16 ` Kent Overstreet
2025-02-05 21:28 ` Kees Cook
2025-02-06 18:13 ` Kees Cook
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=202502051056.B910C691C@keescook \
--to=kees@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=justinstitt@google.com \
--cc=kent.overstreet@linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lkp@intel.com \
--cc=llvm@lists.linux.dev \
--cc=morbo@google.com \
--cc=nathan@kernel.org \
--cc=ndesaulniers@google.com \
--cc=surenb@google.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.