diff options
author | Andreas Robinson <andr345@gmail.com> | 2009-10-10 16:56:28 +0200 |
---|---|---|
committer | Andreas Robinson <andr345@gmail.com> | 2009-10-10 16:56:28 +0200 |
commit | e58e266fba80e0370d2a5cffbe07adf8f7db383f (patch) | |
tree | f18c0956e3b6217c2ff750ca039062084504319d | |
parent | f2150e81dbeb547f9fc70b8c622c38cc6f987a50 (diff) | |
download | module-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.c | 6 | ||||
-rw-r--r-- | tests/test-modprobe/28softdep.sh | 67 |
2 files changed, 70 insertions, 3 deletions
@@ -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" ] + |