From 7f264063f04f9b02e4c3636868e764f8657e27a4 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 1/3] 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 --- 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/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 .../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 | 77 ++++++++++++++++++ 43 files changed, 120 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/mask.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 2e021648..fcfddcf0 100755 --- a/scripts/setup-rootfs.sh +++ b/scripts/setup-rootfs.sh @@ -102,6 +102,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 00000000..6c8daa5a --- /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 00000000..ba76e181 --- /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 00000000..e69de29b 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 00000000..eac8ce34 --- /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 00000000..9d1ecaba --- /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 00000000..ba76e181 --- /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 00000000..e69de29b 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 00000000..54766537 --- /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 00000000..58f6d6d6 --- /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 00000000..5554ccca --- /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 00000000..618c345f --- /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/mask.conf b/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/etc/modprobe.d/mask.conf new file mode 100644 index 00000000..760a761a --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/blacklist-softdep/etc/modprobe.d/mask.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 00000000..ba76e181 --- /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 00000000..e69de29b 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 00000000..3e721e15 --- /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 00000000..58f6d6d6 --- /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 00000000..5554ccca --- /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 00000000..8fdc29ac --- /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 00000000..e69de29b 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 00000000..54766537 --- /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 00000000..58f6d6d6 --- /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 00000000..5554ccca --- /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 00000000..618c345f --- /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 00000000..e69de29b diff --git a/testsuite/test-modprobe.c b/testsuite/test-modprobe.c index 92b1dc50..76c8416b 100644 --- a/testsuite/test-modprobe.c +++ b/testsuite/test-modprobe.c @@ -409,4 +409,81 @@ DEFINE_TEST(modprobe_module_from_relpath, .modules_loaded = "mod-simple", ); +static noreturn int modprobe_blacklisted_by_alias(const struct test *t) +{ + EXEC_MODPROBE("simple.abc"); + exit(EXIT_FAILURE); +} +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 noreturn int modprobe_blacklisted_by_name(const struct test *t) +{ + EXEC_MODPROBE("mod-simple"); + exit(EXIT_FAILURE); +} +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 noreturn int modprobe_blacklisted_by_name_filtered(const struct test *t) +{ + EXEC_MODPROBE("-b", "mod-simple"); + exit(EXIT_FAILURE); +} +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 noreturn int modprobe_blacklisted_dependency(const struct test *t) +{ + EXEC_MODPROBE("-b", "mod-foo"); + exit(EXIT_FAILURE); +} +DEFINE_TEST(modprobe_blacklisted_dependency, + .description = "check if modprobe -b dependant 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 noreturn int modprobe_blacklisted_softdep(const struct test *t) +{ + EXEC_MODPROBE("-b", "mod-simple"); + exit(EXIT_FAILURE); +} +DEFINE_TEST(modprobe_blacklisted_softdep, + .description = "check if modprobe -b dependant 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 304bba04af7fc5f3df91b3591f911e140833aaf8 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 2/3] 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 --- 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 7bf37bba..bfc9c6f6 100644 --- a/libkmod/libkmod-module.c +++ b/libkmod/libkmod-module.c @@ -1040,10 +1040,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 d8d5d516d0b983a3f037ef4a0177334296a0127f Mon Sep 17 00:00:00 2001 From: Dawid Osuchowski Date: Fri, 20 Jun 2025 17:59:11 +0200 Subject: [PATCH 3/3] 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. 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 | 52 ++++++++++- 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 | 8 ++ .../module-param-kcmdline10/proc/cmdline | 1 + testsuite/test-modprobe.c | 86 ++++++++++++++---- tools/modprobe.c | 1 + 35 files changed, 244 insertions(+), 25 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 674fe3a5..c4f9810e 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 dd502647..aa899037 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 9ca9d2f2..073ce63f 100644 --- a/libkmod/libkmod-config.c +++ b/libkmod/libkmod-config.c @@ -50,6 +50,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; @@ -231,6 +236,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) { @@ -606,18 +632,24 @@ 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) break; - 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) { @@ -823,6 +855,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); @@ -872,6 +911,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); @@ -1094,6 +1134,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, @@ -1144,6 +1185,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; @@ -1194,6 +1239,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 547b8369..1e24df30 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 bfc9c6f6..f166da3c 100644 --- a/libkmod/libkmod-module.c +++ b/libkmod/libkmod-module.c @@ -734,12 +734,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; @@ -758,9 +776,20 @@ 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); @@ -771,7 +800,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) @@ -1005,7 +1034,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; @@ -1019,6 +1048,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; @@ -1035,9 +1069,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 1c0d1185..f460d520 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 ea1cb448..01ee7ee4 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 aaf04c34..c6482109 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 @DISTCONFDIR@/`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 -.