When a module does not have any allocations, it's allocation tag section is empty and codetag_alloc_module_section() returns NULL. However this condition should never happen because codetag_needs_module_section() will detect an empty section and avoid calling codetag_alloc_module_section(). Change codetag_alloc_module_section() to never return NULL, which should prevent static checker warnings. Add a WARN_ON() and a proper error reporting in case codetag_alloc_module_section() returns NULL, to prevent future codetag type implementations from returning NULL from their cttype->desc.alloc_section_mem() operation. Fixes: 61c9e58f3a10 ("alloc_tag: load module tags into separate contiguous memory") Reported-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx> Closes: https://lore.kernel.org/all/50f12fa1-17c1-4940-a6bf-beaf61f6b17a@stanley.mountain/ Signed-off-by: Suren Baghdasaryan <surenb@xxxxxxxxxx> --- kernel/module/main.c | 4 ++++ lib/alloc_tag.c | 2 +- lib/codetag.c | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/kernel/module/main.c b/kernel/module/main.c index 129c98e6380d..00c16f5c5568 100644 --- a/kernel/module/main.c +++ b/kernel/module/main.c @@ -2316,6 +2316,10 @@ static int move_module(struct module *mod, struct load_info *info) if (codetag_needs_module_section(mod, sname, shdr->sh_size)) { dest = codetag_alloc_module_section(mod, sname, shdr->sh_size, arch_mod_section_prepend(mod, i), shdr->sh_addralign); + if (WARN_ON(!dest)) { + ret = -EINVAL; + goto out_err; + } if (IS_ERR(dest)) { ret = PTR_ERR(dest); goto out_err; diff --git a/lib/alloc_tag.c b/lib/alloc_tag.c index 1c74942e6dfd..00ab18ea452a 100644 --- a/lib/alloc_tag.c +++ b/lib/alloc_tag.c @@ -437,7 +437,7 @@ static void *reserve_module_tags(struct module *mod, unsigned long size, /* If no tags return NULL */ if (size < sizeof(struct alloc_tag)) - return NULL; + return ERR_PTR(-EINVAL); /* * align is always power of 2, so we can use IS_ALIGNED and ALIGN. diff --git a/lib/codetag.c b/lib/codetag.c index 4949511b4933..42aadd6c1454 100644 --- a/lib/codetag.c +++ b/lib/codetag.c @@ -244,7 +244,7 @@ void *codetag_alloc_module_section(struct module *mod, const char *name, { const char *type_name = name + strlen(CODETAG_SECTION_PREFIX); struct codetag_type *cttype; - void *ret = NULL; + void *ret = ERR_PTR(-EINVAL); mutex_lock(&codetag_lock); list_for_each_entry(cttype, &codetag_types, link) { base-commit: 758db9ca0107bc6c00f0ed4808974d66c8dc2fea -- 2.47.0.163.g1226f6d8fa-goog