OSDN Git Service

[Object] Fix a crash in Archive::child_iterator's default constructor.
authorLang Hames <lhames@gmail.com>
Wed, 5 Oct 2016 21:20:00 +0000 (21:20 +0000)
committerLang Hames <lhames@gmail.com>
Wed, 5 Oct 2016 21:20:00 +0000 (21:20 +0000)
To be default constructible, Archive::child_iterator needs to be able to
construct an Archive::Child with a null parent, however Archive::Child's
constructor always dereferenced its Parent argument to compute the remaining
archive size. This commit fixes Archive::Child's constructor to only do the
size calculation when the parent is non-null.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@283387 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Object/Archive.h
lib/Object/Archive.cpp

index 14195f8..8ab99aa 100644 (file)
@@ -92,7 +92,7 @@ public:
     Child(const Archive *Parent, StringRef Data, uint16_t StartOfFile);
 
     bool operator ==(const Child &other) const {
-      assert(Parent == other.Parent);
+      assert(!Parent || !other.Parent || Parent == other.Parent);
       return Data.begin() == other.Data.begin();
     }
 
index 73761fa..9a83f69 100644 (file)
@@ -306,8 +306,11 @@ Archive::Child::Child(const Archive *Parent, StringRef Data,
 }
 
 Archive::Child::Child(const Archive *Parent, const char *Start, Error *Err)
-    : Parent(Parent), Header(Parent, Start, Parent->getData().size() -
-                             (Start - Parent->getData().data()), Err) {
+    : Parent(Parent),
+      Header(Parent, Start,
+             Parent
+               ? Parent->getData().size() - (Start - Parent->getData().data())
+               : 0, Err) {
   if (!Start)
     return;
 
@@ -441,7 +444,7 @@ Expected<Archive::Child> Archive::Child::getNext() const {
 
   // Check to see if this is at the end of the archive.
   if (NextLoc == Parent->Data.getBufferEnd())
-    return Child(Parent, nullptr, nullptr);
+    return Child(nullptr, nullptr, nullptr);
 
   // Check to see if this is past the end of the archive.
   if (NextLoc > Parent->Data.getBufferEnd()) {
@@ -768,7 +771,7 @@ Archive::child_iterator Archive::child_begin(Error &Err,
 }
 
 Archive::child_iterator Archive::child_end() const {
-  return child_iterator(Child(this, nullptr, nullptr), nullptr);
+  return child_iterator(Child(nullptr, nullptr, nullptr), nullptr);
 }
 
 StringRef Archive::Symbol::getName() const {