diff options
author | Kai Luo <lkail@cn.ibm.com> | 2023-01-30 13:43:50 +0800 |
---|---|---|
committer | Kai Luo <lkail@cn.ibm.com> | 2023-01-30 14:06:53 +0800 |
commit | 7f0003c19c3a47f484ea9cc929728808b27ace32 (patch) | |
tree | 37720e1f4e457a28337f2988aff8e6b3d3df7188 /llvm/lib/Object/Archive.cpp | |
parent | 28f9bfe466b066d0d77cb32039e7e299618d0c1a (diff) | |
download | llvm-7f0003c19c3a47f484ea9cc929728808b27ace32.zip llvm-7f0003c19c3a47f484ea9cc929728808b27ace32.tar.gz llvm-7f0003c19c3a47f484ea9cc929728808b27ace32.tar.bz2 |
[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 | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp index 2cf9241..046bcb3 100644 --- a/llvm/lib/Object/Archive.cpp +++ b/llvm/lib/Object/Archive.cpp @@ -949,7 +949,15 @@ Archive::child_iterator Archive::child_begin(Error &Err, return child_iterator::itr( Child(this, FirstRegularData, FirstRegularStartOfFile), Err); - const char *Loc = Data.getBufferStart() + getFirstChildOffset(); + uint64_t FirstChildOffset = getFirstChildOffset(); + const char *Loc = Data.getBufferStart() + FirstChildOffset; + if (Loc >= Data.getBufferEnd()) { + Err = malformedError("First member offset " + Twine(FirstChildOffset) + + " is beyond the data buffer which has size of " + + Twine(Data.getBufferSize())); + return child_end(); + } + Child C(this, Loc, &Err); if (Err) return child_end(); |