aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/module.c
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2008-05-09 02:25:28 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-05-09 10:45:18 -0400
commit91e37a793b5a9436a2d12b2f0a8f52db3a133e1d (patch)
tree6ddf17ad786fa2a42ef79aa4f7873c79c1e17a89 /kernel/module.c
parenta5dd69707424a35d2d2cc094e870f595ad61e916 (diff)
module: don't ignore vermagic string if module doesn't have modversions
Linus found a logic bug: we ignore the version number in a module's vermagic string if we have CONFIG_MODVERSIONS set, but modversions also lets through a module with no __versions section for modprobe --force (with tainting, but still). We should only ignore the start of the vermagic string if the module actually *has* crcs to check. Rather than (say) having an entertaining hissy fit and creating a config option to work around the buggy code. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/module.c')
-rw-r--r--kernel/module.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/kernel/module.c b/kernel/module.c
index 2584c0e2762d..f5e9491ef7ac 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -957,11 +957,14 @@ static inline int check_modstruct_version(Elf_Shdr *sechdrs,
957 return check_version(sechdrs, versindex, "struct_module", mod, crc); 957 return check_version(sechdrs, versindex, "struct_module", mod, crc);
958} 958}
959 959
960/* First part is kernel version, which we ignore. */ 960/* First part is kernel version, which we ignore if module has crcs. */
961static inline int same_magic(const char *amagic, const char *bmagic) 961static inline int same_magic(const char *amagic, const char *bmagic,
962 bool has_crcs)
962{ 963{
963 amagic += strcspn(amagic, " "); 964 if (has_crcs) {
964 bmagic += strcspn(bmagic, " "); 965 amagic += strcspn(amagic, " ");
966 bmagic += strcspn(bmagic, " ");
967 }
965 return strcmp(amagic, bmagic) == 0; 968 return strcmp(amagic, bmagic) == 0;
966} 969}
967#else 970#else
@@ -981,7 +984,8 @@ static inline int check_modstruct_version(Elf_Shdr *sechdrs,
981 return 1; 984 return 1;
982} 985}
983 986
984static inline int same_magic(const char *amagic, const char *bmagic) 987static inline int same_magic(const char *amagic, const char *bmagic,
988 bool has_crcs)
985{ 989{
986 return strcmp(amagic, bmagic) == 0; 990 return strcmp(amagic, bmagic) == 0;
987} 991}
@@ -1874,7 +1878,7 @@ static struct module *load_module(void __user *umod,
1874 err = try_to_force_load(mod, "magic"); 1878 err = try_to_force_load(mod, "magic");
1875 if (err) 1879 if (err)
1876 goto free_hdr; 1880 goto free_hdr;
1877 } else if (!same_magic(modmagic, vermagic)) { 1881 } else if (!same_magic(modmagic, vermagic, versindex)) {
1878 printk(KERN_ERR "%s: version magic '%s' should be '%s'\n", 1882 printk(KERN_ERR "%s: version magic '%s' should be '%s'\n",
1879 mod->name, modmagic, vermagic); 1883 mod->name, modmagic, vermagic);
1880 err = -ENOEXEC; 1884 err = -ENOEXEC;