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 1c1bb2c..b009d9f 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)