lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CAK7LNATH7Lewi+-3T3R5X1CVRbBGGsVQEdLJ2FqQP+8RRAOHkw@mail.gmail.com>
Date: Wed, 4 Jun 2025 13:52:37 +0900
From: Masahiro Yamada <masahiroy@...nel.org>
To: linux-kbuild@...r.kernel.org
Cc: linux-kernel@...r.kernel.org
Subject: Re: [PATCH v2 3/4] scripts/misc-check: check missing #include
 <linux/export.h> when W=1

On Sun, Jun 1, 2025 at 10:32 PM Masahiro Yamada <masahiroy@...nel.org> wrote:
>
> The problem was described in commit 5b20755b7780 ("init: move THIS_MODULE
> from <linux/export.h> to <linux/init.h>").
>
> To summarize it again here: <linux/export.h> is included by most C files,
> even though only some of them actually export symbols. This is because
> some headers, such as include/linux/{module.h,linkage}, needlessly
> include <linux/export.h>.
>
> I have added a more detailed explanation in the comments of
> scripts/misc-check.
>
> This problem will be fixed in two steps:
>
>  1. Add #include <linux/export.h> to C files that use EXPORT_SYMBOL()
>  2. Remove #include <linux/export.h> from header files that do not use
>     EXPORT_SYMBOL()
>
> This commit addresses step 1; scripts/misc-check will warn about *.[ch]
> files that use EXPORT_SYMBOL() but do not include <linux/export.h>.
> This check is only triggered when the kernel is built with W=1.
>
> We need to fix 4000+ files. I hope others will help with this effort.
>
> Signed-off-by: Masahiro Yamada <masahiroy@...nel.org>
> ---
>
> Changes in v2:
>  - Fix out-of-tree build
>
>  scripts/misc-check | 43 +++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 43 insertions(+)
>
> diff --git a/scripts/misc-check b/scripts/misc-check
> index 21551d721079..edc0e44d96de 100755
> --- a/scripts/misc-check
> +++ b/scripts/misc-check
> @@ -9,4 +9,47 @@ check_tracked_ignored_files () {
>                 sed 's/$/: warning: ignored by one of the .gitignore files/' >&2
>  }
>
> +# Check for missing #include <linux/export.h>
> +#
> +# The rule for including <linux/export.h> is very simple:
> +# Include <linux/export.h> only when you use EXPORT_SYMBOL(). That's it.
> +#
> +# However, some headers include <linux/export.h> even though they are completely
> +# unrelated to EXPORT_SYMBOL().
> +#
> +# One example is include/linux/module.h. Please note <linux/module.h> and
> +# <linux/export.h> are orthogonal. <linux/module.h> should be included by files
> +# that can be compiled as modules. In other words, <linux/module.h> should be
> +# included by EXPORT_SYMBOL consumers. In contrast, <linux/export.h> should be
> +# included from EXPORT_SYMBOL providers, which may or may not be modular.
> +# Hence, include/linux/module.h should *not* include <linux/export.h>.
> +#
> +# Another example is include/linux/linkage.h, which is completely unrelated to
> +# EXPORT_SYMBOL(). Worse, it is included by most C files, which means, most C
> +# files end up including <linux/export.h>, even though only some of them
> +# actually export symbols. Hence, include/linux/linkage.h should *not* include
> +# <linux/export.h>.
> +#
> +# Before fixing such headers, we must ensure that C files using EXPORT_SYMBOL()
> +# include <linux/export.h> directly, since many C files currently rely on
> +# <linux/export.h> being included indirectly (likely, via <linux/linkage> etc.).
> +#
> +# Therefore, this check.
> +#
> +# The problem is simple - the warned files use EXPORT_SYMBOL(), but do not
> +# include <linux/export.h>. Please add #include <linux/export.h> to them.
> +#
> +# If the included headers are sorted alphabetically, please insert
> +# <linux/export.h> in the appropriate position to maintain the sort order.
> +# For this reason, this script only checks missing <linux/export.h>, but
> +# does not automatically fix it.
> +check_missing_include_linux_export_h () {
> +
> +       git -C "${srctree:-.}" grep --files-with-matches -E 'EXPORT_SYMBOL((_NS)?(_GPL)?|_GPL_FOR_MODULES)\(.*\)' \
> +           -- '*.[ch]' :^tools/ :^include/linux/export.h |
> +       xargs git -C "${srctree:-.}" grep --files-without-match '#include[[:space:]]*<linux/export\.h>' |
> +       xargs printf "%s: warning: EXPORT_SYMBOL() is used, but #include <linux/export.h> is missing\n" >&2


xargs needs the -r option.



diff --git a/scripts/misc-check b/scripts/misc-check
index 51a5841673f7..c421c6cad476 100755
--- a/scripts/misc-check
+++ b/scripts/misc-check
@@ -47,8 +47,8 @@ check_missing_include_linux_export_h () {

        git -C "${srctree:-.}" grep --files-with-matches -E
'EXPORT_SYMBOL((_NS)?(_GPL)?|_GPL_FOR_MODULES)\(.*\)' \
            -- '*.[ch]' :^tools/ :^include/linux/export.h |
-       xargs git -C "${srctree:-.}" grep --files-without-match
'#include[[:space:]]*<linux/export\.h>' |
-       xargs printf "%s: warning: EXPORT_SYMBOL() is used, but
#include <linux/export.h> is missing\n" >&2
+       xargs -r git -C "${srctree:-.}" grep --files-without-match
'#include[[:space:]]*<linux/export\.h>' |
+       xargs -r printf "%s: warning: EXPORT_SYMBOL() is used, but
#include <linux/export.h> is missing\n" >&2
 }

 # If you do not use EXPORT_SYMBOL(), please do not include <linux/export.h>.


-- 
Best Regards
Masahiro Yamada

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ