X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=kernel%2Fmodule.c;h=b14a4f31221f36bf5af471d7dcfc7935f0f68375;hb=0d6369952d6cac356fe339a4f54b2d359a188c4b;hp=0e5c71195f185c667f875ab54b0ac022eadd519c;hpb=927b5a2bd7e0ca06412cd3536e48b2a89bff0dfc;p=firefly-linux-kernel-4.4.55.git diff --git a/kernel/module.c b/kernel/module.c index 0e5c71195f18..b14a4f31221f 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -2606,13 +2606,18 @@ static inline void kmemleak_load_module(const struct module *mod, #endif #ifdef CONFIG_MODULE_SIG -static int module_sig_check(struct load_info *info) +static int module_sig_check(struct load_info *info, int flags) { int err = -ENOKEY; const unsigned long markerlen = sizeof(MODULE_SIG_STRING) - 1; const void *mod = info->hdr; - if (info->len > markerlen && + /* + * Require flags == 0, as a module with version information + * removed is no longer the module that was signed + */ + if (flags == 0 && + info->len > markerlen && memcmp(mod + info->len - markerlen, MODULE_SIG_STRING, markerlen) == 0) { /* We truncate the module to discard the signature */ info->len -= markerlen; @@ -2631,7 +2636,7 @@ static int module_sig_check(struct load_info *info) return err; } #else /* !CONFIG_MODULE_SIG */ -static int module_sig_check(struct load_info *info) +static int module_sig_check(struct load_info *info, int flags) { return 0; } @@ -3444,7 +3449,7 @@ static int load_module(struct load_info *info, const char __user *uargs, long err; char *after_dashes; - err = module_sig_check(info); + err = module_sig_check(info, flags); if (err) goto free_copy;