Commit 91e37a793b5a9436a2d12b2f0a8f52db3a133e1d

Authored by Rusty Russell
Committed by Linus Torvalds
1 parent a5dd697074

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>

Showing 2 changed files with 13 additions and 9 deletions Side-by-side Diff

... ... @@ -845,9 +845,9 @@
845 845 depends on MODULES
846 846 default n
847 847 help
848   - This option allows loading of modules even if that would set the
849   - 'F' (forced) taint, due to lack of version info. Which is
850   - usually a really bad idea.
  848 + Allow loading of modules without version information (ie. modprobe
  849 + --force). Forced module loading sets the 'F' (forced) taint flag and
  850 + is usually a really bad idea.
851 851  
852 852 config MODULE_UNLOAD
853 853 bool "Module unloading"
... ... @@ -957,11 +957,14 @@
957 957 return check_version(sechdrs, versindex, "struct_module", mod, crc);
958 958 }
959 959  
960   -/* First part is kernel version, which we ignore. */
961   -static inline int same_magic(const char *amagic, const char *bmagic)
  960 +/* First part is kernel version, which we ignore if module has crcs. */
  961 +static inline int same_magic(const char *amagic, const char *bmagic,
  962 + bool has_crcs)
962 963 {
963   - amagic += strcspn(amagic, " ");
964   - bmagic += strcspn(bmagic, " ");
  964 + if (has_crcs) {
  965 + amagic += strcspn(amagic, " ");
  966 + bmagic += strcspn(bmagic, " ");
  967 + }
965 968 return strcmp(amagic, bmagic) == 0;
966 969 }
967 970 #else
... ... @@ -981,7 +984,8 @@
981 984 return 1;
982 985 }
983 986  
984   -static inline int same_magic(const char *amagic, const char *bmagic)
  987 +static inline int same_magic(const char *amagic, const char *bmagic,
  988 + bool has_crcs)
985 989 {
986 990 return strcmp(amagic, bmagic) == 0;
987 991 }
... ... @@ -1874,7 +1878,7 @@
1874 1878 err = try_to_force_load(mod, "magic");
1875 1879 if (err)
1876 1880 goto free_hdr;
1877   - } else if (!same_magic(modmagic, vermagic)) {
  1881 + } else if (!same_magic(modmagic, vermagic, versindex)) {
1878 1882 printk(KERN_ERR "%s: version magic '%s' should be '%s'\n",
1879 1883 mod->name, modmagic, vermagic);
1880 1884 err = -ENOEXEC;