[llvm] 7f0003c - [AIX][BigArchive] Treat the archive is empty if the first child member offset is zero

Kai Luo via llvm-commits llvm-commits at lists.llvm.org
Sun Jan 29 22:07:01 PST 2023


Author: Kai Luo
Date: 2023-01-30T14:06:53+08:00
New Revision: 7f0003c19c3a47f484ea9cc929728808b27ace32

URL: https://github.com/llvm/llvm-project/commit/7f0003c19c3a47f484ea9cc929728808b27ace32
DIFF: https://github.com/llvm/llvm-project/commit/7f0003c19c3a47f484ea9cc929728808b27ace32.diff

LOG: [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

Added: 
    llvm/test/Object/archive-big-malformed-first-member.test

Modified: 
    llvm/include/llvm/Object/Archive.h
    llvm/lib/Object/Archive.cpp
    llvm/test/Object/archive-big-read-empty-with-freelist.test

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/Object/Archive.h b/llvm/include/llvm/Object/Archive.h
index fbacee964aa88..b77c8537eeaa0 100644
--- a/llvm/include/llvm/Object/Archive.h
+++ b/llvm/include/llvm/Object/Archive.h
@@ -410,9 +410,7 @@ class BigArchive : public Archive {
   BigArchive(MemoryBufferRef Source, Error &Err);
   uint64_t getFirstChildOffset() const override { return FirstChildOffset; }
   uint64_t getLastChildOffset() const { return LastChildOffset; }
-  bool isEmpty() const override {
-    return Data.getBufferSize() == sizeof(FixLenHdr);
-  };
+  bool isEmpty() const override { return getFirstChildOffset() == 0; }
 };
 
 } // end namespace object

diff  --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp
index 2cf9241238882..046bcb3ff8816 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();

diff  --git a/llvm/test/Object/archive-big-malformed-first-member.test b/llvm/test/Object/archive-big-malformed-first-member.test
new file mode 100644
index 0000000000000..08ae37b47816c
--- /dev/null
+++ b/llvm/test/Object/archive-big-malformed-first-member.test
@@ -0,0 +1,7 @@
+# Test reading an empty archive with first member's offset is not zero.
+# RUN: echo    "<bigaf>" > %t.a
+# RUN: echo -n "0                   0                   0                   128                 0                   0                   " >> %t.a
+# RUN: not llvm-ar tv %t.a 2>&1 | grep 'truncated or malformed archive'
+# RUN: echo    "<bigaf>" > %t.a
+# RUN: echo -n "0                   0                   0                   28                  0                   0                   " >> %t.a
+# RUN: not llvm-ar tv %t.a 2>&1 | grep 'truncated or malformed archive'

diff  --git a/llvm/test/Object/archive-big-read-empty-with-freelist.test b/llvm/test/Object/archive-big-read-empty-with-freelist.test
index 2ac3253446597..05e45ca51c39e 100644
--- a/llvm/test/Object/archive-big-read-empty-with-freelist.test
+++ b/llvm/test/Object/archive-big-read-empty-with-freelist.test
@@ -1,3 +1,3 @@
 # Test reading an empty archive with free list in it.
-# RUN: not llvm-ar tv %p/Inputs/aix-empty-big-archive-with-freelist.a 2>&1 \
-# RUN:   | grep 'truncated or malformed archive'
+# RUN: llvm-ar tv %p/Inputs/aix-empty-big-archive-with-freelist.a 2>&1 \
+# RUN:   | not grep 'truncated or malformed archive'


        


More information about the llvm-commits mailing list