summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2019-04-28 18:07:03 +0200
committerMark Wielaard <mark@klomp.org>2019-04-28 18:07:51 +0200
commitee7407342e4d4e7ddf97f3a28649ba44ad142550 (patch)
tree296c61718a12d1d276e117e9ed52800cc6b322c4
parent0720b2ca333186b0d3f4a5b73d5ae2bd8fc8cb4b (diff)
unstrip: Robustify gelf_getshdr and gelf_getsymshndx calls.
Signed-off-by: Mark Wielaard <mark@klomp.org>
-rw-r--r--src/ChangeLog6
-rw-r--r--src/unstrip.c4
2 files changed, 10 insertions, 0 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index e3e411ef..ae137932 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,11 @@
2019-04-28 Mark Wielaard <mark@klomp.org>
+ * unstrip.c (add_new_section_symbols): Call ELF_CHECK after
+ gelf_getsymshndx.
+ (new_shstrtab): Call ELF_CHECK after gelf_getshdr.
+
+2019-04-28 Mark Wielaard <mark@klomp.org>
+
* size.c (show_sysv): Call INTERNAL_ERROR if gelf_getshdr
returns NULL.
(show_sysv_one_line): Call error with EXIT_FAILURE if
diff --git a/src/unstrip.c b/src/unstrip.c
index 3495b1d9..fc878325 100644
--- a/src/unstrip.c
+++ b/src/unstrip.c
@@ -644,6 +644,7 @@ add_new_section_symbols (Elf_Scn *old_symscn, size_t old_shnum,
GElf_Word shndx = SHN_UNDEF;
GElf_Sym *sym = gelf_getsymshndx (old_symdata, shndxdata,
i, &sym_mem, &shndx);
+ ELF_CHECK (sym != NULL, _("cannot get symbol table entry: %s"));
ELF_CHECK (gelf_update_symshndx (symdata, shndxdata, i,
sym, shndx),
_("cannot update symbol table: %s"));
@@ -677,6 +678,7 @@ add_new_section_symbols (Elf_Scn *old_symscn, size_t old_shnum,
GElf_Word shndx = SHN_UNDEF;
GElf_Sym *sym = gelf_getsymshndx (old_symdata, shndxdata,
i, &sym_mem, &shndx);
+ ELF_CHECK (sym != NULL, _("cannot get symbol table entry: %s"));
ELF_CHECK (gelf_update_symshndx (symdata, shndxdata,
i + added, sym, shndx),
_("cannot update symbol table: %s"));
@@ -1326,6 +1328,7 @@ new_shstrtab (Elf *unstripped, size_t unstripped_shnum,
Elf_Scn *scn = elf_getscn (unstripped, i + 1);
GElf_Shdr shdr_mem;
GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+ ELF_CHECK (shdr != NULL, _("cannot get section header: %s"));
const char *name = get_section_name (i + 1, shdr, shstrtab);
unstripped_strent[i] = dwelf_strtab_add (strtab, name);
ELF_CHECK (unstripped_strent[i] != NULL,
@@ -1349,6 +1352,7 @@ new_shstrtab (Elf *unstripped, size_t unstripped_shnum,
Elf_Scn *scn = elf_getscn (unstripped, i + 1);
GElf_Shdr shdr_mem;
GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+ ELF_CHECK (shdr != NULL, _("cannot get section header: %s"));
shdr->sh_name = dwelf_strent_off (unstripped_strent[i]);
if (i + 1 == unstripped_shstrndx)
shdr->sh_size = strtab_data->d_size;