Skip to content

Commit c0d9e5a

Browse files
author
Kai Luo
committed
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
1 parent 29a4ed8 commit c0d9e5a

File tree

4 files changed

+34
-7
lines changed

4 files changed

+34
-7
lines changed

llvm/include/llvm/Object/Archive.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -410,9 +410,7 @@ class BigArchive : public Archive {
410410
BigArchive(MemoryBufferRef Source, Error &Err);
411411
uint64_t getFirstChildOffset() const override { return FirstChildOffset; }
412412
uint64_t getLastChildOffset() const { return LastChildOffset; }
413-
bool isEmpty() const override {
414-
return Data.getBufferSize() == sizeof(FixLenHdr);
415-
};
413+
bool isEmpty() const override { return getFirstChildOffset() == 0; }
416414
};
417415

418416
} // end namespace object

llvm/lib/Object/Archive.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,13 @@ BigArchiveMemberHeader::BigArchiveMemberHeader(const Archive *Parent,
135135
return;
136136
ErrorAsOutParameter ErrAsOutParam(Err);
137137

138+
if (RawHeaderPtr + getSizeOf() >= Parent->getData().end()) {
139+
if (Err)
140+
*Err = malformedError("malformed AIX big archive: remaining buffer is "
141+
"unable to contain next archive member");
142+
return;
143+
}
144+
138145
if (Size < getSizeOf()) {
139146
Error SubErr = createMemberHeaderParseError(this, RawHeaderPtr, Size);
140147
if (Err)
@@ -1172,6 +1179,14 @@ BigArchive::BigArchive(MemoryBufferRef Source, Error &Err)
11721179
ErrorAsOutParameter ErrAsOutParam(&Err);
11731180
StringRef Buffer = Data.getBuffer();
11741181
ArFixLenHdr = reinterpret_cast<const FixLenHdr *>(Buffer.data());
1182+
uint64_t BufferSize = Data.getBufferSize();
1183+
1184+
if (BufferSize < sizeof(FixLenHdr)) {
1185+
Err = malformedError("malformed AIX big archive: incomplete fixed length "
1186+
"header, the archive is only" +
1187+
Twine(BufferSize) + " byte(s)");
1188+
return;
1189+
}
11751190

11761191
StringRef RawOffset = getFieldRawString(ArFixLenHdr->FirstChildOffset);
11771192
if (RawOffset.getAsInteger(10, FirstChildOffset))
@@ -1198,7 +1213,6 @@ BigArchive::BigArchive(MemoryBufferRef Source, Error &Err)
11981213
return;
11991214

12001215
if (GlobSymOffset > 0) {
1201-
uint64_t BufferSize = Data.getBufferSize();
12021216
uint64_t GlobalSymTblContentOffset =
12031217
GlobSymOffset + sizeof(BigArMemHdrType);
12041218
if (GlobalSymTblContentOffset > BufferSize) {
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
## Test reading an archive with malformed header.
2+
# RUN: echo "<bigaf>" > %t.a
3+
# RUN: not llvm-ar tv %t.a 2>&1 | FileCheck --check-prefix=CHECK-HEADER %s
4+
# CHECK-HEADER: truncated or malformed archive{{.*}}malformed AIX big archive: incomplete fixed length header
5+
6+
## Test reading an empty archive with first member's offset is not zero.
7+
# RUN: echo "<bigaf>" > %t.a
8+
# RUN: echo -n "0 0 0 128 0 0 " >> %t.a
9+
# RUN: not llvm-ar tv %t.a 2>&1 | FileCheck %s
10+
11+
# RUN: echo "<bigaf>" > %t.a
12+
# RUN: echo -n "0 0 0 28 0 0 " >> %t.a
13+
# RUN: not llvm-ar tv %t.a 2>&1 | FileCheck %s
14+
15+
# CHECK: truncated or malformed archive{{.*}}malformed AIX big archive: remaining buffer is unable to contain next archive member
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
# Test reading an empty archive with free list in it.
2-
# RUN: not llvm-ar tv %p/Inputs/aix-empty-big-archive-with-freelist.a 2>&1 \
3-
# RUN: | grep 'truncated or malformed archive'
1+
## Test reading an empty archive with free list in it, should exit normally.
2+
# RUN: llvm-ar tv %p/Inputs/aix-empty-big-archive-with-freelist.a 2>&1 \
3+
# RUN: | count 0

0 commit comments

Comments
 (0)