From a5e873e2a1c079028ffc3e4aaa36a1decf204ed0 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Wed, 5 Oct 2016 21:20:00 +0000 Subject: [Object] Fix a crash in Archive::child_iterator's default constructor. 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. llvm-svn: 283387 --- llvm/lib/Object/Archive.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'llvm/lib/Object/Archive.cpp') diff --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp index 73761fa73db..9a83f69705c 100644 --- a/llvm/lib/Object/Archive.cpp +++ b/llvm/lib/Object/Archive.cpp @@ -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::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 { -- cgit v1.2.3