diff options
| author | 2019-01-27 16:42:12 +0000 | |
|---|---|---|
| committer | 2019-01-27 16:42:12 +0000 | |
| commit | b773203fb58f3ef282fb69c832d8710cab5bc82d (patch) | |
| tree | e75913f147570fbd75169647b144df85b88a038c /gnu/llvm/lib/Object/Archive.cpp | |
| parent | tweak errno in previous (diff) | |
| download | wireguard-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.cpp | 12 |
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/")) { |
