modpost: change mod->gpl_compatible to bool type
authorMasahiro Yamada <masahiroy@kernel.org>
Sun, 1 May 2022 08:40:08 +0000 (17:40 +0900)
committerMasahiro Yamada <masahiroy@kernel.org>
Sat, 7 May 2022 18:17:00 +0000 (03:17 +0900)
Currently, mod->gpl_compatible is tristate; it is set to -1 by default,
then to 1 or 0 when MODULE_LICENSE() is found.

Maybe, -1 was chosen to represent the 'unknown' license, but it is not
useful.

The current code:

    if (!mod->gpl_compatible)
            check_for_gpl_usage(exp->export, basename, exp->name);

... only cares whether gpl_compatible is zero or not.

Change it to a bool type with the initial value 'true', which has no
functional change.

The default value should be 'true' instead of 'false'.

Since commit 1d6cd3929360 ("modpost: turn missing MODULE_LICENSE() into
error"), unknown module license is an error.

The error message, "missing MODULE_LICENSE()" is enough to explain the
issue. It is not sensible to show another message, "GPL-incompatible
module ... uses GPL-only symbol".

Add comments to explain this.

While I was here, I renamed gpl_compatible to is_gpl_compatible for
clarification, and also slightly refactored the code.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
scripts/mod/modpost.c
scripts/mod/modpost.h

index a6035ab..25066dc 100644 (file)
@@ -187,7 +187,14 @@ static struct module *new_module(const char *modname)
        /* add to list */
        strcpy(mod->name, modname);
        mod->is_vmlinux = (strcmp(modname, "vmlinux") == 0);
-       mod->gpl_compatible = -1;
+
+       /*
+        * Set mod->is_gpl_compatible to true by default. If MODULE_LICENSE()
+        * is missing, do not check the use for EXPORT_SYMBOL_GPL() becasue
+        * modpost will exit wiht error anyway.
+        */
+       mod->is_gpl_compatible = true;
+
        mod->next = modules;
        modules = mod;
 
@@ -2012,10 +2019,8 @@ static void read_symbols(const char *modname)
                if (!license)
                        error("missing MODULE_LICENSE() in %s\n", modname);
                while (license) {
-                       if (license_is_gpl_compatible(license))
-                               mod->gpl_compatible = 1;
-                       else {
-                               mod->gpl_compatible = 0;
+                       if (!license_is_gpl_compatible(license)) {
+                               mod->is_gpl_compatible = false;
                                break;
                        }
                        license = get_next_modinfo(&info, "license", license);
@@ -2183,7 +2188,7 @@ static void check_exports(struct module *mod)
                        add_namespace(&mod->missing_namespaces, exp->namespace);
                }
 
-               if (!mod->gpl_compatible)
+               if (!mod->is_gpl_compatible)
                        check_for_gpl_usage(exp->export, basename, exp->name);
        }
 }
index 0bd8f69..73c36df 100644 (file)
@@ -112,7 +112,7 @@ buf_write(struct buffer *buf, const char *s, int len);
 
 struct module {
        struct module *next;
-       int gpl_compatible;
+       bool is_gpl_compatible;
        struct symbol *unres;
        bool from_dump;         /* true if module was loaded from *.symvers */
        bool is_vmlinux;