From aa4f8d04a967e889838211e00b9ba7fc0c07846f Mon Sep 17 00:00:00 2001 From: Vlad Tsyrklevich Date: Tue, 23 Jul 2019 15:02:13 +0000 Subject: [PATCH] Revert "[Object/ELF.h] - Improve testing of the fields in ELFFile::sections()." This reverts commit r366796 because it was causing ubsan buildbot failures. llvm-svn: 366815 --- llvm/include/llvm/Object/ELF.h | 13 ++------ llvm/include/llvm/ObjectYAML/ELFYAML.h | 2 +- llvm/test/Object/invalid.test | 55 ---------------------------------- llvm/tools/yaml2obj/yaml2elf.cpp | 2 +- 4 files changed, 5 insertions(+), 67 deletions(-) diff --git a/llvm/include/llvm/Object/ELF.h b/llvm/include/llvm/Object/ELF.h index 83823af..cf8e452 100644 --- a/llvm/include/llvm/Object/ELF.h +++ b/llvm/include/llvm/Object/ELF.h @@ -513,22 +513,15 @@ Expected ELFFile::sections() const { NumSections = First->sh_size; if (NumSections > UINT64_MAX / sizeof(Elf_Shdr)) - return createError("invalid number of sections specified in the NULL " - "section's sh_size field (" + - Twine(NumSections) + ")"); + // TODO: this error is untested. + return createError("section table goes past the end of file"); const uint64_t SectionTableSize = NumSections * sizeof(Elf_Shdr); - if (SectionTableOffset + SectionTableSize < SectionTableOffset) - return createError( - "invalid section header table offset (e_shoff = 0x" + - Twine::utohexstr(SectionTableOffset) + - ") or invalid number of sections specified in the first section " - "header's sh_size field (0x" + - Twine::utohexstr(NumSections) + ")"); // Section table goes past end of file! if (SectionTableOffset + SectionTableSize > FileSize) return createError("section table goes past the end of file"); + return makeArrayRef(First, NumSections); } diff --git a/llvm/include/llvm/ObjectYAML/ELFYAML.h b/llvm/include/llvm/ObjectYAML/ELFYAML.h index 89c0c58..f03c405 100644 --- a/llvm/include/llvm/ObjectYAML/ELFYAML.h +++ b/llvm/include/llvm/ObjectYAML/ELFYAML.h @@ -77,7 +77,7 @@ struct FileHeader { llvm::yaml::Hex64 Entry; Optional SHEntSize; - Optional SHOffset; + Optional SHOffset; Optional SHNum; Optional SHStrNdx; }; diff --git a/llvm/test/Object/invalid.test b/llvm/test/Object/invalid.test index 77e6d0b..5723c4a 100644 --- a/llvm/test/Object/invalid.test +++ b/llvm/test/Object/invalid.test @@ -552,58 +552,3 @@ FileHeader: Sections: - Name: .foo Type: SHT_PROGBITS - -## We report an error if the number of sections stored in sh_size -## is greater than UINT64_MAX / sizeof(Elf_Shdr) == 288230376151711743. -## Here we check that do not crash on a border value. - -# RUN: yaml2obj --docnum=26 %s -o %t26 -# RUN: not llvm-readobj -h %t26 2>&1 | FileCheck -DFILE=%t26 --check-prefix=INVALID-SEC-NUM1 %s - -# INVALID-SEC-NUM1: error: '[[FILE]]': invalid section header table offset (e_shoff = 0x40) or invalid number of sections specified in the first section header's sh_size field (0x3ffffffffffffff) - ---- !ELF -FileHeader: - Class: ELFCLASS64 - Data: ELFDATA2LSB - Type: ET_REL - Machine: EM_X86_64 - SHNum: 0x0 -Sections: - - Type: SHT_NULL - Size: 288230376151711743 - -## See above, but now we test the UINT64_MAX / sizeof(Elf_Shdr) value. -## The error is slightly different in this case. - -# RUN: yaml2obj --docnum=27 %s -o %t27 -# RUN: not llvm-readobj -h %t27 2>&1 | FileCheck -DFILE=%t27 --check-prefix=INVALID-SEC-NUM2 %s - -# INVALID-SEC-NUM2: error: '[[FILE]]': invalid number of sections specified in the NULL section's sh_size field (288230376151711744) - ---- !ELF -FileHeader: - Class: ELFCLASS64 - Data: ELFDATA2LSB - Type: ET_REL - Machine: EM_X86_64 - SHNum: 0x0 -Sections: - - Type: SHT_NULL - Size: 288230376151711744 - -## Check the case when SHOffset is too large, but SHNum is not. SHOffset + SHNum overflows the uint64 type. - -# RUN: yaml2obj --docnum=28 %s -o %t28 -# RUN: not llvm-readobj -h %t28 2>&1 | FileCheck -DFILE=%t28 --check-prefix=INVALID-SEC-NUM3 %s - -# INVALID-SEC-NUM3: error: '[[FILE]]': invalid section header table offset (e_shoff = 0xffffffffffffffff) or invalid number of sections specified in the first section header's sh_size field (0x1) - ---- !ELF -FileHeader: - Class: ELFCLASS64 - Data: ELFDATA2LSB - Type: ET_REL - Machine: EM_X86_64 - SHOffset: 0xffffffffffffffff - SHNum: 0x1 diff --git a/llvm/tools/yaml2obj/yaml2elf.cpp b/llvm/tools/yaml2obj/yaml2elf.cpp index c6be508..f3a8a91 100644 --- a/llvm/tools/yaml2obj/yaml2elf.cpp +++ b/llvm/tools/yaml2obj/yaml2elf.cpp @@ -244,7 +244,7 @@ void ELFState::initELFHeader(Elf_Ehdr &Header) { // Immediately following the ELF header and program headers. Header.e_shoff = Doc.Header.SHOffset - ? (typename ELFT::uint)(*Doc.Header.SHOffset) + ? (uint16_t)*Doc.Header.SHOffset : sizeof(Header) + sizeof(Elf_Phdr) * Doc.ProgramHeaders.size(); Header.e_shnum = Doc.Header.SHNum ? (uint16_t)*Doc.Header.SHNum : SN2I.size() + 1; -- 2.7.4