diff options
3 files changed, 205 insertions, 0 deletions
diff --git a/6.5/00_all_0003-Compiler-Attributes-counted_by-Adjust-name-and-ident.patch b/6.5/00_all_0003-Compiler-Attributes-counted_by-Adjust-name-and-ident.patch new file mode 100644 index 0000000..7365e3e --- /dev/null +++ b/6.5/00_all_0003-Compiler-Attributes-counted_by-Adjust-name-and-ident.patch @@ -0,0 +1,87 @@ +From 564e31793787789b226a6f4b7081f2647a515b58 Mon Sep 17 00:00:00 2001 +From: Kees Cook <keescook@chromium.org> +Date: Thu, 17 Aug 2023 13:06:03 -0700 +Subject: [PATCH 3/5] Compiler Attributes: counted_by: Adjust name and + identifier expansion + +[ Upstream commit c8248faf3ca276ebdf60f003b3e04bf764daba91 ] + +GCC and Clang's current RFCs name this attribute "counted_by", and have +moved away from using a string for the member name. Update the kernel's +macros to match. Additionally provide a UAPI no-op macro for UAPI structs +that will gain annotations. + +Cc: Miguel Ojeda <ojeda@kernel.org> +Cc: Nick Desaulniers <ndesaulniers@google.com> +Fixes: dd06e72e68bc ("Compiler Attributes: Add __counted_by macro") +Acked-by: Miguel Ojeda <ojeda@kernel.org> +Reviewed-by: Nathan Chancellor <nathan@kernel.org> +Link: https://lore.kernel.org/r/20230817200558.never.077-kees@kernel.org +Signed-off-by: Kees Cook <keescook@chromium.org> +Stable-dep-of: 32a4ec211d41 ("uapi: stddef.h: Fix __DECLARE_FLEX_ARRAY for C++") +Signed-off-by: Sasha Levin <sashal@kernel.org> +(cherry picked from commit cc17adeef726a0df7fe5df7585a07128cd0c6070) +--- + include/linux/compiler_attributes.h | 26 +++++++++++++------------- + include/uapi/linux/stddef.h | 4 ++++ + 2 files changed, 17 insertions(+), 13 deletions(-) + +diff --git a/include/linux/compiler_attributes.h b/include/linux/compiler_attributes.h +index 00efa35c350f..28566624f008 100644 +--- a/include/linux/compiler_attributes.h ++++ b/include/linux/compiler_attributes.h +@@ -94,6 +94,19 @@ + # define __copy(symbol) + #endif + ++/* ++ * Optional: only supported since gcc >= 14 ++ * Optional: only supported since clang >= 18 ++ * ++ * gcc: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108896 ++ * clang: https://reviews.llvm.org/D148381 ++ */ ++#if __has_attribute(__counted_by__) ++# define __counted_by(member) __attribute__((__counted_by__(member))) ++#else ++# define __counted_by(member) ++#endif ++ + /* + * Optional: not supported by gcc + * Optional: only supported since clang >= 14.0 +@@ -129,19 +142,6 @@ + # define __designated_init + #endif + +-/* +- * Optional: only supported since gcc >= 14 +- * Optional: only supported since clang >= 17 +- * +- * gcc: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108896 +- * clang: https://reviews.llvm.org/D148381 +- */ +-#if __has_attribute(__element_count__) +-# define __counted_by(member) __attribute__((__element_count__(#member))) +-#else +-# define __counted_by(member) +-#endif +- + /* + * Optional: only supported since clang >= 14.0 + * +diff --git a/include/uapi/linux/stddef.h b/include/uapi/linux/stddef.h +index 7837ba4fe728..7c3fc3980881 100644 +--- a/include/uapi/linux/stddef.h ++++ b/include/uapi/linux/stddef.h +@@ -45,3 +45,7 @@ + TYPE NAME[]; \ + } + #endif ++ ++#ifndef __counted_by ++#define __counted_by(m) ++#endif +-- +2.42.0 + diff --git a/6.5/00_all_0004-uapi-stddef.h-Fix-header-guard-location.patch b/6.5/00_all_0004-uapi-stddef.h-Fix-header-guard-location.patch new file mode 100644 index 0000000..74fed6e --- /dev/null +++ b/6.5/00_all_0004-uapi-stddef.h-Fix-header-guard-location.patch @@ -0,0 +1,41 @@ +From 4741f029c3eebaaaae560864d5442319ad1d7a02 Mon Sep 17 00:00:00 2001 +From: Alexey Dobriyan <adobriyan@gmail.com> +Date: Tue, 12 Sep 2023 19:23:21 +0300 +Subject: [PATCH 4/5] uapi: stddef.h: Fix header guard location + +[ Upstream commit 531108ec5b5cd45ec6272a6115e73275baef7d22 ] + +The #endif for the header guard wasn't at the end of the header. This +was harmless since the define that escaped was already testing for its +own redefinition. Regardless, move the #endif to the correct place. + +Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> +Fixes: c8248faf3ca2 ("Compiler Attributes: counted_by: Adjust name and identifier expansion") +Link: https://lore.kernel.org/r/b1f5081e-339d-421d-81b2-cbb94e1f6f5f@p183 +Co-developed-by: Kees Cook <keescook@chromium.org> +Signed-off-by: Kees Cook <keescook@chromium.org> +Stable-dep-of: 32a4ec211d41 ("uapi: stddef.h: Fix __DECLARE_FLEX_ARRAY for C++") +Signed-off-by: Sasha Levin <sashal@kernel.org> +(cherry picked from commit 721045f22e1a79cb04bfd4463cdf445108287666) +--- + include/uapi/linux/stddef.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/include/uapi/linux/stddef.h b/include/uapi/linux/stddef.h +index 7c3fc3980881..c027b2070d79 100644 +--- a/include/uapi/linux/stddef.h ++++ b/include/uapi/linux/stddef.h +@@ -44,8 +44,9 @@ + struct { } __empty_ ## NAME; \ + TYPE NAME[]; \ + } +-#endif + + #ifndef __counted_by + #define __counted_by(m) + #endif ++ ++#endif /* _UAPI_LINUX_STDDEF_H */ +-- +2.42.0 + diff --git a/6.5/00_all_0005-uapi-stddef.h-Fix-__DECLARE_FLEX_ARRAY-for-C.patch b/6.5/00_all_0005-uapi-stddef.h-Fix-__DECLARE_FLEX_ARRAY-for-C.patch new file mode 100644 index 0000000..934774e --- /dev/null +++ b/6.5/00_all_0005-uapi-stddef.h-Fix-__DECLARE_FLEX_ARRAY-for-C.patch @@ -0,0 +1,77 @@ +From 8ba6fb2fa507aec278bce9fec42b38be2231588e Mon Sep 17 00:00:00 2001 +From: Alexey Dobriyan <adobriyan@gmail.com> +Date: Tue, 12 Sep 2023 19:22:24 +0300 +Subject: [PATCH 5/5] uapi: stddef.h: Fix __DECLARE_FLEX_ARRAY for C++ + +[ Upstream commit 32a4ec211d4164e667d9d0b807fadf02053cd2e9 ] + +__DECLARE_FLEX_ARRAY(T, member) macro expands to + + struct { + struct {} __empty_member; + T member[]; + }; + +which is subtly wrong in C++ because sizeof(struct{}) is 1 not 0, +changing UAPI structures layouts. + +This can be fixed by expanding to + + T member[]; + +Now g++ doesn't like "T member[]" either, throwing errors on +the following code: + + struct S { + union { + T1 member1[]; + T2 member2[]; + }; + }; + +or + + struct S { + T member[]; + }; + +Use "T member[0];" which seems to work and does the right thing wrt +structure layout. + +Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> +Fixes: 3080ea5553cc ("stddef: Introduce DECLARE_FLEX_ARRAY() helper") +Link: https://lore.kernel.org/r/97242381-f1ec-4a4a-9472-1a464f575657@p183 +Signed-off-by: Kees Cook <keescook@chromium.org> +Signed-off-by: Sasha Levin <sashal@kernel.org> +(cherry picked from commit 144ed54ed6ec4c099ff7c2b0064ed3ff89b73737) +--- + include/uapi/linux/stddef.h | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/include/uapi/linux/stddef.h b/include/uapi/linux/stddef.h +index c027b2070d79..5c6c4269f7ef 100644 +--- a/include/uapi/linux/stddef.h ++++ b/include/uapi/linux/stddef.h +@@ -29,6 +29,11 @@ + struct TAG { MEMBERS } ATTRS NAME; \ + } + ++#ifdef __cplusplus ++/* sizeof(struct{}) is 1 in C++, not 0, can't use C version of the macro. */ ++#define __DECLARE_FLEX_ARRAY(T, member) \ ++ T member[0] ++#else + /** + * __DECLARE_FLEX_ARRAY() - Declare a flexible array usable in a union + * +@@ -44,6 +49,7 @@ + struct { } __empty_ ## NAME; \ + TYPE NAME[]; \ + } ++#endif + + #ifndef __counted_by + #define __counted_by(m) +-- +2.42.0 + |