[PATCH] D46527: Object: Find terminator correctly when getting long filenames from GNU archives
Hans Wennborg via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon May 7 08:04:29 PDT 2018
hans created this revision.
hans added reviewers: inglorion, ruiu.
The code was previously assuming relying on there being a null terminator somewhere in (or after) the string table, something made less likely by r330786.
(Suggestions for how to test this welcome.)
https://reviews.llvm.org/D46527
Files:
lib/Object/Archive.cpp
Index: lib/Object/Archive.cpp
===================================================================
--- lib/Object/Archive.cpp
+++ lib/Object/Archive.cpp
@@ -175,15 +175,19 @@
"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('\xa', /*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/")) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D46527.145467.patch
Type: text/x-patch
Size: 1178 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180507/c261d5be/attachment.bin>
More information about the llvm-commits
mailing list