Merge branch 'archive-null-error' into release
diff --git a/Source/cmArchiveWrite.cxx b/Source/cmArchiveWrite.cxx
index d5dcd6a..58f7573 100644
--- a/Source/cmArchiveWrite.cxx
+++ b/Source/cmArchiveWrite.cxx
@@ -18,6 +18,13 @@
 #include <cm_libarchive.h>
 
 //----------------------------------------------------------------------------
+static std::string cm_archive_error_string(struct archive* a)
+{
+  const char* e = archive_error_string(a);
+  return e? e : "unknown error";
+}
+
+//----------------------------------------------------------------------------
 class cmArchiveWrite::Entry
 {
   struct archive_entry* Object;
@@ -60,7 +67,7 @@
       if(archive_write_set_compression_none(this->Archive) != ARCHIVE_OK)
         {
         this->Error = "archive_write_set_compression_none: ";
-        this->Error += archive_error_string(this->Archive);
+        this->Error += cm_archive_error_string(this->Archive);
         return;
         }
       break;
@@ -68,7 +75,7 @@
       if(archive_write_set_compression_compress(this->Archive) != ARCHIVE_OK)
         {
         this->Error = "archive_write_set_compression_compress: ";
-        this->Error += archive_error_string(this->Archive);
+        this->Error += cm_archive_error_string(this->Archive);
         return;
         }
       break;
@@ -76,7 +83,7 @@
       if(archive_write_set_compression_gzip(this->Archive) != ARCHIVE_OK)
         {
         this->Error = "archive_write_set_compression_gzip: ";
-        this->Error += archive_error_string(this->Archive);
+        this->Error += cm_archive_error_string(this->Archive);
         return;
         }
       break;
@@ -84,7 +91,7 @@
       if(archive_write_set_compression_bzip2(this->Archive) != ARCHIVE_OK)
         {
         this->Error = "archive_write_set_compression_bzip2: ";
-        this->Error += archive_error_string(this->Archive);
+        this->Error += cm_archive_error_string(this->Archive);
         return;
         }
       break;
@@ -92,7 +99,7 @@
       if(archive_write_set_compression_lzma(this->Archive) != ARCHIVE_OK)
         {
         this->Error = "archive_write_set_compression_lzma: ";
-        this->Error += archive_error_string(this->Archive);
+        this->Error += cm_archive_error_string(this->Archive);
         return;
         }
       break;
@@ -100,7 +107,7 @@
       if(archive_write_set_compression_xz(this->Archive) != ARCHIVE_OK)
         {
         this->Error = "archive_write_set_compression_xz: ";
-        this->Error += archive_error_string(this->Archive);
+        this->Error += cm_archive_error_string(this->Archive);
         return;
         }
       break;
@@ -109,7 +116,7 @@
   if (archive_read_disk_set_standard_lookup(this->Disk) != ARCHIVE_OK)
     {
     this->Error = "archive_read_disk_set_standard_lookup: ";
-    this->Error += archive_error_string(this->Archive);
+    this->Error += cm_archive_error_string(this->Archive);
     return;;
     }
 #endif
@@ -119,7 +126,7 @@
       if(archive_write_set_format_zip(this->Archive) != ARCHIVE_OK)
         {
         this->Error = "archive_write_set_format_zip: ";
-        this->Error += archive_error_string(this->Archive);
+        this->Error += cm_archive_error_string(this->Archive);
         return;
         }
       break;
@@ -127,7 +134,7 @@
       if(archive_write_set_format_pax_restricted(this->Archive) != ARCHIVE_OK)
         {
         this->Error = "archive_write_set_format_pax_restricted: ";
-        this->Error += archive_error_string(this->Archive);
+        this->Error += cm_archive_error_string(this->Archive);
         return;
         }
     break;
@@ -137,7 +144,7 @@
   if (archive_write_set_bytes_in_last_block(this->Archive, 1))
     {
     this->Error = "archive_write_set_bytes_in_last_block: ";
-    this->Error += archive_error_string(this->Archive);
+    this->Error += cm_archive_error_string(this->Archive);
     return;
     }
 
@@ -147,7 +154,7 @@
        0) != ARCHIVE_OK)
     {
     this->Error = "archive_write_open: ";
-    this->Error += archive_error_string(this->Archive);
+    this->Error += cm_archive_error_string(this->Archive);
     return;
     }
 }
@@ -235,7 +242,7 @@
   if(archive_read_disk_entry_from_file(this->Disk, e, -1, 0) != ARCHIVE_OK)
     {
     this->Error = "archive_read_disk_entry_from_file: ";
-    this->Error += archive_error_string(this->Disk);
+    this->Error += cm_archive_error_string(this->Disk);
     return false;
     }
   // Clear acl and xattr fields not useful for distribution.
@@ -245,7 +252,7 @@
   if(archive_write_header(this->Archive, e) != ARCHIVE_OK)
     {
     this->Error = "archive_write_header: ";
-    this->Error += archive_error_string(this->Archive);
+    this->Error += cm_archive_error_string(this->Archive);
     return false;
     }
 
@@ -292,7 +299,7 @@
     if(archive_write_data(this->Archive, buffer, nnext) != nnext_s)
       {
       this->Error = "archive_write_data: ";
-      this->Error += archive_error_string(this->Archive);
+      this->Error += cm_archive_error_string(this->Archive);
       return false;
       }
     nleft -= nnext;