diff options
author | Kai Luo <lkail@cn.ibm.com> | 2023-03-06 16:01:24 +0800 |
---|---|---|
committer | Kai Luo <lkail@cn.ibm.com> | 2023-03-06 16:33:27 +0800 |
commit | c0d9e5a0a4b80b0740282649ea32b0422e45e9ee (patch) | |
tree | 4ff99303223ee17ca8c3fb3216f2b4026fc318e8 /llvm/lib/Object/Archive.cpp | |
parent | 29a4ed80bb4c8aadc76718924f80a5f532b1ffce (diff) | |
download | llvm-c0d9e5a0a4b80b0740282649ea32b0422e45e9ee.zip llvm-c0d9e5a0a4b80b0740282649ea32b0422e45e9ee.tar.gz llvm-c0d9e5a0a4b80b0740282649ea32b0422e45e9ee.tar.bz2 |
Reland [AIX][BigArchive] Treat the archive is empty if the first child member offset is zero
If the archive contains free list and contains no member file, the buffer length doesn't equal to length of the header.
Reviewed By: Esme, DiggerLin, #powerpc
Differential Revision: https://reviews.llvm.org/D138986
Diffstat (limited to 'llvm/lib/Object/Archive.cpp')
-rw-r--r-- | llvm/lib/Object/Archive.cpp | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp index f4d2ff2..52d0daf 100644 --- a/llvm/lib/Object/Archive.cpp +++ b/llvm/lib/Object/Archive.cpp @@ -135,6 +135,13 @@ BigArchiveMemberHeader::BigArchiveMemberHeader(const Archive *Parent, return; ErrorAsOutParameter ErrAsOutParam(Err); + if (RawHeaderPtr + getSizeOf() >= Parent->getData().end()) { + if (Err) + *Err = malformedError("malformed AIX big archive: remaining buffer is " + "unable to contain next archive member"); + return; + } + if (Size < getSizeOf()) { Error SubErr = createMemberHeaderParseError(this, RawHeaderPtr, Size); if (Err) @@ -1172,6 +1179,14 @@ BigArchive::BigArchive(MemoryBufferRef Source, Error &Err) ErrorAsOutParameter ErrAsOutParam(&Err); StringRef Buffer = Data.getBuffer(); ArFixLenHdr = reinterpret_cast<const FixLenHdr *>(Buffer.data()); + uint64_t BufferSize = Data.getBufferSize(); + + if (BufferSize < sizeof(FixLenHdr)) { + Err = malformedError("malformed AIX big archive: incomplete fixed length " + "header, the archive is only" + + Twine(BufferSize) + " byte(s)"); + return; + } StringRef RawOffset = getFieldRawString(ArFixLenHdr->FirstChildOffset); if (RawOffset.getAsInteger(10, FirstChildOffset)) @@ -1198,7 +1213,6 @@ BigArchive::BigArchive(MemoryBufferRef Source, Error &Err) return; if (GlobSymOffset > 0) { - uint64_t BufferSize = Data.getBufferSize(); uint64_t GlobalSymTblContentOffset = GlobSymOffset + sizeof(BigArMemHdrType); if (GlobalSymTblContentOffset > BufferSize) { |