[PATCH] D38329: [llvm-objcopy] Fix latent bug that allowed some Sections to be improperly cast to StringTableSections
Jake Ehrlich via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 10 14:28:33 PDT 2017
This revision was automatically updated to reflect the committed changes.
Closed by commit rL315372: [llvm-objcopy] Fix latent bug that allowed some Sections to be improperly cast… (authored by jakehehrlich).
Changed prior to commit:
https://reviews.llvm.org/D38329?vs=117749&id=118481#toc
Repository:
rL LLVM
https://reviews.llvm.org/D38329
Files:
llvm/trunk/tools/llvm-objcopy/Object.cpp
llvm/trunk/tools/llvm-objcopy/Object.h
Index: llvm/trunk/tools/llvm-objcopy/Object.h
===================================================================
--- llvm/trunk/tools/llvm-objcopy/Object.h
+++ llvm/trunk/tools/llvm-objcopy/Object.h
@@ -114,7 +114,14 @@
void writeSection(llvm::FileOutputBuffer &Out) const override;
};
-// This is just a wraper around a StringTableBuilder that implements SectionBase
+// There are two types of string tables that can exist, dynamic and not dynamic.
+// In the dynamic case the string table is allocated. Changing a dynamic string
+// table would mean altering virtual addresses and thus the memory image. So
+// dynamic string tables should not have an interface to modify them or
+// reconstruct them. This type lets us reconstruct a string table. To avoid
+// this class being used for dynamic string tables (which has happened) the
+// classof method checks that the particular instance is not allocated. This
+// then agrees with the makeSection method used to construct most sections.
class StringTableSection : public SectionBase {
private:
llvm::StringTableBuilder StrTabBuilder;
@@ -129,6 +136,8 @@
void finalize() override;
void writeSection(llvm::FileOutputBuffer &Out) const override;
static bool classof(const SectionBase *S) {
+ if (S->Flags & llvm::ELF::SHF_ALLOC)
+ return false;
return S->Type == llvm::ELF::SHT_STRTAB;
}
};
@@ -259,11 +268,11 @@
class SectionWithStrTab : public Section {
private:
- StringTableSection *StrTab = nullptr;
+ const SectionBase *StrTab = nullptr;
public:
SectionWithStrTab(llvm::ArrayRef<uint8_t> Data) : Section(Data) {}
- void setStrTab(StringTableSection *StringTable) { StrTab = StringTable; }
+ void setStrTab(const SectionBase *StringTable) { StrTab = StringTable; }
void removeSectionReferences(const SectionBase *Sec) override;
void initialize(SectionTableRef SecTable) override;
void finalize() override;
Index: llvm/trunk/tools/llvm-objcopy/Object.cpp
===================================================================
--- llvm/trunk/tools/llvm-objcopy/Object.cpp
+++ llvm/trunk/tools/llvm-objcopy/Object.cpp
@@ -289,11 +289,14 @@
}
void SectionWithStrTab::initialize(SectionTableRef SecTable) {
- setStrTab(SecTable.getSectionOfType<StringTableSection>(
- Link,
- "Link field value " + Twine(Link) + " in section " + Name + " is invalid",
- "Link field value " + Twine(Link) + " in section " + Name +
- " is not a string table"));
+ auto StrTab = SecTable.getSection(Link,
+ "Link field value " + Twine(Link) +
+ " in section " + Name + " is invalid");
+ if (StrTab->Type != SHT_STRTAB) {
+ error("Link field value " + Twine(Link) + " in section " + Name +
+ " is not a string table");
+ }
+ setStrTab(StrTab);
}
void SectionWithStrTab::finalize() { this->Link = StrTab->Index; }
@@ -535,15 +538,6 @@
initRelocations(RelSec, SymbolTable,
unwrapOrError(ElfFile.relas(Shdr)));
}
-
- if (auto Sec = dyn_cast<SectionWithStrTab>(Section.get())) {
- Sec->setStrTab(SecTable.getSectionOfType<StringTableSection>(
- Sec->Link,
- "Link field value " + Twine(Sec->Link) + " in section " + Sec->Name +
- " is invalid",
- "Link field value " + Twine(Sec->Link) + " in section " + Sec->Name +
- " is not a string table"));
- }
}
return SecTable;
@@ -621,7 +615,7 @@
template <class ELFT>
void Object<ELFT>::writeSectionData(FileOutputBuffer &Out) const {
for (auto &Section : Sections)
- Section->writeSection(Out);
+ Section->writeSection(Out);
}
template <class ELFT>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D38329.118481.patch
Type: text/x-patch
Size: 3729 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171010/3bf731c3/attachment.bin>
More information about the llvm-commits
mailing list