From 2a5f67a3df603eb9d9b293d8bf661954dabf9da2 Mon Sep 17 00:00:00 2001 From: Lucas De Marchi Date: Sat, 8 Aug 2026 00:05:07 -0500 Subject: [PATCH 1/5] Fix some trivial coding style issues Make clang-format happy. Signed-off-by: Lucas De Marchi --- shared/util.c | 2 +- testsuite/delete_module.c | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/shared/util.c b/shared/util.c index ae8856249..bb88b0c5f 100644 --- a/shared/util.c +++ b/shared/util.c @@ -84,7 +84,7 @@ int alias_normalize(const char *alias, char buf[static PATH_MAX], size_t *len) i++; } if (i >= PATH_MAX - 1) - return -EINVAL; + return -EINVAL; if (alias[i] != ']') return -EINVAL; diff --git a/testsuite/delete_module.c b/testsuite/delete_module.c index 81827f58b..53af83ba5 100644 --- a/testsuite/delete_module.c +++ b/testsuite/delete_module.c @@ -192,8 +192,7 @@ long delete_module(const char *modname, _maybe_unused_ unsigned int flags) if (mod == NULL) return 0; - if (!strbuf_pushchars(&buf, "/sys/module/") || - !strbuf_pushchars(&buf, modname)) { + if (!strbuf_pushchars(&buf, "/sys/module/") || !strbuf_pushchars(&buf, modname)) { errno = ENOMEM; return -1; } From 6ddfa4d7b757ed57ee881f835b6db7ad677dc46b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=C2=A0=C5=9Alepecki?= Date: Fri, 20 Jun 2025 17:59:01 +0200 Subject: [PATCH 2/5] testsuite: test-modprobe: modprobe with blacklist MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Until now blacklist command was only covered by test-blacklist at libkmod interface level. A regular user will usually interact with it via modprobe(8). This commit adds tests for modprobe, alias filtering, and -b option. It is also intended as an example of -b usage. Co-authored-by: Dawid Osuchowski Signed-off-by: Dawid Osuchowski Signed-off-by: Jakub Ślepecki Signed-off-by: Lucas De Marchi --- scripts/setup-rootfs.sh | 8 ++ .../etc/modprobe.d/blacklist.conf | 1 + .../lib/modules/4.4.4/modules.alias | 1 + .../lib/modules/4.4.4/modules.alias.bin | Bin 0 -> 12 bytes .../lib/modules/4.4.4/modules.builtin.bin | 0 .../lib/modules/4.4.4/modules.dep | 4 + .../lib/modules/4.4.4/modules.dep.bin | Bin 0 -> 219 bytes .../lib/modules/4.4.4/modules.devname | 1 + .../lib/modules/4.4.4/modules.softdep | 1 + .../lib/modules/4.4.4/modules.symbols | 4 + .../lib/modules/4.4.4/modules.symbols.bin | Bin 0 -> 102 bytes .../etc/modprobe.d/blacklist.conf | 2 + .../lib/modules/4.4.4/modules.alias | 1 + .../lib/modules/4.4.4/modules.alias.bin | Bin 0 -> 12 bytes .../lib/modules/4.4.4/modules.builtin.bin | 0 .../lib/modules/4.4.4/modules.dep | 1 + .../lib/modules/4.4.4/modules.dep.bin | Bin 0 -> 58 bytes .../lib/modules/4.4.4/modules.devname | 1 + .../lib/modules/4.4.4/modules.softdep | 1 + .../lib/modules/4.4.4/modules.symbols | 1 + .../lib/modules/4.4.4/modules.symbols.bin | Bin 0 -> 12 bytes .../etc/modprobe.d/blacklist.conf | 2 + .../lib/modules/4.4.4/modules.alias | 1 + .../lib/modules/4.4.4/modules.alias.bin | Bin 0 -> 12 bytes .../lib/modules/4.4.4/modules.builtin.bin | 0 .../lib/modules/4.4.4/modules.dep | 2 + .../lib/modules/4.4.4/modules.dep.bin | Bin 0 -> 150 bytes .../lib/modules/4.4.4/modules.devname | 1 + .../lib/modules/4.4.4/modules.softdep | 1 + .../lib/modules/4.4.4/modules.symbols | 2 + .../lib/modules/4.4.4/modules.symbols.bin | Bin 0 -> 53 bytes .../blacklist/etc/modprobe.d/blacklist.conf | 2 + .../blacklist/lib/modules/4.4.4/modules.alias | 1 + .../lib/modules/4.4.4/modules.alias.bin | Bin 0 -> 12 bytes .../lib/modules/4.4.4/modules.builtin.bin | 0 .../blacklist/lib/modules/4.4.4/modules.dep | 1 + .../lib/modules/4.4.4/modules.dep.bin | Bin 0 -> 58 bytes .../lib/modules/4.4.4/modules.devname | 1 + .../lib/modules/4.4.4/modules.softdep | 1 + .../lib/modules/4.4.4/modules.symbols | 1 + .../lib/modules/4.4.4/modules.symbols.bin | Bin 0 -> 12 bytes .../blacklist/sys/module/.gitignore | 0 testsuite/test-modprobe.c | 72 ++++++++++++++++++ 43 files changed, 115 insertions(+) create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-dep/etc/modprobe.d/blacklist.conf create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-dep/lib/modules/4.4.4/modules.alias create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-dep/lib/modules/4.4.4/modules.alias.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-dep/lib/modules/4.4.4/modules.builtin.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-dep/lib/modules/4.4.4/modules.dep create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-dep/lib/modules/4.4.4/modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-dep/lib/modules/4.4.4/modules.devname create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-dep/lib/modules/4.4.4/modules.softdep create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-dep/lib/modules/4.4.4/modules.symbols create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-dep/lib/modules/4.4.4/modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/etc/modprobe.d/blacklist.conf create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.alias create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.alias.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.builtin.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.dep create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.devname create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.softdep create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.symbols create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/etc/modprobe.d/blacklist.conf create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.alias create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.alias.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.builtin.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.dep create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.devname create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.softdep create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.symbols create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist/etc/modprobe.d/blacklist.conf create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.alias create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.alias.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.builtin.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.dep create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.devname create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.softdep create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.symbols create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/blacklist/sys/module/.gitignore diff --git a/scripts/setup-rootfs.sh b/scripts/setup-rootfs.sh index f0d232ab5..07e3369cf 100755 --- a/scripts/setup-rootfs.sh +++ b/scripts/setup-rootfs.sh @@ -103,6 +103,14 @@ map=( ["test-modprobe/external/lib/modules/external/"]="mod-simple.ko" ["test-modprobe/module-from-abspath/home/foo/"]="mod-simple.ko" ["test-modprobe/module-from-relpath/home/foo/"]="mod-simple.ko" + ["test-modprobe/blacklist$MODULE_DIRECTORY/4.4.4/kernel/"]="mod-simple.ko" + ["test-modprobe/blacklist-dep$MODULE_DIRECTORY/4.4.4/kernel/mod-foo-a.ko"]="mod-foo-a.ko" + ["test-modprobe/blacklist-dep$MODULE_DIRECTORY/4.4.4/kernel/mod-foo-b.ko"]="mod-foo-b.ko" + ["test-modprobe/blacklist-dep$MODULE_DIRECTORY/4.4.4/kernel/mod-foo-c.ko"]="mod-foo-c.ko" + ["test-modprobe/blacklist-dep$MODULE_DIRECTORY/4.4.4/kernel/mod-foo.ko"]="mod-foo.ko" + ["test-modprobe/blacklist-loaded$MODULE_DIRECTORY/4.4.4/kernel/"]="mod-simple.ko" + ["test-modprobe/blacklist-softdep$MODULE_DIRECTORY/4.4.4/kernel/mod-foo-a.ko"]="mod-foo-a.ko" + ["test-modprobe/blacklist-softdep$MODULE_DIRECTORY/4.4.4/kernel/mod-simple.ko"]="mod-simple.ko" ["test-depmod/modules-order-compressed$MODULE_DIRECTORY/4.4.4/kernel/drivers/block/cciss.ko"]="mod-fake-cciss.ko" ["test-depmod/modules-order-compressed$MODULE_DIRECTORY/4.4.4/kernel/drivers/scsi/hpsa.ko"]="mod-fake-hpsa.ko" ["test-depmod/modules-order-compressed$MODULE_DIRECTORY/4.4.4/kernel/drivers/scsi/scsi_mod.ko"]="mod-fake-scsi-mod.ko" diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-dep/etc/modprobe.d/blacklist.conf b/testsuite/rootfs-pristine/test-modprobe/blacklist-dep/etc/modprobe.d/blacklist.conf new file mode 100644 index 000000000..6c8daa5ae --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/blacklist-dep/etc/modprobe.d/blacklist.conf @@ -0,0 +1 @@ +blacklist mod-foo-b diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-dep/lib/modules/4.4.4/modules.alias b/testsuite/rootfs-pristine/test-modprobe/blacklist-dep/lib/modules/4.4.4/modules.alias new file mode 100644 index 000000000..ba76e1815 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/blacklist-dep/lib/modules/4.4.4/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-dep/lib/modules/4.4.4/modules.alias.bin b/testsuite/rootfs-pristine/test-modprobe/blacklist-dep/lib/modules/4.4.4/modules.alias.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-dep/lib/modules/4.4.4/modules.builtin.bin b/testsuite/rootfs-pristine/test-modprobe/blacklist-dep/lib/modules/4.4.4/modules.builtin.bin new file mode 100644 index 000000000..e69de29bb diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-dep/lib/modules/4.4.4/modules.dep b/testsuite/rootfs-pristine/test-modprobe/blacklist-dep/lib/modules/4.4.4/modules.dep new file mode 100644 index 000000000..eac8ce342 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/blacklist-dep/lib/modules/4.4.4/modules.dep @@ -0,0 +1,4 @@ +kernel/mod-foo-b.ko: +kernel/mod-foo-c.ko: +kernel/mod-foo-a.ko: +kernel/mod-foo.ko: kernel/mod-foo-b.ko kernel/mod-foo-a.ko kernel/mod-foo-c.ko diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-dep/lib/modules/4.4.4/modules.dep.bin b/testsuite/rootfs-pristine/test-modprobe/blacklist-dep/lib/modules/4.4.4/modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..dce33e565e9d9caecb0808527da1d8de5a179b1e GIT binary patch literal 219 zcmdnM{w17&iGfjpfq^GC_W=WgP<~2$T7Eu5d^}L7jDdlH5r~(O0LnoY^8f$< literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/etc/modprobe.d/blacklist.conf b/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/etc/modprobe.d/blacklist.conf new file mode 100644 index 000000000..9d1ecaba8 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/etc/modprobe.d/blacklist.conf @@ -0,0 +1,2 @@ +alias simple.* mod-simple +blacklist mod-simple diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.alias b/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.alias new file mode 100644 index 000000000..ba76e1815 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.alias.bin b/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.alias.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.builtin.bin b/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.builtin.bin new file mode 100644 index 000000000..e69de29bb diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.dep b/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.dep new file mode 100644 index 000000000..54766537f --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.dep @@ -0,0 +1 @@ +kernel/mod-simple.ko: diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.dep.bin b/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..b09a85432309c43f99500d6cc3473bcb1ef0a80e GIT binary patch literal 58 zcmdnM{w17&iGfjpfx#p{CB8T_w;(5#0SFjDM0RRXUTThhZhnd`L`E+=--;nO_W%O} F4*<8l52gSB literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.devname b/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.devname new file mode 100644 index 000000000..58f6d6d69 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.devname @@ -0,0 +1 @@ +# Device nodes to trigger on-demand module loading. diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.softdep b/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.softdep new file mode 100644 index 000000000..5554ccca7 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.softdep @@ -0,0 +1 @@ +# Soft dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.symbols b/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.symbols new file mode 100644 index 000000000..618c345f7 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.symbols @@ -0,0 +1 @@ +# Aliases for symbols, used by symbol_request(). diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.symbols.bin b/testsuite/rootfs-pristine/test-modprobe/blacklist-loaded/lib/modules/4.4.4/modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/etc/modprobe.d/blacklist.conf b/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/etc/modprobe.d/blacklist.conf new file mode 100644 index 000000000..760a761a1 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/etc/modprobe.d/blacklist.conf @@ -0,0 +1,2 @@ +softdep mod-simple pre: mod-foo-a +blacklist mod-foo-a diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.alias b/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.alias new file mode 100644 index 000000000..ba76e1815 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.alias.bin b/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.alias.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.builtin.bin b/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.builtin.bin new file mode 100644 index 000000000..e69de29bb diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.dep b/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.dep new file mode 100644 index 000000000..3e721e15a --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.dep @@ -0,0 +1,2 @@ +kernel/mod-foo-a.ko: +kernel/mod-simple.ko: diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.dep.bin b/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..8a97d83cc941a87b28163f290905fb944f7b9e32 GIT binary patch literal 150 zcmdnM{w17&iGfjpfq^GCcL4)~P<~20Lt60x28I9z5&=+8QGR}WB1jt}h{#SY%1h1B i&&^NKP0P>MP1MWIw_?c5EyziQDPcrXQVf;>s{sIRg&N%e literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.devname b/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.devname new file mode 100644 index 000000000..58f6d6d69 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.devname @@ -0,0 +1 @@ +# Device nodes to trigger on-demand module loading. diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.softdep b/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.softdep new file mode 100644 index 000000000..5554ccca7 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.softdep @@ -0,0 +1 @@ +# Soft dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.symbols b/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.symbols new file mode 100644 index 000000000..8fdc29aca --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.symbols @@ -0,0 +1,2 @@ +# Aliases for symbols, used by symbol_request(). +alias symbol:print_fooA mod_foo_a diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.symbols.bin b/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/lib/modules/4.4.4/modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..fa07e2c455ed0f9fc21687127c20cc55808c2726 GIT binary patch literal 53 zcmdnM{w17&iGfjpfq|#E_y7ZgP-SjXevVZ^QD$CAd|H0KBLfgHf{5Jw6p%oCA_D+? C6AkZ literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.builtin.bin b/testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.builtin.bin new file mode 100644 index 000000000..e69de29bb diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.dep b/testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.dep new file mode 100644 index 000000000..54766537f --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.dep @@ -0,0 +1 @@ +kernel/mod-simple.ko: diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.dep.bin b/testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..b09a85432309c43f99500d6cc3473bcb1ef0a80e GIT binary patch literal 58 zcmdnM{w17&iGfjpfx#p{CB8T_w;(5#0SFjDM0RRXUTThhZhnd`L`E+=--;nO_W%O} F4*<8l52gSB literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.devname b/testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.devname new file mode 100644 index 000000000..58f6d6d69 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.devname @@ -0,0 +1 @@ +# Device nodes to trigger on-demand module loading. diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.softdep b/testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.softdep new file mode 100644 index 000000000..5554ccca7 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.softdep @@ -0,0 +1 @@ +# Soft dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.symbols b/testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.symbols new file mode 100644 index 000000000..618c345f7 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.symbols @@ -0,0 +1 @@ +# Aliases for symbols, used by symbol_request(). diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.symbols.bin b/testsuite/rootfs-pristine/test-modprobe/blacklist/lib/modules/4.4.4/modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/blacklist/sys/module/.gitignore b/testsuite/rootfs-pristine/test-modprobe/blacklist/sys/module/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/testsuite/test-modprobe.c b/testsuite/test-modprobe.c index 6b62644ae..7a3cd4f88 100644 --- a/testsuite/test-modprobe.c +++ b/testsuite/test-modprobe.c @@ -421,4 +421,76 @@ DEFINE_TEST(modprobe_module_from_relpath, .modules_loaded = "mod-simple", ); +static int modprobe_blacklisted_by_alias(void) +{ + return EXEC_TOOL(modprobe, "simple.abc"); +} +DEFINE_TEST(modprobe_blacklisted_by_alias, + .description = "check if modprobe alias does not load module with blacklist entry", + .config = { + [TC_UNAME_R] = "4.4.4", + [TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/blacklist", + [TC_INIT_MODULE_RETCODES] = "", + }, + .modules_loaded = "", + .modules_not_loaded = "mod-simple", + ); + +static int modprobe_blacklisted_by_name(void) +{ + return EXEC_TOOL(modprobe, "mod-simple"); +} +DEFINE_TEST(modprobe_blacklisted_by_name, + .description = "check if modprobe modulename loads module with blacklist entry", + .config = { + [TC_UNAME_R] = "4.4.4", + [TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/blacklist-loaded", + [TC_INIT_MODULE_RETCODES] = "", + }, + .modules_loaded = "mod-simple", + ); + +static int modprobe_blacklisted_by_name_filtered(void) +{ + return EXEC_TOOL(modprobe, "-b", "mod-simple"); +} +DEFINE_TEST(modprobe_blacklisted_by_name_filtered, + .description = "check if modprobe -b modulename does not load module with blacklist entry", + .config = { + [TC_UNAME_R] = "4.4.4", + [TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/blacklist", + [TC_INIT_MODULE_RETCODES] = "", + }, + .modules_loaded = "", + .modules_not_loaded = "mod-simple", + ); + +static int modprobe_blacklisted_dependency(void) +{ + return EXEC_TOOL(modprobe, "-b", "mod-foo"); +} +DEFINE_TEST(modprobe_blacklisted_dependency, + .description = "check if modprobe -b dependent ignores blacklist entry of dependency", + .config = { + [TC_UNAME_R] = "4.4.4", + [TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/blacklist-dep", + [TC_INIT_MODULE_RETCODES] = "", + }, + .modules_loaded = "mod-foo,mod-foo-a,mod-foo-b,mod_foo_c", + ); + +static int modprobe_blacklisted_softdep(void) +{ + return EXEC_TOOL(modprobe, "-b", "mod-simple"); +} +DEFINE_TEST(modprobe_blacklisted_softdep, + .description = "check if modprobe -b dependent ignores blacklist entry of softdep", + .config = { + [TC_UNAME_R] = "4.4.4", + [TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/blacklist-softdep", + [TC_INIT_MODULE_RETCODES] = "", + }, + .modules_loaded = "mod-simple,mod-foo-a", + ); + TESTSUITE_MAIN(); From 81dc1e71b21955fe3bb6f357372fad7f3387745a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20=C5=9Alepecki?= Date: Fri, 20 Jun 2025 17:59:07 +0200 Subject: [PATCH 3/5] libkmod: unref list before returning with error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In case of error path this might have led to, for example: ==86629==ERROR: LeakSanitizer: detected memory leaks Direct leak of 24 byte(s) in 1 object(s) allocated from: #0 0x7fa904b20e15 (/usr/lib/gcc/x86_64-pc-linux-gnu/15.1.1/../../../../lib/libasan.so+0x120e15) (BuildId: 9dccfc42ea2d9790ff7cf76cc8a3210650e604e0) #1 0x55d74820fc8a ($kmod/build/kmod+0xefc8a) (BuildId: e7c136c95271cf020398e33fd5577d82adc7a47c) #2 0x55d7482173a6 ($kmod/build/kmod+0xf73a6) (BuildId: e7c136c95271cf020398e33fd5577d82adc7a47c) #3 0x55d74821a617 ($kmod/build/kmod+0xfa617) (BuildId: e7c136c95271cf020398e33fd5577d82adc7a47c) #4 0x55d7481e2d80 ($kmod/build/kmod+0xc2d80) (BuildId: e7c136c95271cf020398e33fd5577d82adc7a47c) #5 0x55d7481e314f ($kmod/build/kmod+0xc314f) (BuildId: e7c136c95271cf020398e33fd5577d82adc7a47c) #6 0x55d7481e658c ($kmod/build/kmod+0xc658c) (BuildId: e7c136c95271cf020398e33fd5577d82adc7a47c) #7 0x7fa9038376b4 (/usr/lib/libc.so.6+0x276b4) (BuildId: 468e3585c794491a48ea75fceb9e4d6b1464fc35) #8 0x7fa903837768 (/usr/lib/libc.so.6+0x27768) (BuildId: 468e3585c794491a48ea75fceb9e4d6b1464fc35) #9 0x55d7481c3334 ($kmod/build/kmod+0xa3334) (BuildId: e7c136c95271cf020398e33fd5577d82adc7a47c) Indirect leak of 4120 byte(s) in 1 object(s) allocated from: #0 0x7fa904b2073d (/usr/lib/gcc/x86_64-pc-linux-gnu/15.1.1/../../../../lib/libasan.so+0x12073d) (BuildId: 9dccfc42ea2d9790ff7cf76cc8a3210650e604e0) #1 0x55d7481eb8eb ($kmod/build/kmod+0xcb8eb) (BuildId: e7c136c95271cf020398e33fd5577d82adc7a47c) #2 0x55d7481f6fee ($kmod/build/kmod+0xd6fee) (BuildId: e7c136c95271cf020398e33fd5577d82adc7a47c) #3 0x55d7481e52c4 ($kmod/build/kmod+0xc52c4) (BuildId: e7c136c95271cf020398e33fd5577d82adc7a47c) #4 0x7fa9038376b4 (/usr/lib/libc.so.6+0x276b4) (BuildId: 468e3585c794491a48ea75fceb9e4d6b1464fc35) #5 0x7fa903837768 (/usr/lib/libc.so.6+0x27768) (BuildId: 468e3585c794491a48ea75fceb9e4d6b1464fc35) #6 0x55d7481c3334 ($kmod/build/kmod+0xa3334) (BuildId: e7c136c95271cf020398e33fd5577d82adc7a47c) [...] SUMMARY: AddressSanitizer: 5701 byte(s) leaked in 27 allocation(s). Co-authored-by: Dawid Osuchowski Signed-off-by: Dawid Osuchowski Signed-off-by: Jakub Ślepecki Signed-off-by: Lucas De Marchi --- libkmod/libkmod-module.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libkmod/libkmod-module.c b/libkmod/libkmod-module.c index 4f8fcaf64..4d8ca9503 100644 --- a/libkmod/libkmod-module.c +++ b/libkmod/libkmod-module.c @@ -1043,10 +1043,10 @@ KMOD_EXPORT int kmod_module_probe_insert_module( err = kmod_module_apply_filter(mod->ctx, KMOD_FILTER_BLACKLIST, list, &filtered); + kmod_module_unref_list(list); if (err < 0) return err; - kmod_module_unref_list(list); if (filtered == NULL) return KMOD_PROBE_APPLY_BLACKLIST_ALL; From 68bc60f5138ba596f8e2f38fb3226f259ae93612 Mon Sep 17 00:00:00 2001 From: Lucas De Marchi Date: Fri, 7 Aug 2026 23:18:11 -0500 Subject: [PATCH 4/5] libkmod: Fix missing module normalization from kernel cmdline Normalize it before adding the blacklist. Without normalizing it we have, with just the test addition: $ ./build/testsuite/test-modprobe modprobe_param_kcmdline9 TESTSUITE: running modprobe_param_kcmdline9, in forked context TESTSUITE: ERR: Outputs do not match on STDOUT: TESTSUITE: ERR: correct: ... blacklist foo_bar ... TESTSUITE: ERR: wrong: blacklist foo-bar TESTSUITE: ERR: FAILED: exit ok but outputs do not match: modprobe_param_kcmdline9 Signed-off-by: Lucas De Marchi --- libkmod/libkmod-config.c | 3 +++ .../test-modprobe/module-param-kcmdline9/correct.txt | 1 + .../test-modprobe/module-param-kcmdline9/proc/cmdline | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/libkmod/libkmod-config.c b/libkmod/libkmod-config.c index 3f21e46cf..6938ff999 100644 --- a/libkmod/libkmod-config.c +++ b/libkmod/libkmod-config.c @@ -618,6 +618,9 @@ static void kcmdline_parse_result(struct kmod_config *config, char *modname, cha if (t == NULL) break; + if (underscores(t) < 0) + continue; + kmod_config_add_blacklist(config, t); } } else { diff --git a/testsuite/rootfs-pristine/test-modprobe/module-param-kcmdline9/correct.txt b/testsuite/rootfs-pristine/test-modprobe/module-param-kcmdline9/correct.txt index e69f813dd..f8399e12c 100644 --- a/testsuite/rootfs-pristine/test-modprobe/module-param-kcmdline9/correct.txt +++ b/testsuite/rootfs-pristine/test-modprobe/module-param-kcmdline9/correct.txt @@ -3,6 +3,7 @@ blacklist bar blacklist foo2 blacklist bar2 blacklist foobar +blacklist foo_bar # End of configuration files. Dumping indexes now: diff --git a/testsuite/rootfs-pristine/test-modprobe/module-param-kcmdline9/proc/cmdline b/testsuite/rootfs-pristine/test-modprobe/module-param-kcmdline9/proc/cmdline index dc78f9bcf..fe7af674c 100644 --- a/testsuite/rootfs-pristine/test-modprobe/module-param-kcmdline9/proc/cmdline +++ b/testsuite/rootfs-pristine/test-modprobe/module-param-kcmdline9/proc/cmdline @@ -1 +1 @@ -modprobe.blacklist=foo,bar modprobe.blacklist=foo2 quiet modprobe.blacklist=bar2 rw modprobe.blacklist=foobar +modprobe.blacklist=foo,bar modprobe.blacklist=foo2 quiet modprobe.blacklist=bar2 rw modprobe.blacklist=foobar modprobe.blacklist=foo-bar From fc14eedd18c4cd50c181c046ca311af20f66d4c0 Mon Sep 17 00:00:00 2001 From: Dawid Osuchowski Date: Fri, 20 Jun 2025 17:59:11 +0200 Subject: [PATCH 5/5] libkmod: add mask command MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mask command prevents modules from loading. It intends to be a strict and intent-based replacement for variations of install and blacklist commands, for example: * install module /bin/false * install module /bin/true * blacklist module, with modprobe -b This commit is a pure extension and the already established behaviour is not expected to change as a result. Closes: https://github.com/kmod-project/kmod/issues/440 Closes: https://github.com/kmod-project/kmod/issues/40 Co-authored-by: Jakub Ślepecki Signed-off-by: Jakub Ślepecki Signed-off-by: Dawid Osuchowski --- libkmod/docs/libkmod-docs.xml | 4 ++ libkmod/docs/libkmod-sections.txt | 1 + libkmod/libkmod-config.c | 57 +++++++++++++++++- libkmod/libkmod-internal.h | 2 + libkmod/libkmod-module.c | 51 ++++++++++++++-- libkmod/libkmod.h | 18 ++++++ libkmod/libkmod.sym | 5 ++ man/modprobe.8.scd | 3 +- man/modprobe.d.5.scd | 4 ++ scripts/setup-rootfs.sh | 6 ++ .../mask-softdep/etc/modprobe.d/mask.conf | 2 + .../lib/modules/4.4.4/modules.alias | 1 + .../lib/modules/4.4.4/modules.alias.bin | Bin 0 -> 12 bytes .../lib/modules/4.4.4/modules.builtin.bin | 0 .../lib/modules/4.4.4/modules.dep | 2 + .../lib/modules/4.4.4/modules.dep.bin | Bin 0 -> 150 bytes .../lib/modules/4.4.4/modules.devname | 1 + .../lib/modules/4.4.4/modules.softdep | 1 + .../lib/modules/4.4.4/modules.symbols | 2 + .../lib/modules/4.4.4/modules.symbols.bin | Bin 0 -> 53 bytes .../mask/etc/modprobe.d/mask.conf | 1 + .../mask/lib/modules/4.4.4/modules.alias | 1 + .../mask/lib/modules/4.4.4/modules.alias.bin | Bin 0 -> 12 bytes .../lib/modules/4.4.4/modules.builtin.bin | 0 .../mask/lib/modules/4.4.4/modules.dep | 4 ++ .../mask/lib/modules/4.4.4/modules.dep.bin | Bin 0 -> 219 bytes .../mask/lib/modules/4.4.4/modules.devname | 1 + .../mask/lib/modules/4.4.4/modules.softdep | 1 + .../mask/lib/modules/4.4.4/modules.symbols | 4 ++ .../lib/modules/4.4.4/modules.symbols.bin | Bin 0 -> 102 bytes .../test-modprobe/mask/sys/module/.gitignore | 0 .../module-param-kcmdline10/correct.txt | 9 +++ .../module-param-kcmdline10/proc/cmdline | 1 + testsuite/test-modprobe.c | 57 ++++++++++++++++++ tools/modprobe.c | 1 + 35 files changed, 232 insertions(+), 8 deletions(-) create mode 100644 testsuite/rootfs-pristine/test-modprobe/mask-softdep/etc/modprobe.d/mask.conf create mode 100644 testsuite/rootfs-pristine/test-modprobe/mask-softdep/lib/modules/4.4.4/modules.alias create mode 100644 testsuite/rootfs-pristine/test-modprobe/mask-softdep/lib/modules/4.4.4/modules.alias.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/mask-softdep/lib/modules/4.4.4/modules.builtin.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/mask-softdep/lib/modules/4.4.4/modules.dep create mode 100644 testsuite/rootfs-pristine/test-modprobe/mask-softdep/lib/modules/4.4.4/modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/mask-softdep/lib/modules/4.4.4/modules.devname create mode 100644 testsuite/rootfs-pristine/test-modprobe/mask-softdep/lib/modules/4.4.4/modules.softdep create mode 100644 testsuite/rootfs-pristine/test-modprobe/mask-softdep/lib/modules/4.4.4/modules.symbols create mode 100644 testsuite/rootfs-pristine/test-modprobe/mask-softdep/lib/modules/4.4.4/modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/mask/etc/modprobe.d/mask.conf create mode 100644 testsuite/rootfs-pristine/test-modprobe/mask/lib/modules/4.4.4/modules.alias create mode 100644 testsuite/rootfs-pristine/test-modprobe/mask/lib/modules/4.4.4/modules.alias.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/mask/lib/modules/4.4.4/modules.builtin.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/mask/lib/modules/4.4.4/modules.dep create mode 100644 testsuite/rootfs-pristine/test-modprobe/mask/lib/modules/4.4.4/modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/mask/lib/modules/4.4.4/modules.devname create mode 100644 testsuite/rootfs-pristine/test-modprobe/mask/lib/modules/4.4.4/modules.softdep create mode 100644 testsuite/rootfs-pristine/test-modprobe/mask/lib/modules/4.4.4/modules.symbols create mode 100644 testsuite/rootfs-pristine/test-modprobe/mask/lib/modules/4.4.4/modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/mask/sys/module/.gitignore create mode 100644 testsuite/rootfs-pristine/test-modprobe/module-param-kcmdline10/correct.txt create mode 100644 testsuite/rootfs-pristine/test-modprobe/module-param-kcmdline10/proc/cmdline diff --git a/libkmod/docs/libkmod-docs.xml b/libkmod/docs/libkmod-docs.xml index 674fe3a52..c4f9810e8 100644 --- a/libkmod/docs/libkmod-docs.xml +++ b/libkmod/docs/libkmod-docs.xml @@ -60,4 +60,8 @@ Index of new symbols in 33 + + Index of new symbols in 35 + + diff --git a/libkmod/docs/libkmod-sections.txt b/libkmod/docs/libkmod-sections.txt index dd502647c..aa8990375 100644 --- a/libkmod/docs/libkmod-sections.txt +++ b/libkmod/docs/libkmod-sections.txt @@ -35,6 +35,7 @@ kmod_list_prev kmod_config_iter kmod_config_get_blacklists kmod_config_get_install_commands +kmod_config_get_masks kmod_config_get_remove_commands kmod_config_get_aliases kmod_config_get_options diff --git a/libkmod/libkmod-config.c b/libkmod/libkmod-config.c index 6938ff999..8cfdc5a70 100644 --- a/libkmod/libkmod-config.c +++ b/libkmod/libkmod-config.c @@ -51,6 +51,11 @@ struct kmod_weakdep { unsigned int n_weak; }; +const char *kmod_mask_get_modname(const struct kmod_list *l) +{ + return l->data; +} + const char *kmod_blacklist_get_modname(const struct kmod_list *l) { return l->data; @@ -232,6 +237,27 @@ static int kmod_config_add_blacklist(struct kmod_config *config, const char *mod return 0; } +static int kmod_config_add_mask(struct kmod_config *config, const char *modname) +{ + _cleanup_free_ char *p; + struct kmod_list *list; + + DBG(config->ctx, "modname=%s\n", modname); + + _clang_suppress_alloc_ p = strdup(modname); + if (!p) + return -ENOMEM; + + list = kmod_list_append(config->masks, p); + if (!list) + return -ENOMEM; + + TAKE_PTR(p); + config->masks = list; + + return 0; +} + static int kmod_config_add_softdep(struct kmod_config *config, const char *modname, const char *line) { @@ -607,12 +633,15 @@ static char *weakdep_to_char(struct kmod_weakdep *dep) static void kcmdline_parse_result(struct kmod_config *config, char *modname, char *param, char *value) { + bool is_blacklist, is_mask; if (modname == NULL || param == NULL) return; DBG(config->ctx, "%s %s\n", modname, param); - if (streq(modname, "modprobe") && strstartswith(param, "blacklist=")) { + is_blacklist = strstartswith(param, "blacklist="); + is_mask = strstartswith(param, "mask="); + if (streq(modname, "modprobe") && (is_blacklist || is_mask)) { for (;;) { char *t = strsep(&value, ","); if (t == NULL) @@ -621,7 +650,10 @@ static void kcmdline_parse_result(struct kmod_config *config, char *modname, cha if (underscores(t) < 0) continue; - kmod_config_add_blacklist(config, t); + if (is_blacklist) + kmod_config_add_blacklist(config, t); + else + kmod_config_add_mask(config, t); } } else { if (underscores(modname) < 0) { @@ -827,6 +859,13 @@ static int kmod_config_parse(struct kmod_config *config, int fd, const char *fil kmod_config_add_command(config, modname, installcmd, cmd, &config->install_commands); + } else if (streq(cmd, "mask")) { + char *modname = strtok_r(NULL, "\t ", &saveptr); + + if (underscores(modname) < 0) + goto syntax_error; + + kmod_config_add_mask(config, modname); } else if (streq(cmd, "remove")) { char *modname = strtok_r(NULL, "\t ", &saveptr); char *removecmd = strtok_r(NULL, "\0", &saveptr); @@ -876,6 +915,7 @@ void kmod_config_free(struct kmod_config *config) kmod_list_release(config->blacklists, free); kmod_list_release(config->options, free); kmod_list_release(config->install_commands, free); + kmod_list_release(config->masks, free); kmod_list_release(config->remove_commands, free); kmod_list_release(config->softdeps, free); kmod_list_release(config->weakdeps, free); @@ -1098,6 +1138,7 @@ int kmod_config_new(struct kmod_ctx *ctx, struct kmod_config **p_config, enum config_type { CONFIG_TYPE_BLACKLIST = 0, CONFIG_TYPE_INSTALL, + CONFIG_TYPE_MASK, CONFIG_TYPE_REMOVE, CONFIG_TYPE_ALIAS, CONFIG_TYPE_OPTION, @@ -1148,6 +1189,10 @@ static struct kmod_config_iter *kmod_config_iter_new(const struct kmod_ctx *ctx, iter->get_key = kmod_command_get_modname; iter->get_value = kmod_command_get_command; break; + case CONFIG_TYPE_MASK: + iter->list = config->masks; + iter->get_key = kmod_mask_get_modname; + break; case CONFIG_TYPE_REMOVE: iter->list = config->remove_commands; iter->get_key = kmod_command_get_modname; @@ -1198,6 +1243,14 @@ KMOD_EXPORT struct kmod_config_iter *kmod_config_get_install_commands(const stru return kmod_config_iter_new(ctx, CONFIG_TYPE_INSTALL); } +KMOD_EXPORT struct kmod_config_iter *kmod_config_get_masks(const struct kmod_ctx *ctx) +{ + if (ctx == NULL) + return NULL; + + return kmod_config_iter_new(ctx, CONFIG_TYPE_MASK); +} + // clang-format off KMOD_EXPORT struct kmod_config_iter *kmod_config_get_remove_commands(const struct kmod_ctx *ctx) // clang-format on diff --git a/libkmod/libkmod-internal.h b/libkmod/libkmod-internal.h index e85666234..0aefac2d1 100644 --- a/libkmod/libkmod-internal.h +++ b/libkmod/libkmod-internal.h @@ -99,6 +99,7 @@ struct kmod_config { struct kmod_list *aliases; struct kmod_list *blacklists; struct kmod_list *options; + struct kmod_list *masks; struct kmod_list *remove_commands; struct kmod_list *install_commands; struct kmod_list *softdeps; @@ -112,6 +113,7 @@ _nonnull_all_ void kmod_config_free(struct kmod_config *config); _nonnull_all_ const char *kmod_blacklist_get_modname(const struct kmod_list *l); _nonnull_all_ const char *kmod_alias_get_name(const struct kmod_list *l); _nonnull_all_ const char *kmod_alias_get_modname(const struct kmod_list *l); +_nonnull_all_ const char *kmod_mask_get_modname(const struct kmod_list *l); _nonnull_all_ const char *kmod_option_get_options(const struct kmod_list *l); _nonnull_all_ const char *kmod_option_get_modname(const struct kmod_list *l); _nonnull_all_ const char *kmod_command_get_command(const struct kmod_list *l); diff --git a/libkmod/libkmod-module.c b/libkmod/libkmod-module.c index 4d8ca9503..2248acf21 100644 --- a/libkmod/libkmod-module.c +++ b/libkmod/libkmod-module.c @@ -737,12 +737,30 @@ static bool module_is_blacklisted(const struct kmod_module *mod) return false; } +static bool module_is_masked(const struct kmod_module *mod) +{ + const struct kmod_ctx *ctx = mod->ctx; + const struct kmod_config *config = kmod_get_config(ctx); + const struct kmod_list *bl = config->masks; + const struct kmod_list *l; + + kmod_list_foreach(l, bl) { + const char *modname = kmod_mask_get_modname(l); + + if (streq(modname, mod->name)) + return true; + } + + return false; +} + KMOD_EXPORT int kmod_module_apply_filter(const struct kmod_ctx *ctx, enum kmod_filter filter_type, const struct kmod_list *input, struct kmod_list **output) { const struct kmod_list *li; + int err = 0; if (ctx == NULL || output == NULL) return -ENOENT; @@ -761,9 +779,19 @@ KMOD_EXPORT int kmod_module_apply_filter(const struct kmod_ctx *ctx, if ((filter_type & KMOD_FILTER_BUILTIN) && kmod_module_is_builtin(mod)) continue; + if ((filter_type & KMOD_FILTER_MASK) && module_is_masked(mod)) { + if (!mod->required) + continue; + ERR(mod->ctx, "module is masked: %s\n", kmod_module_get_name(mod)); + err = -EINVAL; + goto fail; + } + node = kmod_list_append(*output, mod); - if (node == NULL) + if (node == NULL) { + err = -ENOMEM; goto fail; + } *output = node; kmod_module_ref(mod); @@ -774,7 +802,7 @@ KMOD_EXPORT int kmod_module_apply_filter(const struct kmod_ctx *ctx, fail: kmod_module_unref_list(*output); *output = NULL; - return -ENOMEM; + return err; } static int command_do(struct kmod_module *mod, const char *type, const char *cmd) @@ -1008,7 +1036,7 @@ KMOD_EXPORT int kmod_module_probe_insert_module( const void *data, void (*print_action)(struct kmod_module *m, bool install, const char *options)) { - struct kmod_list *list = NULL, *l; + struct kmod_list *list = NULL, *l, *filtered = NULL; struct probe_insert_cb cb; int err; @@ -1022,6 +1050,11 @@ KMOD_EXPORT int kmod_module_probe_insert_module( return 0; } + if (module_is_masked(mod)) { + ERR(mod->ctx, "module is masked: %s\n", kmod_module_get_name(mod)); + return -EINVAL; + } + if (module_is_blacklisted(mod)) { if (mod->alias != NULL && (flags & KMOD_PROBE_APPLY_BLACKLIST_ALIAS_ONLY)) return KMOD_PROBE_APPLY_BLACKLIST_ALIAS_ONLY; @@ -1038,9 +1071,17 @@ KMOD_EXPORT int kmod_module_probe_insert_module( if (err < 0) return err; - if (flags & KMOD_PROBE_APPLY_BLACKLIST_ALL) { - struct kmod_list *filtered = NULL; + err = kmod_module_apply_filter(mod->ctx, KMOD_FILTER_MASK, list, &filtered); + kmod_module_unref_list(list); + if (err < 0) + return err; + if (filtered == NULL) + return -EINVAL; + + list = filtered; + + if (flags & KMOD_PROBE_APPLY_BLACKLIST_ALL) { err = kmod_module_apply_filter(mod->ctx, KMOD_FILTER_BLACKLIST, list, &filtered); kmod_module_unref_list(list); diff --git a/libkmod/libkmod.h b/libkmod/libkmod.h index 04920b7c6..5aa588aab 100644 --- a/libkmod/libkmod.h +++ b/libkmod/libkmod.h @@ -365,6 +365,22 @@ struct kmod_list *kmod_list_prev(const struct kmod_list *list, */ struct kmod_config_iter; +/** + * kmod_config_get_masks: + * @ctx: kmod library context + * + * Retrieve an iterator to deal with the mask list maintained inside the + * library. See kmod_config_iter_get_key(), kmod_config_iter_get_value() and + * kmod_config_iter_next(). At least one call to kmod_config_iter_next() must + * be made to initialize the iterator and check if it's valid. + * + * Returns: a new iterator over the masks or NULL on failure. Free it + * with kmod_config_iter_free_iter(). + * + * Since: 35 + */ +struct kmod_config_iter *kmod_config_get_masks(const struct kmod_ctx *ctx); + /** * kmod_config_get_blacklists: * @ctx: kmod library context @@ -905,12 +921,14 @@ int kmod_module_get_weakdeps(const struct kmod_module *mod, struct kmod_list **w * kmod_filter: * @KMOD_FILTER_BLACKLIST: filter modules in blacklist out * @KMOD_FILTER_BUILTIN: filter builtin modules out + * @KMOD_FILTER_MASK: filter masked modules out * * Bitmask defining what gets filtered out, used by kmod_module_apply_filter(). */ enum kmod_filter { KMOD_FILTER_BLACKLIST = 0x00001, KMOD_FILTER_BUILTIN = 0x00002, + KMOD_FILTER_MASK = 0x00004, }; /** diff --git a/libkmod/libkmod.sym b/libkmod/libkmod.sym index ea1cb4484..01ee7ee44 100644 --- a/libkmod/libkmod.sym +++ b/libkmod/libkmod.sym @@ -105,3 +105,8 @@ global: kmod_config_get_weakdeps; kmod_module_get_weakdeps; } LIBKMOD_30; + +LIBKMOD_35 { +global: + kmod_config_get_masks; +} LIBKMOD_33; diff --git a/man/modprobe.8.scd b/man/modprobe.8.scd index 8a4e0ffb1..1285dfb6d 100644 --- a/man/modprobe.8.scd +++ b/man/modprobe.8.scd @@ -23,7 +23,8 @@ that for convenience, there is no difference between \_ and - in module names directory @MODULE_DIRECTORY@/$(uname -r) for all the modules and other files, except for the optional configuration files (see *modprobe.d*(5)). *modprobe* will also use module options specified on the kernel command line in the form of -.