summaryrefslogtreecommitdiff
path: root/tools/objtool/elf.c
diff options
context:
space:
mode:
authorJosh Poimboeuf <jpoimboe@kernel.org>2025-09-17 09:03:22 -0700
committerJosh Poimboeuf <jpoimboe@kernel.org>2025-10-14 14:45:23 -0700
commit9ebb662fab38a5942100e597b48de5ec9d5e714d (patch)
treee83bd2b18317eebcd5de1af10295408907ccfc03 /tools/objtool/elf.c
parent07e1c3fd86d7a2ddce3ebc6b7390590c8524a484 (diff)
downloadlinux-9ebb662fab38a5942100e597b48de5ec9d5e714d.tar.gz
linux-9ebb662fab38a5942100e597b48de5ec9d5e714d.tar.bz2
linux-9ebb662fab38a5942100e597b48de5ec9d5e714d.zip
objtool: Fix broken error handling in read_symbols()
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>
Diffstat (limited to 'tools/objtool/elf.c')
-rw-r--r--tools/objtool/elf.c10
1 files changed, 3 insertions, 7 deletions
diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c
index 1c1bb2cb960d..b009d9feed76 100644
--- a/tools/objtool/elf.c
+++ b/tools/objtool/elf.c
@@ -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)