[llvm] r241109 - Remove Elf_Shdr_Iter. Diagnose files with invalid section header sizes.

Sean Silva chisophugis at gmail.com
Tue Jun 30 20:28:39 PDT 2015


On Tue, Jun 30, 2015 at 12:58 PM, Rafael Espindola <
rafael.espindola at gmail.com> wrote:

> Author: rafael
> Date: Tue Jun 30 14:58:10 2015
> New Revision: 241109
>
> URL: http://llvm.org/viewvc/llvm-project?rev=241109&view=rev
> Log:
> Remove Elf_Shdr_Iter. Diagnose files with invalid section header sizes.
>
> Added:
>     llvm/trunk/test/Object/Inputs/invalid-section-size.elf
> Modified:
>     llvm/trunk/include/llvm/Object/ELF.h
>     llvm/trunk/include/llvm/Object/ELFObjectFile.h
>     llvm/trunk/test/Object/invalid.test
>     llvm/trunk/tools/llvm-readobj/ARMEHABIPrinter.h
>
> Modified: llvm/trunk/include/llvm/Object/ELF.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ELF.h?rev=241109&r1=241108&r2=241109&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/ELF.h (original)
> +++ llvm/trunk/include/llvm/Object/ELF.h Tue Jun 30 14:58:10 2015
> @@ -143,8 +143,7 @@ public:
>    typedef iterator_range<Elf_Dyn_Iter> Elf_Dyn_Range;
>    typedef ELFEntityIterator<const Elf_Rela> Elf_Rela_Iter;
>    typedef ELFEntityIterator<const Elf_Rel> Elf_Rel_Iter;
> -  typedef ELFEntityIterator<const Elf_Shdr> Elf_Shdr_Iter;
> -  typedef iterator_range<Elf_Shdr_Iter> Elf_Shdr_Range;
> +  typedef iterator_range<const Elf_Shdr *> Elf_Shdr_Range;
>
>    /// \brief Archive files are 2 byte aligned, so we need this for
>    ///     PointerIntPair to work.
> @@ -264,8 +263,8 @@ public:
>        Header->getDataEncoding() == ELF::ELFDATA2LSB;
>    }
>
> -  Elf_Shdr_Iter section_begin() const;
> -  Elf_Shdr_Iter section_end() const;
> +  const Elf_Shdr *section_begin() const;
> +  const Elf_Shdr *section_end() const;
>    Elf_Shdr_Range sections() const {
>      return make_range(section_begin(), section_end());
>    }
> @@ -751,16 +750,15 @@ uint64_t ELFFile<ELFT>::getSymbolIndex(c
>  }
>
>  template <class ELFT>
> -typename ELFFile<ELFT>::Elf_Shdr_Iter ELFFile<ELFT>::section_begin()
> const {
> -  return Elf_Shdr_Iter(Header->e_shentsize,
> -                       (const char *)base() + Header->e_shoff);
> +const typename ELFFile<ELFT>::Elf_Shdr *ELFFile<ELFT>::section_begin()
> const {
> +  if (Header->e_shentsize != sizeof(Elf_Shdr))
> +    report_fatal_error("Invalid section header size");
> +  return reinterpret_cast<const Elf_Shdr *>(base() + Header->e_shoff);
>  }
>
>  template <class ELFT>
> -typename ELFFile<ELFT>::Elf_Shdr_Iter ELFFile<ELFT>::section_end() const {
> -  return Elf_Shdr_Iter(Header->e_shentsize,
> -                       (const char *)base() + Header->e_shoff +
> -                           (getNumSections() * Header->e_shentsize));
> +const typename ELFFile<ELFT>::Elf_Shdr *ELFFile<ELFT>::section_end()
> const {
> +  return section_begin() + getNumSections();
>  }
>
>  template <class ELFT>
>
> Modified: llvm/trunk/include/llvm/Object/ELFObjectFile.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ELFObjectFile.h?rev=241109&r1=241108&r2=241109&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/ELFObjectFile.h (original)
> +++ llvm/trunk/include/llvm/Object/ELFObjectFile.h Tue Jun 30 14:58:10 2015
> @@ -189,7 +189,6 @@ public:
>    typedef typename ELFFile<ELFT>::Elf_Rela Elf_Rela;
>    typedef typename ELFFile<ELFT>::Elf_Dyn Elf_Dyn;
>
> -  typedef typename ELFFile<ELFT>::Elf_Shdr_Iter Elf_Shdr_Iter;
>    typedef typename ELFFile<ELFT>::Elf_Dyn_Iter Elf_Dyn_Iter;
>
>  protected:
> @@ -261,15 +260,8 @@ protected:
>      return DRI;
>    }
>
> -  Elf_Shdr_Iter toELFShdrIter(DataRefImpl Sec) const {
> -    return Elf_Shdr_Iter(EF.getHeader()->e_shentsize,
> -                         reinterpret_cast<const char *>(Sec.p));
> -  }
> -
> -  DataRefImpl toDRI(Elf_Shdr_Iter Sec) const {
> -    DataRefImpl DRI;
> -    DRI.p = reinterpret_cast<uintptr_t>(Sec.get());
> -    return DRI;
> +  const Elf_Shdr *toELFShdrIter(DataRefImpl Sec) const {
> +    return reinterpret_cast<const Elf_Shdr *>(Sec.p);
>    }
>
>    DataRefImpl toDRI(const Elf_Shdr *Sec) const {
> @@ -541,7 +533,8 @@ ELFObjectFile<ELFT>::getSymbolSection(Da
>
>  template <class ELFT>
>  void ELFObjectFile<ELFT>::moveSectionNext(DataRefImpl &Sec) const {
> -  Sec = toDRI(++toELFShdrIter(Sec));
> +  const Elf_Shdr *ESec = toELFShdrIter(Sec);
> +  Sec = toDRI(++ESec);
>  }
>
>  template <class ELFT>
> @@ -568,7 +561,7 @@ template <class ELFT>
>  std::error_code
>  ELFObjectFile<ELFT>::getSectionContents(DataRefImpl Sec,
>                                          StringRef &Result) const {
> -  Elf_Shdr_Iter EShdr = toELFShdrIter(Sec);
> +  const Elf_Shdr *EShdr = toELFShdrIter(Sec);
>    Result = StringRef((const char *)base() + EShdr->sh_offset,
> EShdr->sh_size);
>    return std::error_code();
>  }
> @@ -585,14 +578,14 @@ bool ELFObjectFile<ELFT>::isSectionText(
>
>  template <class ELFT>
>  bool ELFObjectFile<ELFT>::isSectionData(DataRefImpl Sec) const {
> -  Elf_Shdr_Iter EShdr = toELFShdrIter(Sec);
> +  const Elf_Shdr *EShdr = toELFShdrIter(Sec);
>    return EShdr->sh_flags & (ELF::SHF_ALLOC | ELF::SHF_WRITE) &&
>           EShdr->sh_type == ELF::SHT_PROGBITS;
>  }
>
>  template <class ELFT>
>  bool ELFObjectFile<ELFT>::isSectionBSS(DataRefImpl Sec) const {
> -  Elf_Shdr_Iter EShdr = toELFShdrIter(Sec);
> +  const Elf_Shdr *EShdr = toELFShdrIter(Sec);
>    return EShdr->sh_flags & (ELF::SHF_ALLOC | ELF::SHF_WRITE) &&
>           EShdr->sh_type == ELF::SHT_NOBITS;
>  }
> @@ -617,7 +610,7 @@ template <class ELFT>
>  relocation_iterator
>  ELFObjectFile<ELFT>::section_rel_begin(DataRefImpl Sec) const {
>    DataRefImpl RelData;
> -  uintptr_t SHT = reinterpret_cast<uintptr_t>(EF.section_begin().get());
> +  uintptr_t SHT = reinterpret_cast<uintptr_t>(EF.section_begin());
>    RelData.d.a = (Sec.p - SHT) / EF.getHeader()->e_shentsize;
>    RelData.d.b = 0;
>    return relocation_iterator(RelocationRef(RelData, this));
> @@ -627,7 +620,7 @@ template <class ELFT>
>  relocation_iterator
>  ELFObjectFile<ELFT>::section_rel_end(DataRefImpl Sec) const {
>    DataRefImpl RelData;
> -  uintptr_t SHT = reinterpret_cast<uintptr_t>(EF.section_begin().get());
> +  uintptr_t SHT = reinterpret_cast<uintptr_t>(EF.section_begin());
>    const Elf_Shdr *S = reinterpret_cast<const Elf_Shdr *>(Sec.p);
>    RelData.d.a = (Sec.p - SHT) / EF.getHeader()->e_shentsize;
>    if (S->sh_type != ELF::SHT_RELA && S->sh_type != ELF::SHT_REL)
> @@ -644,7 +637,7 @@ ELFObjectFile<ELFT>::getRelocatedSection
>    if (EF.getHeader()->e_type != ELF::ET_REL)
>      return section_end();
>
> -  Elf_Shdr_Iter EShdr = toELFShdrIter(Sec);
> +  const Elf_Shdr *EShdr = toELFShdrIter(Sec);
>    uintX_t Type = EShdr->sh_type;
>    if (Type != ELF::SHT_REL && Type != ELF::SHT_RELA)
>      return section_end();
>
> Added: llvm/trunk/test/Object/Inputs/invalid-section-size.elf
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/invalid-section-size.elf?rev=241109&view=auto
>
> ==============================================================================
> Binary files llvm/trunk/test/Object/Inputs/invalid-section-size.elf
> (added) and llvm/trunk/test/Object/Inputs/invalid-section-size.elf Tue Jun
> 30 14:58:10 2015 differ
>
> Modified: llvm/trunk/test/Object/invalid.test
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/invalid.test?rev=241109&r1=241108&r2=241109&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/Object/invalid.test (original)
> +++ llvm/trunk/test/Object/invalid.test Tue Jun 30 14:58:10 2015
> @@ -41,3 +41,6 @@ INVALID-SYM-SIZE: Invalid symbol size
>  RUN: not llvm-readobj -t %p/Inputs/invalid-section-index.elf 2>&1 |
> FileCheck --check-prefix=INVALID-SECTION-INDEX %s
>
>  INVALID-SECTION-INDEX: Invalid section index!
> +
> +RUN: not llvm-readobj -s %p/Inputs/invalid-section-size.elf 2>&1 |
> FileCheck --check-prefix=INVALID-SECTION-SIZE %s
> +INVALID-SECTION-SIZE: Invalid section header size
>

Wording suggestion: "Invalid section header entry size (e_shentsize) in ELF
header". The current wording makes it sound like section headers vary in
size and we happen to have found one of an invalid size.

-- Sean Silva


>
> Modified: llvm/trunk/tools/llvm-readobj/ARMEHABIPrinter.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/ARMEHABIPrinter.h?rev=241109&r1=241108&r2=241109&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-readobj/ARMEHABIPrinter.h (original)
> +++ llvm/trunk/tools/llvm-readobj/ARMEHABIPrinter.h Tue Jun 30 14:58:10
> 2015
> @@ -312,7 +312,6 @@ class PrinterContext {
>    typedef typename object::ELFFile<ET>::Elf_Shdr Elf_Shdr;
>
>    typedef typename object::ELFFile<ET>::Elf_Rel_Iter Elf_Rel_iterator;
> -  typedef typename object::ELFFile<ET>::Elf_Shdr_Iter Elf_Shdr_iterator;
>
>    static const size_t IndexTableEntrySize;
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150630/44a205f2/attachment.html>


More information about the llvm-commits mailing list