da2654b
authorMarco d'Itri <md@linux.it>
Fri, 25 Apr 2025 09:50:41 +0000 (11:50 +0200)
committerMarco d'Itri <md@linux.it>
Fri, 25 Apr 2025 09:50:41 +0000 (11:50 +0200)
commit da2654b78ce3af083e42c2f7512d09082b872676
Author: Yannick Le Pennec <yannick.lepennec@live.fr>
Date:   Mon Mar 24 18:35:53 2025 +0100

    tools/rmmod: fix garbled error message

    a6f9cd0 ("tools/rmmod: consistently use ERR logging facility") fixed
    the split between syslog and stderr of various error message substrings
    by calling the ERR macro instead of writing directly to stderr, but in
    doing so also completely mangled the output because the ERR macro
    decorates its arguments:

        $ rmmod iwlwifi
        rmmod: ERROR: Module iwlwifi is in use by:rmmod: ERROR:  iwlmvmrmmod: ERROR:

    And in syslog:

        $ rmmod -s iwlwifi
        2025-03-24T17:22:34.878318+01:00 mangolassi rmmod: ERROR: Module iwlwifi is in use by:
        2025-03-24T17:22:34.889145+01:00 mangolassi rmmod: ERROR:  iwlmvm
        2025-03-24T17:22:34.889224+01:00 mangolassi rmmod: ERROR:

    This commit fixes that by building the holder names list with a strbuf
    and then passes the whole thing at once to ERR.

Fixes: a6f9cd0 ("tools/rmmod: consistently use ERR logging facility")
Signed-off-by: Yannick Le Pennec <yannick.lepennec@live.fr>
Link: https://lore.kernel.org/r/VI1PR02MB48291E3BDB7E764ED67154949BA42@VI1PR02MB4829.eurprd02.prod.outlook.com
Signed-off-by: Lucas De Marchi <lucas.de.marchi@gmail.com>
Link: https://github.com/kmod-project/kmod/pull/328
Gbp-Pq: Name da2654b

tools/rmmod.c

index 962d85054df0142de7c283d9d425e2be988bd599..61f2e008a48ce8409a484999d3e3a7c6ffb9a7b2 100644 (file)
@@ -15,6 +15,7 @@
 #include <sys/types.h>
 
 #include <shared/macro.h>
+#include <shared/strbuf.h>
 
 #include <libkmod/libkmod.h>
 
@@ -63,16 +64,18 @@ static int check_module_inuse(struct kmod_module *mod)
 
        holders = kmod_module_get_holders(mod);
        if (holders != NULL) {
+               DECLARE_STRBUF_WITH_STACK(buf, 128);
                struct kmod_list *itr;
 
-               ERR("Module %s is in use by:", kmod_module_get_name(mod));
-
                kmod_list_foreach(itr, holders) {
                        struct kmod_module *hm = kmod_module_get_module(itr);
-                       ERR(" %s", kmod_module_get_name(hm));
+                       strbuf_pushchar(&buf, ' ');
+                       strbuf_pushchars(&buf, kmod_module_get_name(hm));
                        kmod_module_unref(hm);
                }
-               ERR("\n");
+
+               ERR("Module %s is in use by:%s\n", kmod_module_get_name(mod),
+                   strbuf_str(&buf));
 
                kmod_module_unref_list(holders);
                return -EBUSY;