[llvm-readelf] - Don't crash when e_shstrndx==SHN_XINDEX, but there is no section header.

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.

Differential revision: https://reviews.llvm.org/D82374
This commit is contained in:
Georgii Rymar 2020-06-23 15:55:17 +03:00
parent 72131423cc
commit 31fe8c2763
2 changed files with 25 additions and 5 deletions

View File

@ -516,8 +516,17 @@ Expected<StringRef>
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 the actual index of the section name
// string table section is contained in the sh_link field of the section
// header at index 0.
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 "";

View File

@ -34,13 +34,24 @@ Sections:
# 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: