On Thu, Oct 31, 2024 at 5:00 PM Suren Baghdasaryan <surenb@xxxxxxxxxx> wrote: > > 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> Andrew, I was going to respin v5 of my patchset and include all these small fixes in it but it's a bit tricky because I would have to revert another unrelated patch [1] from mm-unstable which refactors relevant code. So far the fixes are rather small, so I think you should not have much trouble folding them into the original patchset when the time comes, but if that becomes a problem I can prepare a new version. [1] d0d77a256a75 ("mm/codetag: uninline and move pgalloc_tag_copy and pgalloc_tag_split") > --- > 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 >