Merge "Update for public android_set_abort_message()."
diff --git a/libziparchive/zip_archive.cc b/libziparchive/zip_archive.cc
index 24088bb..d5d4700 100644
--- a/libziparchive/zip_archive.cc
+++ b/libziparchive/zip_archive.cc
@@ -640,9 +640,15 @@
     const uint16_t file_name_length = cdr->file_name_length;
     const uint16_t extra_length = cdr->extra_field_length;
     const uint16_t comment_length = cdr->comment_length;
+    const uint8_t* file_name = ptr + sizeof(CentralDirectoryRecord);
+
+    /* check that file name doesn't contain \0 character */
+    if (memchr(file_name, 0, file_name_length) != NULL) {
+      ALOGW("Zip: entry name can't contain \\0 character");
+      goto bail;
+    }
 
     /* add the CDE filename to the hash table */
-    const uint8_t* file_name = ptr + sizeof(CentralDirectoryRecord);
     ZipEntryName entry_name;
     entry_name.name = file_name;
     entry_name.name_length = file_name_length;
@@ -888,6 +894,8 @@
 
 struct IterationHandle {
   uint32_t position;
+  // We're not using vector here because this code is used in the Windows SDK
+  // where the STL is not available.
   const uint8_t* prefix;
   uint16_t prefix_len;
   ZipArchive* archive;
@@ -897,13 +905,12 @@
   IterationHandle(const ZipEntryName& prefix_name)
       : prefix_len(prefix_name.name_length) {
     uint8_t* prefix_copy = new uint8_t[prefix_len];
-    memcpy(reinterpret_cast<void*>(prefix_copy), prefix_name.name,
-           prefix_len * sizeof(uint8_t));
+    memcpy(prefix_copy, prefix_name.name, prefix_len);
     prefix = prefix_copy;
   }
 
   ~IterationHandle() {
-    delete [] prefix;
+    delete[] prefix;
   }
 };