aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Object/Archive.cpp
diff options
context:
space:
mode:
authorKai Luo <lkail@cn.ibm.com>2023-01-30 13:43:50 +0800
committerKai Luo <lkail@cn.ibm.com>2023-01-30 14:06:53 +0800
commit7f0003c19c3a47f484ea9cc929728808b27ace32 (patch)
tree37720e1f4e457a28337f2988aff8e6b3d3df7188 /llvm/lib/Object/Archive.cpp
parent28f9bfe466b066d0d77cb32039e7e299618d0c1a (diff)
downloadllvm-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.cpp10
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();