<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jun 30, 2015 at 12:58 PM, Rafael Espindola <span dir="ltr"><<a href="mailto:rafael.espindola@gmail.com" target="_blank">rafael.espindola@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: rafael<br>
Date: Tue Jun 30 14:58:10 2015<br>
New Revision: 241109<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D241109-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tLdM-9Gbk30-365bi9o-fFpFwPnWe5ZRH1w5hhTQ37I&s=c5-XV98SGrmaK9Vu11QYrzxY0JkZAzQVaCT1TIZuWO0&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=241109&view=rev</a><br>
Log:<br>
Remove Elf_Shdr_Iter. Diagnose files with invalid section header sizes.<br>
<br>
Added:<br>
    llvm/trunk/test/Object/Inputs/invalid-section-size.elf<br>
Modified:<br>
    llvm/trunk/include/llvm/Object/ELF.h<br>
    llvm/trunk/include/llvm/Object/ELFObjectFile.h<br>
    llvm/trunk/test/Object/invalid.test<br>
    llvm/trunk/tools/llvm-readobj/ARMEHABIPrinter.h<br>
<br>
Modified: llvm/trunk/include/llvm/Object/ELF.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_include_llvm_Object_ELF.h-3Frev-3D241109-26r1-3D241108-26r2-3D241109-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tLdM-9Gbk30-365bi9o-fFpFwPnWe5ZRH1w5hhTQ37I&s=gEjguN6rQgj7EL5SB80kXmMGygUa3srHMSRkYMcxnRs&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ELF.h?rev=241109&r1=241108&r2=241109&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Object/ELF.h (original)<br>
+++ llvm/trunk/include/llvm/Object/ELF.h Tue Jun 30 14:58:10 2015<br>
@@ -143,8 +143,7 @@ public:<br>
   typedef iterator_range<Elf_Dyn_Iter> Elf_Dyn_Range;<br>
   typedef ELFEntityIterator<const Elf_Rela> Elf_Rela_Iter;<br>
   typedef ELFEntityIterator<const Elf_Rel> Elf_Rel_Iter;<br>
-  typedef ELFEntityIterator<const Elf_Shdr> Elf_Shdr_Iter;<br>
-  typedef iterator_range<Elf_Shdr_Iter> Elf_Shdr_Range;<br>
+  typedef iterator_range<const Elf_Shdr *> Elf_Shdr_Range;<br>
<br>
   /// \brief Archive files are 2 byte aligned, so we need this for<br>
   ///     PointerIntPair to work.<br>
@@ -264,8 +263,8 @@ public:<br>
       Header->getDataEncoding() == ELF::ELFDATA2LSB;<br>
   }<br>
<br>
-  Elf_Shdr_Iter section_begin() const;<br>
-  Elf_Shdr_Iter section_end() const;<br>
+  const Elf_Shdr *section_begin() const;<br>
+  const Elf_Shdr *section_end() const;<br>
   Elf_Shdr_Range sections() const {<br>
     return make_range(section_begin(), section_end());<br>
   }<br>
@@ -751,16 +750,15 @@ uint64_t ELFFile<ELFT>::getSymbolIndex(c<br>
 }<br>
<br>
 template <class ELFT><br>
-typename ELFFile<ELFT>::Elf_Shdr_Iter ELFFile<ELFT>::section_begin() const {<br>
-  return Elf_Shdr_Iter(Header->e_shentsize,<br>
-                       (const char *)base() + Header->e_shoff);<br>
+const typename ELFFile<ELFT>::Elf_Shdr *ELFFile<ELFT>::section_begin() const {<br>
+  if (Header->e_shentsize != sizeof(Elf_Shdr))<br>
+    report_fatal_error("Invalid section header size");<br>
+  return reinterpret_cast<const Elf_Shdr *>(base() + Header->e_shoff);<br>
 }<br>
<br>
 template <class ELFT><br>
-typename ELFFile<ELFT>::Elf_Shdr_Iter ELFFile<ELFT>::section_end() const {<br>
-  return Elf_Shdr_Iter(Header->e_shentsize,<br>
-                       (const char *)base() + Header->e_shoff +<br>
-                           (getNumSections() * Header->e_shentsize));<br>
+const typename ELFFile<ELFT>::Elf_Shdr *ELFFile<ELFT>::section_end() const {<br>
+  return section_begin() + getNumSections();<br>
 }<br>
<br>
 template <class ELFT><br>
<br>
Modified: llvm/trunk/include/llvm/Object/ELFObjectFile.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_include_llvm_Object_ELFObjectFile.h-3Frev-3D241109-26r1-3D241108-26r2-3D241109-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tLdM-9Gbk30-365bi9o-fFpFwPnWe5ZRH1w5hhTQ37I&s=8OQcFQFp9Bi8cqFF-S95qdNHCQjySAv1faIu-hC0I90&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ELFObjectFile.h?rev=241109&r1=241108&r2=241109&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Object/ELFObjectFile.h (original)<br>
+++ llvm/trunk/include/llvm/Object/ELFObjectFile.h Tue Jun 30 14:58:10 2015<br>
@@ -189,7 +189,6 @@ public:<br>
   typedef typename ELFFile<ELFT>::Elf_Rela Elf_Rela;<br>
   typedef typename ELFFile<ELFT>::Elf_Dyn Elf_Dyn;<br>
<br>
-  typedef typename ELFFile<ELFT>::Elf_Shdr_Iter Elf_Shdr_Iter;<br>
   typedef typename ELFFile<ELFT>::Elf_Dyn_Iter Elf_Dyn_Iter;<br>
<br>
 protected:<br>
@@ -261,15 +260,8 @@ protected:<br>
     return DRI;<br>
   }<br>
<br>
-  Elf_Shdr_Iter toELFShdrIter(DataRefImpl Sec) const {<br>
-    return Elf_Shdr_Iter(EF.getHeader()->e_shentsize,<br>
-                         reinterpret_cast<const char *>(Sec.p));<br>
-  }<br>
-<br>
-  DataRefImpl toDRI(Elf_Shdr_Iter Sec) const {<br>
-    DataRefImpl DRI;<br>
-    DRI.p = reinterpret_cast<uintptr_t>(Sec.get());<br>
-    return DRI;<br>
+  const Elf_Shdr *toELFShdrIter(DataRefImpl Sec) const {<br>
+    return reinterpret_cast<const Elf_Shdr *>(Sec.p);<br>
   }<br>
<br>
   DataRefImpl toDRI(const Elf_Shdr *Sec) const {<br>
@@ -541,7 +533,8 @@ ELFObjectFile<ELFT>::getSymbolSection(Da<br>
<br>
 template <class ELFT><br>
 void ELFObjectFile<ELFT>::moveSectionNext(DataRefImpl &Sec) const {<br>
-  Sec = toDRI(++toELFShdrIter(Sec));<br>
+  const Elf_Shdr *ESec = toELFShdrIter(Sec);<br>
+  Sec = toDRI(++ESec);<br>
 }<br>
<br>
 template <class ELFT><br>
@@ -568,7 +561,7 @@ template <class ELFT><br>
 std::error_code<br>
 ELFObjectFile<ELFT>::getSectionContents(DataRefImpl Sec,<br>
                                         StringRef &Result) const {<br>
-  Elf_Shdr_Iter EShdr = toELFShdrIter(Sec);<br>
+  const Elf_Shdr *EShdr = toELFShdrIter(Sec);<br>
   Result = StringRef((const char *)base() + EShdr->sh_offset, EShdr->sh_size);<br>
   return std::error_code();<br>
 }<br>
@@ -585,14 +578,14 @@ bool ELFObjectFile<ELFT>::isSectionText(<br>
<br>
 template <class ELFT><br>
 bool ELFObjectFile<ELFT>::isSectionData(DataRefImpl Sec) const {<br>
-  Elf_Shdr_Iter EShdr = toELFShdrIter(Sec);<br>
+  const Elf_Shdr *EShdr = toELFShdrIter(Sec);<br>
   return EShdr->sh_flags & (ELF::SHF_ALLOC | ELF::SHF_WRITE) &&<br>
          EShdr->sh_type == ELF::SHT_PROGBITS;<br>
 }<br>
<br>
 template <class ELFT><br>
 bool ELFObjectFile<ELFT>::isSectionBSS(DataRefImpl Sec) const {<br>
-  Elf_Shdr_Iter EShdr = toELFShdrIter(Sec);<br>
+  const Elf_Shdr *EShdr = toELFShdrIter(Sec);<br>
   return EShdr->sh_flags & (ELF::SHF_ALLOC | ELF::SHF_WRITE) &&<br>
          EShdr->sh_type == ELF::SHT_NOBITS;<br>
 }<br>
@@ -617,7 +610,7 @@ template <class ELFT><br>
 relocation_iterator<br>
 ELFObjectFile<ELFT>::section_rel_begin(DataRefImpl Sec) const {<br>
   DataRefImpl RelData;<br>
-  uintptr_t SHT = reinterpret_cast<uintptr_t>(EF.section_begin().get());<br>
+  uintptr_t SHT = reinterpret_cast<uintptr_t>(EF.section_begin());<br>
   RelData.d.a = (Sec.p - SHT) / EF.getHeader()->e_shentsize;<br>
   RelData.d.b = 0;<br>
   return relocation_iterator(RelocationRef(RelData, this));<br>
@@ -627,7 +620,7 @@ template <class ELFT><br>
 relocation_iterator<br>
 ELFObjectFile<ELFT>::section_rel_end(DataRefImpl Sec) const {<br>
   DataRefImpl RelData;<br>
-  uintptr_t SHT = reinterpret_cast<uintptr_t>(EF.section_begin().get());<br>
+  uintptr_t SHT = reinterpret_cast<uintptr_t>(EF.section_begin());<br>
   const Elf_Shdr *S = reinterpret_cast<const Elf_Shdr *>(Sec.p);<br>
   RelData.d.a = (Sec.p - SHT) / EF.getHeader()->e_shentsize;<br>
   if (S->sh_type != ELF::SHT_RELA && S->sh_type != ELF::SHT_REL)<br>
@@ -644,7 +637,7 @@ ELFObjectFile<ELFT>::getRelocatedSection<br>
   if (EF.getHeader()->e_type != ELF::ET_REL)<br>
     return section_end();<br>
<br>
-  Elf_Shdr_Iter EShdr = toELFShdrIter(Sec);<br>
+  const Elf_Shdr *EShdr = toELFShdrIter(Sec);<br>
   uintX_t Type = EShdr->sh_type;<br>
   if (Type != ELF::SHT_REL && Type != ELF::SHT_RELA)<br>
     return section_end();<br>
<br>
Added: llvm/trunk/test/Object/Inputs/invalid-section-size.elf<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_Object_Inputs_invalid-2Dsection-2Dsize.elf-3Frev-3D241109-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tLdM-9Gbk30-365bi9o-fFpFwPnWe5ZRH1w5hhTQ37I&s=qK4BEG-r4a9ZJKC0tZNS8HtrLbb2vgrYDVmwv-tsDro&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/invalid-section-size.elf?rev=241109&view=auto</a><br>
==============================================================================<br>
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<br>
<br>
Modified: llvm/trunk/test/Object/invalid.test<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_Object_invalid.test-3Frev-3D241109-26r1-3D241108-26r2-3D241109-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tLdM-9Gbk30-365bi9o-fFpFwPnWe5ZRH1w5hhTQ37I&s=UHf2x5FztfjXoY5mdjTy2rmbeEWtSaQniMHdOFn5PLw&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/invalid.test?rev=241109&r1=241108&r2=241109&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Object/invalid.test (original)<br>
+++ llvm/trunk/test/Object/invalid.test Tue Jun 30 14:58:10 2015<br>
@@ -41,3 +41,6 @@ INVALID-SYM-SIZE: Invalid symbol size<br>
 RUN: not llvm-readobj -t %p/Inputs/invalid-section-index.elf 2>&1 | FileCheck --check-prefix=INVALID-SECTION-INDEX %s<br>
<br>
 INVALID-SECTION-INDEX: Invalid section index!<br>
+<br>
+RUN: not llvm-readobj -s %p/Inputs/invalid-section-size.elf 2>&1 | FileCheck --check-prefix=INVALID-SECTION-SIZE %s<br>
+INVALID-SECTION-SIZE: Invalid section header size<br></blockquote><div><br></div><div>Wording suggestion: "Invalid section header entry size (<span style="font-size:13px">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.</span></div><div><span style="font-size:13px"><br></span></div><div><span style="font-size:13px">-- Sean Silva</span></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
Modified: llvm/trunk/tools/llvm-readobj/ARMEHABIPrinter.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_tools_llvm-2Dreadobj_ARMEHABIPrinter.h-3Frev-3D241109-26r1-3D241108-26r2-3D241109-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tLdM-9Gbk30-365bi9o-fFpFwPnWe5ZRH1w5hhTQ37I&s=kVeLlgi4MQ9adZMTW-vo0bgWF0EOg_1LPa6KaRCtJFo&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/ARMEHABIPrinter.h?rev=241109&r1=241108&r2=241109&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-readobj/ARMEHABIPrinter.h (original)<br>
+++ llvm/trunk/tools/llvm-readobj/ARMEHABIPrinter.h Tue Jun 30 14:58:10 2015<br>
@@ -312,7 +312,6 @@ class PrinterContext {<br>
   typedef typename object::ELFFile<ET>::Elf_Shdr Elf_Shdr;<br>
<br>
   typedef typename object::ELFFile<ET>::Elf_Rel_Iter Elf_Rel_iterator;<br>
-  typedef typename object::ELFFile<ET>::Elf_Shdr_Iter Elf_Shdr_iterator;<br>
<br>
   static const size_t IndexTableEntrySize;<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>