]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
applying remarks
authorMasalskaya, Anna <anna.masalskaya@intel.com>
Mon, 14 Sep 2020 21:32:46 +0000 (00:32 +0300)
committerMasalskaya, Anna <anna.masalskaya@intel.com>
Mon, 14 Sep 2020 21:32:46 +0000 (00:32 +0300)
libarchive/archive_read_support_format_zip.c

index 70342b7847ffe7fe3e952f78ba01e0ee569c4cf9..e17e46f3ad7bfd396b0298f9192477774a2d0332 100644 (file)
@@ -904,56 +904,56 @@ process_extra(struct archive_read *a, struct archive_entry *entry,
  */
 static int
 zipx_lzma_uncompress_buffer(const char *compressed_buffer, size_t compressed_buffer_size,
-  char *uncompressed_buffer, size_t uncompressed_buffer_size)
+       char *uncompressed_buffer, size_t uncompressed_buffer_size)
 {
-  int status = ARCHIVE_FATAL;
-  size_t lzma_params_length = 5; // length of 'lzma properties data' in lzma compressed data segment (stream) inside zip archive
-  size_t lzma_params_offset = 4; // offset of 'lzma properties data' from the beginning of lzma stream
-  size_t lzma_params_end = lzma_params_offset + lzma_params_length; // end position of 'lzma properties data' in lzma stream
-  if (compressed_buffer == NULL || compressed_buffer_size < lzma_params_end || uncompressed_buffer == NULL)
-    return status;
-
-  // prepare header for lzma_alone_decoder to replace zipx header (see comments in 'zipx_lzma_alone_init' for justification)
+       int status = ARCHIVE_FATAL;
+       size_t lzma_params_length = 5; // length of 'lzma properties data' in lzma compressed data segment (stream) inside zip archive
+       size_t lzma_params_offset = 4; // offset of 'lzma properties data' from the beginning of lzma stream
+       size_t lzma_params_end = lzma_params_offset + lzma_params_length; // end position of 'lzma properties data' in lzma stream
+       if (compressed_buffer == NULL || compressed_buffer_size < lzma_params_end || uncompressed_buffer == NULL)
+               return status;
+
+       // prepare header for lzma_alone_decoder to replace zipx header (see comments in 'zipx_lzma_alone_init' for justification)
 #pragma pack(push)
 #pragma pack(1)
-  struct _alone_header
-  {
-    uint8_t bytes[5]; // lzma_params_length
-    uint64_t uncompressed_size;
-  } alone_header;
+       struct _alone_header
+       {
+               uint8_t bytes[5]; // lzma_params_length
+               uint64_t uncompressed_size;
+       } alone_header;
 #pragma pack(pop)
-  // copy 'lzma properties data' blob
-  memcpy(&alone_header.bytes[0], compressed_buffer + lzma_params_offset, lzma_params_length);
-  alone_header.uncompressed_size = UINT64_MAX;
-
-  // prepare new compressed buffer, see 'zipx_lzma_alone_init' for details
-  int lzma_alone_buffer_size = compressed_buffer_size - lzma_params_end + sizeof(alone_header);
-  unsigned char *lzma_alone_compressed_buffer = (unsigned char*) malloc(lzma_alone_buffer_size);
-  if (lzma_alone_compressed_buffer == NULL)
-    return status;
-  // copy lzma_alone header into new buffer
-  memcpy(lzma_alone_compressed_buffer, (void*) &alone_header, sizeof(alone_header));
-  // copy compressed data into new buffer
-  memcpy(lzma_alone_compressed_buffer + sizeof(alone_header), compressed_buffer + lzma_params_end, compressed_buffer_size - lzma_params_end);
-
-  // create and fill in lzma_alone_decoder stream
-  lzma_stream stream = LZMA_STREAM_INIT;
-  lzma_ret ret = lzma_alone_decoder(&stream, UINT64_MAX);
-  if (ret == LZMA_OK)
-  {
-    stream.next_in = lzma_alone_compressed_buffer;
-    stream.avail_in = lzma_alone_buffer_size;
-    stream.total_in = 0;
-    stream.next_out = (unsigned char*)uncompressed_buffer;
-    stream.avail_out = uncompressed_buffer_size;
-    stream.total_out = 0;
-    ret = lzma_code(&stream, LZMA_RUN);
-    if (ret == LZMA_OK || ret == LZMA_STREAM_END)
-      status = ARCHIVE_OK;
-  }
-  lzma_end(&stream);
-  free(lzma_alone_compressed_buffer);
-  return status;
+       // copy 'lzma properties data' blob
+       memcpy(&alone_header.bytes[0], compressed_buffer + lzma_params_offset, lzma_params_length);
+       alone_header.uncompressed_size = UINT64_MAX;
+
+       // prepare new compressed buffer, see 'zipx_lzma_alone_init' for details
+       size_t lzma_alone_buffer_size = compressed_buffer_size - lzma_params_end + sizeof(alone_header);
+       unsigned char *lzma_alone_compressed_buffer = (unsigned char*) malloc(lzma_alone_buffer_size);
+       if (lzma_alone_compressed_buffer == NULL)
+               return status;
+       // copy lzma_alone header into new buffer
+       memcpy(lzma_alone_compressed_buffer, (void*) &alone_header, sizeof(alone_header));
+       // copy compressed data into new buffer
+       memcpy(lzma_alone_compressed_buffer + sizeof(alone_header), compressed_buffer + lzma_params_end, compressed_buffer_size - lzma_params_end);
+
+       // create and fill in lzma_alone_decoder stream
+       lzma_stream stream = LZMA_STREAM_INIT;
+       lzma_ret ret = lzma_alone_decoder(&stream, UINT64_MAX);
+       if (ret == LZMA_OK)
+       {
+               stream.next_in = lzma_alone_compressed_buffer;
+               stream.avail_in = lzma_alone_buffer_size;
+               stream.total_in = 0;
+               stream.next_out = (unsigned char*)uncompressed_buffer;
+               stream.avail_out = uncompressed_buffer_size;
+               stream.total_out = 0;
+               ret = lzma_code(&stream, LZMA_RUN);
+               if (ret == LZMA_OK || ret == LZMA_STREAM_END)
+                       status = ARCHIVE_OK;
+       }
+       lzma_end(&stream);
+       free(lzma_alone_compressed_buffer);
+       return status;
 }
 
 /*
@@ -1231,33 +1231,40 @@ zip_read_local_file_header(struct archive_read *a, struct archive_entry *entry,
                        return ARCHIVE_FATAL;
                }
 
-    size_t linkname_full_length = linkname_length; // take into account compression if any
-    if (zip->entry->compression != 0) // symlink target string appeared to be compressed
-    {
-      int status = ARCHIVE_FATAL;
-      char *uncompressed_buffer = (char*) malloc(zip_entry->uncompressed_size);
-      if (uncompressed_buffer == NULL)
-      {
-        archive_set_error(&a->archive, ENOMEM, "No memory for lzma decompression");
-        return status;
-      }
-
-      switch (zip->entry->compression)
-      {
+               size_t linkname_full_length = linkname_length; // take into account compression if any
+               if (zip->entry->compression != 0) // symlink target string appeared to be compressed
+               {
+                       int status = ARCHIVE_FATAL;
+                       char *uncompressed_buffer = (char*) malloc(zip_entry->uncompressed_size);
+                       if (uncompressed_buffer == NULL)
+                       {
+                               archive_set_error(&a->archive, ENOMEM, "No memory for lzma decompression");
+                               return status;
+                       }
+
+                       switch (zip->entry->compression)
+                       {
 #if HAVE_LZMA_H && HAVE_LIBLZMA
-        case 14: /* ZIPx LZMA compression. (see zip file format specification, section 4.4.5)*/
-          status = zipx_lzma_uncompress_buffer(p, linkname_length, uncompressed_buffer, (size_t)zip_entry->uncompressed_size);
-          break;
+                               case 14: /* ZIPx LZMA compression. (see zip file format specification, section 4.4.5)*/
+                                       status = zipx_lzma_uncompress_buffer(p, linkname_length, uncompressed_buffer, (size_t)zip_entry->uncompressed_size);
+                                       break;
 #endif
-        default: /* Unsupported compression. */
-          break;
-      }
-      if (status == ARCHIVE_OK)
-      {
-        p = uncompressed_buffer;
-        linkname_full_length = (size_t)zip_entry->uncompressed_size;
-      }
-    }
+                               default: /* Unsupported compression. */
+                                       break;
+                       }
+                       if (status == ARCHIVE_OK)
+                       {
+                               p = uncompressed_buffer;
+                               linkname_full_length = (size_t)zip_entry->uncompressed_size;
+                       }
+                       else
+                       {
+                               archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
+                                       "Unsupported ZIP compression method during decompression of link entry (%d: %s)",
+                                       zip->entry->compression, compression_name(zip->entry->compression));
+                               return ARCHIVE_FAILED;
+                       }
+               }
 
                sconv = zip->sconv;
                if (sconv == NULL && (zip->entry->zip_flags & ZIP_UTF8_NAME))