[PATCH] D82374: [llvm-readelf] - Don't crash when e_shstrndx=SHN_XINDEX, but there is no section header.
George Rimar via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 23 06:21:53 PDT 2020
grimar created this revision.
grimar added reviewers: jhenderson, MaskRay.
Herald added subscribers: rupprecht, arphaman, emaste.
Herald added a reviewer: espindola.
Herald added a project: LLVM.
Currently we crash when trying to print --sections and the SHN_XINDEX escape value
is used for the e_shstrndx field, but there is no section header at index 0 to
read the value from.
https://reviews.llvm.org/D82374
Files:
llvm/include/llvm/Object/ELF.h
llvm/test/tools/llvm-readobj/ELF/many-sections.s
Index: llvm/test/tools/llvm-readobj/ELF/many-sections.s
===================================================================
--- llvm/test/tools/llvm-readobj/ELF/many-sections.s
+++ llvm/test/tools/llvm-readobj/ELF/many-sections.s
@@ -34,13 +34,24 @@
# RUN: yaml2obj --docnum=2 %s -o %t2
-# RUN: llvm-readelf --file-headers %t2 | FileCheck %s --check-prefix=GNU2
+# RUN: not llvm-readelf --file-headers --sections %t2 2>&1 | \
+# RUN: FileCheck %s -DFILE=%t2 --check-prefix=GNU2
# GNU2: Number of section headers: 0
# GNU2: Section header string table index: 65535 (corrupt: out of range)
-# RUN: llvm-readobj --file-headers %t2 | FileCheck %s --check-prefix=LLVM2
-# LLVM2: SectionHeaderCount: 0
-# LLVM2: StringTableSectionIndex: 65535 (corrupt: out of range)
+# GNU2: There are 0 section headers, starting at offset 0x0:
+# GNU2-EMPTY:
+# GNU2-NEXT: Section Headers:
+# GNU2-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al
+# GNU2-NEXT: error: '[[FILE]]': e_shstrndx = SHN_XINDEX, but the section header table is empty
+
+# RUN: llvm-readobj --file-headers --sections %t2 | \
+# RUN: FileCheck %s --check-prefix=LLVM2 --implicit-check-not="warning:"
+# LLVM2: SectionHeaderCount: 0
+# LLVM2: StringTableSectionIndex: 65535 (corrupt: out of range)
+# LLVM2-NEXT: }
+# LLVM2-NEXT: Sections [
+# LLVM2-NEXT: ]
--- !ELF
FileHeader:
Index: llvm/include/llvm/Object/ELF.h
===================================================================
--- llvm/include/llvm/Object/ELF.h
+++ llvm/include/llvm/Object/ELF.h
@@ -516,8 +516,17 @@
ELFFile<ELFT>::getSectionStringTable(Elf_Shdr_Range Sections,
WarningHandler WarnHandler) const {
uint32_t Index = getHeader()->e_shstrndx;
- if (Index == ELF::SHN_XINDEX)
+ if (Index == ELF::SHN_XINDEX) {
+ // If the section name string table section index is greater than or equal
+ // to SHN_LORESERVE, then e_shstrndx field should have the value of
+ // SHN_XINDEX and sh_link of the section header at index 0 is used to store
+ // the value.
+ if (Sections.empty())
+ return createError(
+ "e_shstrndx = SHN_XINDEX, but the section header table is empty");
+
Index = Sections[0].sh_link;
+ }
if (!Index) // no section string table.
return "";
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D82374.272698.patch
Type: text/x-patch
Size: 2319 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200623/1d944bb9/attachment.bin>
More information about the llvm-commits
mailing list