Skip to content

Commit

Permalink
compiler_types: add Endianness-dependent __counted_by_{le,be}
Browse files Browse the repository at this point in the history
Some structures contain flexible arrays at the end and the counter for
them, but the counter has explicit Endianness and thus __counted_by()
can't be used directly.

To increase test coverage for potential problems without breaking
anything, introduce __counted_by_{le,be}() defined depending on
platform's Endianness to either __counted_by() when applicable or noop
otherwise.
Maybe it would be a good idea to introduce such attributes on compiler
level if possible, but for now let's stop on what we have.

Acked-by: Kees Cook <[email protected]>
Acked-by: Gustavo A. R. Silva <[email protected]>
Signed-off-by: Alexander Lobakin <[email protected]>
Reviewed-by: Przemek Kitszel <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Jakub Kicinski <[email protected]>
  • Loading branch information
alobakin authored and kuba-moo committed Mar 29, 2024
1 parent 6e9b019 commit ca7e324
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 0 deletions.
2 changes: 2 additions & 0 deletions Documentation/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ def have_command(cmd):
"__rcu",
"__user",
"__force",
"__counted_by_le",
"__counted_by_be",

# include/linux/compiler_attributes.h:
"__alias",
Expand Down
11 changes: 11 additions & 0 deletions include/linux/compiler_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,17 @@ struct ftrace_likely_data {
#define __no_sanitize_or_inline __always_inline
#endif

/*
* Apply __counted_by() when the Endianness matches to increase test coverage.
*/
#ifdef __LITTLE_ENDIAN
#define __counted_by_le(member) __counted_by(member)
#define __counted_by_be(member)
#else
#define __counted_by_le(member)
#define __counted_by_be(member) __counted_by(member)
#endif

/* Do not trap wrapping arithmetic within an annotated function. */
#ifdef CONFIG_UBSAN_SIGNED_WRAP
# define __signed_wrap __attribute__((no_sanitize("signed-integer-overflow")))
Expand Down
1 change: 1 addition & 0 deletions scripts/kernel-doc
Original file line number Diff line number Diff line change
Expand Up @@ -1143,6 +1143,7 @@ sub dump_struct($$) {
$members =~ s/\s*$attribute/ /gi;
$members =~ s/\s*__aligned\s*\([^;]*\)/ /gos;
$members =~ s/\s*__counted_by\s*\([^;]*\)/ /gos;
$members =~ s/\s*__counted_by_(le|be)\s*\([^;]*\)/ /gos;
$members =~ s/\s*__packed\s*/ /gos;
$members =~ s/\s*CRYPTO_MINALIGN_ATTR/ /gos;
$members =~ s/\s*____cacheline_aligned_in_smp/ /gos;
Expand Down

0 comments on commit ca7e324

Please sign in to comment.