aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Robinson <andr345@gmail.com>2009-10-10 16:56:28 +0200
committerAndreas Robinson <andr345@gmail.com>2009-10-10 16:56:28 +0200
commite58e266fba80e0370d2a5cffbe07adf8f7db383f (patch)
treef18c0956e3b6217c2ff750ca039062084504319d
parentf2150e81dbeb547f9fc70b8c622c38cc6f987a50 (diff)
downloadmodule-init-tools-e58e266fba80e0370d2a5cffbe07adf8f7db383f.tar.gz
test: add softdep test, modprobe: fix simple bugs in do_softdep
Signed-off-by: Andreas Robinson <andr345@gmail.com>
-rw-r--r--modprobe.c6
-rw-r--r--tests/test-modprobe/28softdep.sh67
2 files changed, 70 insertions, 3 deletions
diff --git a/modprobe.c b/modprobe.c
index 317a109..a7811c4 100644
--- a/modprobe.c
+++ b/modprobe.c
@@ -1193,7 +1193,7 @@ static void do_softdep(const struct module_softdep *softdep,
/* Modprobe pre_modnames */
- for (i = 0; i < pre_modnames->cnt; i++) {
+ for (i = 0; pre_modnames && i < pre_modnames->cnt; i++) {
/* Reverse module order if removing. */
j = (flags & mit_remove) ? pre_modnames->cnt-1 - i : i;
@@ -1208,11 +1208,11 @@ static void do_softdep(const struct module_softdep *softdep,
/* Modprobe post_modnames */
- for (i = 0; i < post_modnames->cnt; i++) {
+ for (i = 0; post_modnames && i < post_modnames->cnt; i++) {
/* Reverse module order if removing. */
j = (flags & mit_remove) ? post_modnames->cnt-1 - i : i;
- do_modprobe(pre_modnames->str[j], NULL, "", configname,
+ do_modprobe(post_modnames->str[j], NULL, "", configname,
dirname, warn, flags);
}
}
diff --git a/tests/test-modprobe/28softdep.sh b/tests/test-modprobe/28softdep.sh
new file mode 100644
index 0000000..d999872
--- /dev/null
+++ b/tests/test-modprobe/28softdep.sh
@@ -0,0 +1,67 @@
+#! /bin/sh
+
+BITNESS=32
+
+rm -rf tests/tmp/*
+
+MODULE_DIR=tests/tmp/lib/modules/$MODTEST_UNAME
+
+# Set up modules
+mkdir -p $MODULE_DIR
+ln tests/data/$BITNESS/normal/noexport_nodep-$BITNESS.ko $MODULE_DIR/a.ko
+ln -s a.ko $MODULE_DIR/b.ko
+ln -s a.ko $MODULE_DIR/c.ko
+ln -s a.ko $MODULE_DIR/d.ko
+ln -s a.ko $MODULE_DIR/e.ko
+ln -s a.ko $MODULE_DIR/f.ko
+
+# Set up dependencies
+cat > $MODULE_DIR/modules.dep << EOF
+/lib/modules/$MODTEST_UNAME/a.ko:
+/lib/modules/$MODTEST_UNAME/b.ko:
+/lib/modules/$MODTEST_UNAME/c.ko:
+/lib/modules/$MODTEST_UNAME/d.ko:
+/lib/modules/$MODTEST_UNAME/e.ko:
+/lib/modules/$MODTEST_UNAME/f.ko:
+EOF
+
+# Test softdeps
+
+mkdir -p tests/tmp/etc/modprobe.d
+cat > tests/tmp/etc/modprobe.d/modprobe.conf << EOF
+alias a_alias a
+alias c_alias c
+softdep c --pre a_alias b --post d e
+softdep e --post f
+softdep f --pre a
+EOF
+
+# Insert-test
+
+R1=`modprobe -v c_alias 2>&1 | \
+ grep -v INIT_MODULE\: | \
+ sed -e "s/\/lib\/modules\/$MODTEST_UNAME\///g"`
+R2=`echo $R1` # remove newlines
+[ "$R2" = "insmod a.ko insmod b.ko insmod c.ko insmod d.ko insmod e.ko insmod a.ko insmod f.ko" ]
+
+# Remove-test
+
+R1=`modprobe -v -r c_alias 2>&1 | \
+ grep -v DELETE_MODULE\: | \
+ sed -e "s/\/lib\/modules\/$MODTEST_UNAME\///g"`
+R2=`echo $R1` # remove newlines
+[ "$R2" = "rmmod f.ko rmmod a.ko rmmod e.ko rmmod d.ko rmmod c.ko rmmod b.ko rmmod a.ko" ]
+
+# Test loop detector
+
+mkdir -p tests/tmp/etc/modprobe.d
+cat > tests/tmp/etc/modprobe.d/modprobe.conf << EOF
+alias a_alias a
+softdep a --pre b
+softdep b --pre a
+EOF
+
+R1=`modprobe -v a_alias 2>&1 | cat` # shell won't assign to R1 without no-op cat.
+# This comparison will fail if MAX_RECURSION is odd. In that case: s/b/a/g
+[ "$R1" = "FATAL: modprobe: softdep dependency loop encountered inserting b" ]
+