summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/lib/Object/Archive.cpp
diff options
context:
space:
mode:
authorpatrick <patrick@openbsd.org>2019-01-27 16:42:12 +0000
committerpatrick <patrick@openbsd.org>2019-01-27 16:42:12 +0000
commitb773203fb58f3ef282fb69c832d8710cab5bc82d (patch)
treee75913f147570fbd75169647b144df85b88a038c /gnu/llvm/lib/Object/Archive.cpp
parenttweak errno in previous (diff)
downloadwireguard-openbsd-b773203fb58f3ef282fb69c832d8710cab5bc82d.tar.xz
wireguard-openbsd-b773203fb58f3ef282fb69c832d8710cab5bc82d.zip
Import LLVM 7.0.1 release including clang, lld and lldb.
Diffstat (limited to 'gnu/llvm/lib/Object/Archive.cpp')
-rw-r--r--gnu/llvm/lib/Object/Archive.cpp12
1 files changed, 8 insertions, 4 deletions
diff --git a/gnu/llvm/lib/Object/Archive.cpp b/gnu/llvm/lib/Object/Archive.cpp
index b17eefd220b..8ec115a5566 100644
--- a/gnu/llvm/lib/Object/Archive.cpp
+++ b/gnu/llvm/lib/Object/Archive.cpp
@@ -175,15 +175,19 @@ Expected<StringRef> ArchiveMemberHeader::getName(uint64_t Size) const {
"the end of the string table for archive member "
"header at offset " + Twine(ArchiveOffset));
}
- const char *addr = Parent->getStringTable().begin() + StringOffset;
// GNU long file names end with a "/\n".
if (Parent->kind() == Archive::K_GNU ||
Parent->kind() == Archive::K_GNU64) {
- StringRef::size_type End = StringRef(addr).find('\n');
- return StringRef(addr, End - 1);
+ size_t End = Parent->getStringTable().find('\n', /*From=*/StringOffset);
+ if (End == StringRef::npos || End < 1 ||
+ Parent->getStringTable()[End - 1] != '/') {
+ return malformedError("string table at long name offset " +
+ Twine(StringOffset) + "not terminated");
+ }
+ return Parent->getStringTable().slice(StringOffset, End - 1);
}
- return addr;
+ return Parent->getStringTable().begin() + StringOffset;
}
if (Name.startswith("#1/")) {