Don't reject an empty archive.
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 12 Jul 2013 13:32:28 +0000 (13:32 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 12 Jul 2013 13:32:28 +0000 (13:32 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186159 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Object/Archive.cpp
test/Object/Inputs/archive-test.a-empty [new file with mode: 0644]
test/Object/nm-archive.test

index 60c6d21f48237484e2b1493f1d04909844c2ec45..7579a9ac98dc1a63595ee1ed2513c6b60def74b2 100644 (file)
@@ -212,9 +212,9 @@ error_code Archive::Child::getAsBinary(OwningPtr<Binary> &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/test/Object/Inputs/archive-test.a-empty b/test/Object/Inputs/archive-test.a-empty
new file mode 100644 (file)
index 0000000..8b277f0
--- /dev/null
@@ -0,0 +1 @@
+!<arch>
index 99efc1bec67d16f16fd63814291023bd33775db6..0d43cc701550fd449224fc096d5dee9b109335b6 100644 (file)
@@ -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