From 22b142341b3d75630d6e3317141aa1297cfcde21 Mon Sep 17 00:00:00 2001 From: "Masalskaya, Anna" Date: Tue, 15 Sep 2020 00:32:46 +0300 Subject: [PATCH] applying remarks --- libarchive/archive_read_support_format_zip.c | 149 ++++++++++--------- 1 file changed, 78 insertions(+), 71 deletions(-) diff --git a/libarchive/archive_read_support_format_zip.c b/libarchive/archive_read_support_format_zip.c index 70342b784..e17e46f3a 100644 --- a/libarchive/archive_read_support_format_zip.c +++ b/libarchive/archive_read_support_format_zip.c @@ -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)) -- 2.47.2