Object: Find terminator correctly when reading long filenames in GNU archives (PR37244)
The code was previously relying on there being a null terminator somewhere in (or after) the string table, something made less likely by r330786. Differential Revision: https://reviews.llvm.org/D46527 llvm-svn: 331746
This commit is contained in:
parent
98a1cab694
commit
5e6e6cc721
|
@ -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/")) {
|
||||
|
|
Loading…
Reference in New Issue