From 22258251b9b75c1acc89bc4a6d54d7316158ab35 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Sat, 31 Oct 2015 20:06:13 +0000 Subject: [PATCH] Simplify the handling of the archive string table. We only need to store a StringRef git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251746 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/Archive.h | 2 +- lib/Object/Archive.cpp | 22 ++++++++++------------ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/include/llvm/Object/Archive.h b/include/llvm/Object/Archive.h index 32c72a0cc3d..0d394fd98b6 100644 --- a/include/llvm/Object/Archive.h +++ b/include/llvm/Object/Archive.h @@ -218,7 +218,7 @@ public: private: child_iterator SymbolTable; - child_iterator StringTable; + StringRef StringTable; child_iterator FirstRegular; unsigned Format : 2; unsigned IsThin : 1; diff --git a/lib/Object/Archive.cpp b/lib/Object/Archive.cpp index 667732baa27..2e71b8205d4 100644 --- a/lib/Object/Archive.cpp +++ b/lib/Object/Archive.cpp @@ -179,17 +179,11 @@ ErrorOr Archive::Child::getName() const { std::size_t offset; if (name.substr(1).rtrim(" ").getAsInteger(10, offset)) llvm_unreachable("Long name offset is not an integer"); - const char *addr = Parent->StringTable->Data.begin() - + sizeof(ArchiveMemberHeader) - + offset; + // Verify it. - if (Parent->StringTable == Parent->child_end() - || addr < (Parent->StringTable->Data.begin() - + sizeof(ArchiveMemberHeader)) - || addr > (Parent->StringTable->Data.begin() - + sizeof(ArchiveMemberHeader) - + Parent->StringTable->getSize())) + if (offset >= Parent->StringTable.size()) return object_error::parse_failed; + const char *addr = Parent->StringTable.begin() + offset; // GNU long file names end with a "/\n". if (Parent->kind() == K_GNU || Parent->kind() == K_MIPS64) { @@ -240,7 +234,7 @@ ErrorOr> Archive::create(MemoryBufferRef Source) { Archive::Archive(MemoryBufferRef Source, std::error_code &ec) : Binary(Binary::ID_Archive, Source), SymbolTable(child_end()), - StringTable(child_end()), FirstRegular(child_end()) { + FirstRegular(child_end()) { StringRef Buffer = Data.getBuffer(); // Check for sufficient magic. if (Buffer.startswith(ThinMagic)) { @@ -328,7 +322,9 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec) if (Name == "//") { Format = has64SymTable ? K_MIPS64 : K_GNU; - StringTable = i; + // The string table is never an external member, so we just assert on the + // ErrorOr. + StringTable = *i->getBuffer(); ++i; FirstRegular = i; ec = std::error_code(); @@ -360,7 +356,9 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec) Name = i->getRawName(); if (Name == "//") { - StringTable = i; + // The string table is never an external member, so we just assert on the + // ErrorOr. + StringTable = *i->getBuffer(); ++i; } -- 2.34.1