[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
Wed Oct 4 15:10:43 PDT 2017
jakehehrlich updated this revision to Diff 117749.
jakehehrlich added a comment.
Fixed typos
Repository:
rL LLVM
https://reviews.llvm.org/D38329
Files:
tools/llvm-objcopy/Object.cpp
tools/llvm-objcopy/Object.h
Index: tools/llvm-objcopy/Object.h
===================================================================
--- tools/llvm-objcopy/Object.h
+++ 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: tools/llvm-objcopy/Object.cpp
===================================================================
--- tools/llvm-objcopy/Object.cpp
+++ 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;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D38329.117749.patch
Type: text/x-patch
Size: 3422 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171004/775925a0/attachment.bin>
More information about the llvm-commits
mailing list