]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
objtool: Fix broken error handling in read_symbols()
authorJosh Poimboeuf <jpoimboe@kernel.org>
Wed, 17 Sep 2025 16:03:22 +0000 (09:03 -0700)
committerJosh Poimboeuf <jpoimboe@kernel.org>
Tue, 14 Oct 2025 21:45:23 +0000 (14:45 -0700)
The free(sym) call in the read_symbols() error path is fundamentally
broken: 'sym' doesn't point to any allocated block.  If triggered,
things would go from bad to worse.

Remove the free() and simplify the error paths.  Freeing memory isn't
necessary here anyway, these are fatal errors which lead to an immediate
exit().

Acked-by: Petr Mladek <pmladek@suse.com>
Tested-by: Joe Lawrence <joe.lawrence@redhat.com>
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
tools/objtool/elf.c

index 1c1bb2cb960dae2f88458c0d202e8fc20d9c4ee7..b009d9feed760df746a9974087952929a102e930 100644 (file)
@@ -492,14 +492,14 @@ static int read_symbols(struct elf *elf)
                if (!gelf_getsymshndx(symtab->data, shndx_data, i, &sym->sym,
                                      &shndx)) {
                        ERROR_ELF("gelf_getsymshndx");
-                       goto err;
+                       return -1;
                }
 
                sym->name = elf_strptr(elf->elf, symtab->sh.sh_link,
                                       sym->sym.st_name);
                if (!sym->name) {
                        ERROR_ELF("elf_strptr");
-                       goto err;
+                       return -1;
                }
 
                if ((sym->sym.st_shndx > SHN_UNDEF &&
@@ -511,7 +511,7 @@ static int read_symbols(struct elf *elf)
                        sym->sec = find_section_by_index(elf, shndx);
                        if (!sym->sec) {
                                ERROR("couldn't find section for symbol %s", sym->name);
-                               goto err;
+                               return -1;
                        }
                        if (GELF_ST_TYPE(sym->sym.st_info) == STT_SECTION) {
                                sym->name = sym->sec->name;
@@ -581,10 +581,6 @@ static int read_symbols(struct elf *elf)
        }
 
        return 0;
-
-err:
-       free(sym);
-       return -1;
 }
 
 static int mark_group_syms(struct elf *elf)