From f0c617264aa1685bdf199d37babc1b223170d22e Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 12 Jul 2013 13:32:28 +0000 Subject: [PATCH] Don't reject an empty archive. llvm-svn: 186159 --- llvm/lib/Object/Archive.cpp | 10 ++++++---- llvm/test/Object/Inputs/archive-test.a-empty | 1 + llvm/test/Object/nm-archive.test | 3 +++ 3 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 llvm/test/Object/Inputs/archive-test.a-empty diff --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp index 60c6d21f4823..7579a9ac98dc 100644 --- a/llvm/lib/Object/Archive.cpp +++ b/llvm/lib/Object/Archive.cpp @@ -212,9 +212,9 @@ error_code Archive::Child::getAsBinary(OwningPtr &Result) const { Archive::Archive(MemoryBuffer *source, error_code &ec) : Binary(Binary::ID_Archive, source), SymbolTable(end_children()) { // Check for sufficient magic. - if (!source || source->getBufferSize() - < (8 + sizeof(ArchiveMemberHeader)) // Smallest archive. - || StringRef(source->getBufferStart(), 8) != Magic) { + assert(source); + if (source->getBufferSize() < 8 || + StringRef(source->getBufferStart(), 8) != Magic) { ec = object_error::invalid_file_type; return; } @@ -224,7 +224,7 @@ Archive::Archive(MemoryBuffer *source, error_code &ec) child_iterator e = end_children(); if (i == e) { - ec = object_error::parse_failed; + ec = object_error::success; return; } @@ -314,6 +314,8 @@ Archive::Archive(MemoryBuffer *source, error_code &ec) } Archive::child_iterator Archive::begin_children(bool skip_internal) const { + if (Data->getBufferSize() == 8) // empty archive. + return end_children(); const char *Loc = Data->getBufferStart() + strlen(Magic); Child c(this, Loc); // Skip internals at the beginning of an archive. diff --git a/llvm/test/Object/Inputs/archive-test.a-empty b/llvm/test/Object/Inputs/archive-test.a-empty new file mode 100644 index 000000000000..8b277f0dd5dc --- /dev/null +++ b/llvm/test/Object/Inputs/archive-test.a-empty @@ -0,0 +1 @@ +! diff --git a/llvm/test/Object/nm-archive.test b/llvm/test/Object/nm-archive.test index 99efc1bec67d..0d43cc701550 100644 --- a/llvm/test/Object/nm-archive.test +++ b/llvm/test/Object/nm-archive.test @@ -30,3 +30,6 @@ RUN: llvm-nm %p/Inputs/archive-test.a-gnu-minimal And don't crash when asked to print a non existing symtab. RUN: llvm-nm -s %p/Inputs/archive-test.a-gnu-minimal + +Don't reject an empty archive. +RUN: llvm-nm %p/Inputs/archive-test.a-empty -- 2.34.1