libarchive-clib 3.8.2 → 3.8.5
raw patch · 33 files changed
+272/−133 lines, 33 files
Files
- c/archive.h +2/−2
- c/archive_cryptor.c +3/−3
- c/archive_cryptor_private.h +2/−2
- c/archive_disk_acl_darwin.c +1/−2
- c/archive_entry.h +1/−1
- c/archive_read_disk_entry_from_file.c +6/−9
- c/archive_read_disk_posix.c +18/−17
- c/archive_read_disk_windows.c +8/−2
- c/archive_read_support_filter_lz4.c +69/−13
- c/archive_read_support_filter_uu.c +4/−4
- c/archive_read_support_filter_zstd.c +55/−12
- c/archive_read_support_format_7zip.c +7/−1
- c/archive_read_support_format_cab.c +1/−1
- c/archive_read_support_format_cpio.c +3/−3
- c/archive_read_support_format_lha.c +2/−2
- c/archive_read_support_format_mtree.c +7/−7
- c/archive_read_support_format_tar.c +1/−0
- c/archive_read_support_format_zip.c +17/−11
- c/archive_string.c +22/−2
- c/archive_string.h +4/−0
- c/archive_util.c +1/−1
- c/archive_version_details.c +1/−1
- c/archive_windows.c +3/−2
- c/archive_write.c +1/−1
- c/archive_write_disk_posix.c +16/−10
- c/archive_write_open_fd.c +1/−5
- c/archive_write_open_file.c +1/−5
- c/archive_write_open_filename.c +2/−0
- c/archive_write_open_memory.c +1/−5
- c/archive_write_set_format_shar.c +4/−1
- c/archive_write_set_format_ustar.c +1/−1
- c/archive_write_set_format_xar.c +6/−6
- libarchive-clib.cabal +1/−1
c/archive.h view
@@ -34,7 +34,7 @@ * assert that ARCHIVE_VERSION_NUMBER >= 2012108. */ /* Note: Compiler will complain if this does not match archive_entry.h! */-#define ARCHIVE_VERSION_NUMBER 3008002+#define ARCHIVE_VERSION_NUMBER 3008005 #include <sys/stat.h> #include <stddef.h> /* for wchar_t */@@ -177,7 +177,7 @@ /* * Textual name/version of the library, useful for version displays. */-#define ARCHIVE_VERSION_ONLY_STRING "3.8.2"+#define ARCHIVE_VERSION_ONLY_STRING "3.8.5" #define ARCHIVE_VERSION_STRING "libarchive " ARCHIVE_VERSION_ONLY_STRING __LA_DECL const char * archive_version_string(void);
c/archive_cryptor.c view
@@ -490,9 +490,9 @@ size_t in_len, uint8_t * const out, size_t *out_len) { uint8_t *const ebuf = ctx->encr_buf;- unsigned pos = ctx->encr_pos;- unsigned max = (unsigned)((in_len < *out_len)? in_len: *out_len);- unsigned i;+ size_t pos = ctx->encr_pos;+ size_t max = (in_len < *out_len)? in_len: *out_len;+ size_t i; for (i = 0; i < max; ) { if (pos == AES_BLOCK_SIZE) {
c/archive_cryptor_private.h view
@@ -56,10 +56,10 @@ typedef struct { CCCryptorRef ctx; uint8_t key[AES_MAX_KEY_SIZE];- unsigned key_len;+ size_t key_len; uint8_t nonce[AES_BLOCK_SIZE]; uint8_t encr_buf[AES_BLOCK_SIZE];- unsigned encr_pos;+ size_t encr_pos; } archive_crypto_ctx; #elif defined(_WIN32) && !defined(__CYGWIN__) && defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA
c/archive_disk_acl_darwin.c view
@@ -124,7 +124,6 @@ add_trivial_nfs4_acl(struct archive_entry *entry) { mode_t mode;- int i; const int rperm = ARCHIVE_ENTRY_ACL_READ_DATA; const int wperm = ARCHIVE_ENTRY_ACL_WRITE_DATA | ARCHIVE_ENTRY_ACL_APPEND_DATA;@@ -195,7 +194,7 @@ } else if ((mode & 0010) || (mode & 0001)) tacl_entry[1].permset |= eperm; - for (i = 0; i < sizeof(tacl_entry) / sizeof(tacl_entry[0]); i++) {+ for (size_t i = 0; i < sizeof(tacl_entry) / sizeof(tacl_entry[0]); i++) { if (tacl_entry[i].permset != 0) { archive_entry_acl_add_entry(entry, tacl_entry[i].type, tacl_entry[i].permset,
c/archive_entry.h view
@@ -28,7 +28,7 @@ #define ARCHIVE_ENTRY_H_INCLUDED /* Note: Compiler will complain if this does not match archive.h! */-#define ARCHIVE_VERSION_NUMBER 3008002+#define ARCHIVE_VERSION_NUMBER 3008005 /* * Note: archive_entry.h is for use outside of libarchive; the
c/archive_read_disk_entry_from_file.c view
@@ -254,7 +254,7 @@ if (S_ISLNK(st->st_mode)) { size_t linkbuffer_len = st->st_size; char *linkbuffer;- int lnklen;+ ssize_t lnklen; linkbuffer = malloc(linkbuffer_len + 1); if (linkbuffer == NULL) {@@ -358,12 +358,10 @@ return (ARCHIVE_OK); archive_string_init(&tempfile);- if (__archive_get_tempdir(&tempfile) != ARCHIVE_OK) {- ret = ARCHIVE_WARN;- goto cleanup;- }- archive_strcat(&tempfile, "tar.md.XXXXXX");- tempfd = mkstemp(tempfile.s);+ archive_strcpy(&tempfile, name);+ archive_string_dirname(&tempfile);+ archive_strcat(&tempfile, "/tar.XXXXXXXX");+ tempfd = __archive_mkstemp(tempfile.s); if (tempfd < 0) { archive_set_error(&a->archive, errno, "Could not open extended attribute file");@@ -894,7 +892,7 @@ for (iters = 0; ; ++iters) { int i, r; - r = ioctl(*fd, FS_IOC_FIEMAP, fm); + r = ioctl(*fd, FS_IOC_FIEMAP, fm); if (r < 0) { /* When something error happens, it is better we * should return ARCHIVE_OK because an earlier@@ -1081,4 +1079,3 @@ #endif #endif /* !defined(_WIN32) || defined(__CYGWIN__) */-
c/archive_read_disk_posix.c view
@@ -107,6 +107,8 @@ #define O_CLOEXEC 0 #endif +#define MAX_FILESYSTEM_ID 1000000+ #if defined(__hpux) && !defined(HAVE_DIRFD) #define dirfd(x) ((x)->__dd_fd) #define HAVE_DIRFD@@ -1412,8 +1414,12 @@ * This is the new filesystem which we have to generate a new ID for. */ fid = t->max_filesystem_id++;+ if (fid > MAX_FILESYSTEM_ID) {+ archive_set_error(&a->archive, ENOMEM, "Too many filesystems");+ return (ARCHIVE_FATAL);+ } if (t->max_filesystem_id > t->allocated_filesystem) {- size_t s;+ int s; void *p; s = t->max_filesystem_id * 2;@@ -1693,8 +1699,6 @@ #endif t->current_filesystem->noatime = 0; - /* Set maximum filename length. */- t->current_filesystem->name_max = svfs.f_namemax; return (ARCHIVE_OK); } @@ -2014,11 +2018,8 @@ } #endif /* F_DUPFD_CLOEXEC */ new_fd = dup(fd);- if (new_fd != -1) {- __archive_ensure_cloexec_flag(new_fd);- return (new_fd);- }- return (-1);+ __archive_ensure_cloexec_flag(new_fd);+ return (new_fd); } /*@@ -2140,16 +2141,11 @@ * so try again for execute. The consequences of not opening this are * unhelpful and unnecessary errors later. */- if (t->initial_dir_fd < 0) {+ if (t->initial_dir_fd < 0) t->initial_dir_fd = open(".", o_flag | O_CLOEXEC);- if (t->initial_dir_fd < 0)- return NULL;- } #endif __archive_ensure_cloexec_flag(t->initial_dir_fd); t->working_dir_fd = tree_dup(t->initial_dir_fd);- if (t->working_dir_fd < 0)- return NULL; return (t); } @@ -2355,15 +2351,20 @@ tree_dir_next_posix(struct tree *t) { int r;+#if defined(HAVE_FDOPENDIR)+ int fd;+#endif const char *name; size_t namelen; if (t->d == NULL) { #if defined(HAVE_FDOPENDIR)- int fd = tree_dup(t->working_dir_fd);- if (fd != -1)- t->d = fdopendir(fd);+ if (t->working_dir_fd >= 0) {+ fd = tree_dup(t->working_dir_fd);+ if (fd != -1)+ t->d = fdopendir(fd);+ } #else /* HAVE_FDOPENDIR */ if (tree_enter_working_dir(t) == 0) { t->d = opendir(".");
c/archive_read_disk_windows.c view
@@ -53,6 +53,8 @@ /* To deal with absolute symlink issues */ #define START_ABSOLUTE_SYMLINK_REPARSE L"\\??\\" +#define MAX_FILESYSTEM_ID 1000000+ /*- * This is a new directory-walking system that addresses a number * of problems I've had with fts(3). In particular, it has no@@ -1449,8 +1451,12 @@ * There is a new filesystem, we generate a new ID for. */ fid = t->max_filesystem_id++;+ if (fid > MAX_FILESYSTEM_ID) {+ archive_set_error(&a->archive, ENOMEM, "Too many filesystems");+ return (ARCHIVE_FATAL);+ } if (t->max_filesystem_id > t->allocated_filesystem) {- size_t s;+ int s; void *p; s = t->max_filesystem_id * 2;@@ -1462,7 +1468,7 @@ return (ARCHIVE_FATAL); } t->filesystem_table = (struct filesystem *)p;- t->allocated_filesystem = (int)s;+ t->allocated_filesystem = s; } t->current_filesystem_id = fid; t->current_filesystem = &(t->filesystem_table[fid]);
c/archive_read_support_filter_lz4.c view
@@ -49,9 +49,12 @@ #include "archive_xxhash.h" #define LZ4_MAGICNUMBER 0x184d2204-#define LZ4_SKIPPABLED 0x184d2a50 #define LZ4_LEGACY 0x184c2102 +// Note: LZ4 and zstd share the same skippable frame format with the same magic numbers.+#define LZ4_SKIPPABLE_START 0x184D2A50+#define LZ4_SKIPPABLE_MASK 0xFFFFFFF0+ #if defined(HAVE_LIBLZ4) struct private_data { enum { SELECT_STREAM,@@ -141,19 +144,67 @@ { const unsigned char *buffer; ssize_t avail;- int bits_checked;- uint32_t number;+ int bits_checked = 0;+ ssize_t min_lz4_archive_size = 11; - (void)self; /* UNUSED */+ // LZ4 skippable frames contain a 4 byte magic number followed by+ // a 4 byte frame data size, then that number of bytes of data. Regular+ // frames contain a 4 byte magic number followed by a 2-14 byte frame+ // header, some data, and a 3 byte end marker.+ ssize_t min_lz4_frame_size = 8; - /* Minimal lz4 archive is 11 bytes. */- buffer = __archive_read_filter_ahead(filter, 11, &avail);+ ssize_t offset_in_buffer = 0;+ ssize_t max_lookahead = 64 * 1024;++ (void)self; // UNUSED++ // Zstd and LZ4 skippable frame magic numbers are identical. To+ // differentiate these two, we need to look for a non-skippable+ // frame.++ // Minimal lz4 archive is 11 bytes.+ buffer = __archive_read_filter_ahead(filter, min_lz4_archive_size, &avail); if (buffer == NULL) return (0); - /* First four bytes must be LZ4 magic numbers. */- bits_checked = 0;- if ((number = archive_le32dec(buffer)) == LZ4_MAGICNUMBER) {+ uint32_t magic_number = archive_le32dec(buffer);++ while ((magic_number & LZ4_SKIPPABLE_MASK) == LZ4_SKIPPABLE_START) {++ offset_in_buffer += 4; // Skip over the magic number++ // Ensure that we can read another 4 bytes.+ if (offset_in_buffer + 4 > avail) {+ buffer = __archive_read_filter_ahead(filter, offset_in_buffer + 4, &avail);+ if (buffer == NULL)+ return (0);+ }++ uint32_t frame_data_size = archive_le32dec(buffer + offset_in_buffer);++ // Skip over the 4 frame data size bytes, plus the value stored there.+ offset_in_buffer += 4 + frame_data_size;++ // There should be at least one more frame if this is LZ4 data.+ if (offset_in_buffer + min_lz4_frame_size > avail) { // TODO: should this be >= ?+ if (offset_in_buffer + min_lz4_frame_size > max_lookahead)+ return (0); ++ buffer = __archive_read_filter_ahead(filter, offset_in_buffer + min_lz4_frame_size, &avail);+ if (buffer == NULL)+ return (0); + }++ magic_number = archive_le32dec(buffer + offset_in_buffer);+ }++ // We have skipped over any skippable frames. Either a regular LZ4 frame+ // follows, or this isn't LZ4 data.++ bits_checked = offset_in_buffer;+ buffer = buffer + offset_in_buffer;++ if (magic_number == LZ4_MAGICNUMBER) { unsigned char flag, BD; bits_checked += 32;@@ -175,11 +226,16 @@ if (BD & ~0x70) return (0); bits_checked += 8;- } else if (number == LZ4_LEGACY) {++ return (bits_checked);+ }++ if (magic_number == LZ4_LEGACY) { bits_checked += 32;+ return (bits_checked); }- - return (bits_checked);++ return (0); } #if !defined(HAVE_LIBLZ4)@@ -342,7 +398,7 @@ return lz4_filter_read_default_stream(self, p); else if (number == LZ4_LEGACY) return lz4_filter_read_legacy_stream(self, p);- else if ((number & ~0xF) == LZ4_SKIPPABLED) {+ else if ((number & LZ4_SKIPPABLE_MASK) == LZ4_SKIPPABLE_START) { read_buf = __archive_read_filter_ahead( self->upstream, 4, NULL); if (read_buf == NULL) {
c/archive_read_support_filter_uu.c view
@@ -232,8 +232,8 @@ size_t nbytes_req = (*ravail+1023) & ~1023U; ssize_t tested; - /* Increase reading bytes if it is not enough to at least- * new two lines. */+ /* Increase reading bytes if it is not enough for at least+ * two new lines. */ if (nbytes_req < (size_t)*ravail + 160) nbytes_req <<= 1; @@ -411,7 +411,7 @@ /* * Calculate a new buffer size for in_buff.- * Increase its value until it has enough size we need.+ * Increase its value until it is enough for our needs. */ newsize = uudecode->in_allocated; do {@@ -494,7 +494,7 @@ } /* * If there is remaining data which is saved by- * previous calling, use it first.+ * a previous call, use it first. */ if (ensure_in_buff_size(self, uudecode, avail_in + uudecode->in_cnt) != ARCHIVE_OK)
c/archive_read_support_filter_zstd.c view
@@ -110,24 +110,67 @@ { const unsigned char *buffer; ssize_t avail;- unsigned prefix; - /* Zstd frame magic values */- unsigned zstd_magic = 0xFD2FB528U;- unsigned zstd_magic_skippable_start = 0x184D2A50U;- unsigned zstd_magic_skippable_mask = 0xFFFFFFF0;+ // Zstandard skippable frames contain a 4 byte magic number followed by+ // a 4 byte frame data size, then that number of bytes of data. Regular+ // frames contain a 4 byte magic number followed by a 2-14 byte frame+ // header, some data, and a 3 byte end marker.+ ssize_t min_zstd_frame_size = 8; - (void) self; /* UNUSED */+ ssize_t offset_in_buffer = 0;+ ssize_t max_lookahead = 64 * 1024; - buffer = __archive_read_filter_ahead(filter, 4, &avail);+ // Zstd regular frame magic number.+ uint32_t zstd_magic = 0xFD2FB528U;++ // Note: Zstd and LZ4 skippable frame magic numbers are identical.+ // To differentiate these two, we need to look for a non-skippable+ // frame.+ uint32_t zstd_magic_skippable_start = 0x184D2A50;+ uint32_t zstd_magic_skippable_mask = 0xFFFFFFF0;++ (void) self; // UNUSED++ buffer = __archive_read_filter_ahead(filter, min_zstd_frame_size, &avail); if (buffer == NULL) return (0); - prefix = archive_le32dec(buffer);- if (prefix == zstd_magic)- return (32);- if ((prefix & zstd_magic_skippable_mask) == zstd_magic_skippable_start)- return (32);+ uint32_t magic_number = archive_le32dec(buffer);++ while ((magic_number & zstd_magic_skippable_mask) == zstd_magic_skippable_start) {++ offset_in_buffer += 4; // Skip over the magic number++ // Ensure that we can read another 4 bytes.+ if (offset_in_buffer + 4 > avail) {+ buffer = __archive_read_filter_ahead(filter, offset_in_buffer + 4, &avail);+ if (buffer == NULL)+ return (0);+ }++ uint32_t frame_data_size = archive_le32dec(buffer + offset_in_buffer);++ // Skip over the 4 frame data size bytes, plus the value stored there.+ offset_in_buffer += 4 + frame_data_size;++ // There should be at least one more frame if this is zstd data.+ if (offset_in_buffer + min_zstd_frame_size > avail) {+ if (offset_in_buffer + min_zstd_frame_size > max_lookahead)+ return (0);++ buffer = __archive_read_filter_ahead(filter, offset_in_buffer + min_zstd_frame_size, &avail);+ if (buffer == NULL)+ return (0);+ }++ magic_number = archive_le32dec(buffer + offset_in_buffer);+ }++ // We have skipped over any skippable frames. Either a regular zstd frame+ // follows, or this isn't zstd data.++ if (magic_number == zstd_magic)+ return (offset_in_buffer + 4); return (0); }
c/archive_read_support_format_7zip.c view
@@ -744,6 +744,7 @@ const char *h; char big_endian, format_64; ssize_t bytes, min_addr = SFX_MIN_ADDR;+ ssize_t request; uint64_t e_shoff, strtab_offset, strtab_size; uint16_t e_shentsize, e_shnum, e_shstrndx; uint16_t (*dec16)(const void *);@@ -796,7 +797,12 @@ if (__archive_read_seek(a, e_shoff, SEEK_SET) < 0) { break; }- h = __archive_read_ahead(a, (size_t)e_shnum * (size_t)e_shentsize, NULL);+ if (format_64) {+ request = (size_t)e_shnum * (size_t)e_shentsize + 0x28;+ } else {+ request = (size_t)e_shnum * (size_t)e_shentsize + 0x18;+ }+ h = __archive_read_ahead(a, request, &bytes); if (h == NULL) { break; }
c/archive_read_support_format_cab.c view
@@ -2813,7 +2813,7 @@ lzx_br_bits(&bre, mt_max_bits)); lzx_br_consume(&bre, mt_bitlen[c]); }- if (c > UCHAR_MAX)+ if ((unsigned int)c > UCHAR_MAX) break; /* * 'c' is exactly literal code.
c/archive_read_support_format_cpio.c view
@@ -825,9 +825,9 @@ } /*- * NOTE: if a filename suffix is ".z", it is the file gziped by afio.- * it would be nice that we can show uncompressed file size and we can- * uncompressed file contents automatically, unfortunately we have nothing+ * NOTE: if a filename suffix is ".z", it is a file gzipped by afio.+ * it would be nice if we could show uncompressed file size and+ * uncompress file contents automatically, unfortunately we have nothing * to get a uncompressed file size while reading each header. It means * we also cannot uncompress file contents under our framework. */
c/archive_read_support_format_lha.c view
@@ -689,7 +689,7 @@ * a pathname and a symlink has '\' character, a directory * separator in DOS/Windows. So we should convert it to '/'. */- if (p[H_LEVEL_OFFSET] == 0)+ if (lha->level == 0) lha_replace_path_separator(lha, entry); archive_entry_set_mode(entry, lha->mode);@@ -2374,7 +2374,7 @@ lzh_br_consume(&bre, lt_bitlen[c]); } blocks_avail--;- if (c > UCHAR_MAX)+ if ((unsigned int)c > UCHAR_MAX) /* Current block is a match data. */ break; /*
c/archive_read_support_format_mtree.c view
@@ -392,8 +392,8 @@ if (len >= MAX_LINE_LEN) return (-1); - /* Increase reading bytes if it is not enough to at least- * new two lines. */+ /* Increase reading bytes if it is not enough for at least+ * two new lines. */ if (nbytes_req < (size_t)*ravail + 160) nbytes_req <<= 1; @@ -568,8 +568,8 @@ --len; value = 1; }- /* A keyword should have a its value unless- * "/unset" operation. */ + /* A keyword should have a value unless this is+ * an "/unset" operation. */ if (!unset && value == 0) return (-1); }@@ -752,7 +752,7 @@ } else if (form_D == 1) { if (!last_is_path && keywords > 0) /* This this is not `form D'- * and We cannot accept mixed+ * and we cannot accept mixed * format. */ break; }@@ -805,7 +805,7 @@ * to read the entire mtree file into memory up front. * * The parsing is done in two steps. First, it is decided if a line- * changes the global defaults and if it is, processed accordingly.+ * changes the global defaults and if it does, it is processed accordingly. * Otherwise, the options of the line are merged with the current * global options. */@@ -1254,7 +1254,7 @@ archive_entry_filetype(entry) == AE_IFDIR) { mtree->fd = open(path, O_RDONLY | O_BINARY | O_CLOEXEC); __archive_ensure_cloexec_flag(mtree->fd);- if (mtree->fd < 0 && (+ if (mtree->fd == -1 && ( #if defined(_WIN32) && !defined(__CYGWIN__) /* * On Windows, attempting to open a file with an
c/archive_read_support_format_tar.c view
@@ -2311,6 +2311,7 @@ archive_string_init(&as); r = read_bytes_to_string(a, &as, value_length, &unconsumed); if (tar_flush_unconsumed(a, &unconsumed) != ARCHIVE_OK) {+ *result = 0; return (ARCHIVE_FATAL); } if (r < ARCHIVE_OK) {
c/archive_read_support_format_zip.c view
@@ -78,6 +78,12 @@ #include "archive_crc32.h" #endif +/* length of local file header, not including filename and extra */+#define ZIP_LOCHDR_LEN 30U++/* maximum length of Mac metadata in MiB */+#define ZIP_MAX_METADATA 10U+ struct zip_entry { struct archive_rb_node node; struct zip_entry *next;@@ -933,7 +939,7 @@ zip->init_default_conversion = 1; } - if ((p = __archive_read_ahead(a, 30, NULL)) == NULL) {+ if ((p = __archive_read_ahead(a, ZIP_LOCHDR_LEN, NULL)) == NULL) { archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "Truncated ZIP file header"); return (ARCHIVE_FATAL);@@ -969,7 +975,7 @@ filename_length = archive_le16dec(p + 26); extra_length = archive_le16dec(p + 28); - __archive_read_consume(a, 30);+ __archive_read_consume(a, ZIP_LOCHDR_LEN); /* Read the filename. */ if ((h = __archive_read_ahead(a, filename_length, NULL)) == NULL) {@@ -3637,7 +3643,7 @@ { uint16_t disk_num; uint32_t cd_size, cd_offset;- + disk_num = archive_le16dec(p + 4); cd_size = archive_le32dec(p + 12); cd_offset = archive_le32dec(p + 16);@@ -4097,7 +4103,7 @@ const char *p; ssize_t filename_length, extra_length; - if ((p = __archive_read_ahead(a, extra + 30, NULL)) == NULL) {+ if ((p = __archive_read_ahead(a, extra + ZIP_LOCHDR_LEN, NULL)) == NULL) { archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "Truncated ZIP file header"); return (ARCHIVE_WARN);@@ -4111,7 +4117,7 @@ filename_length = archive_le16dec(p + 26); extra_length = archive_le16dec(p + 28); - return (30 + filename_length + extra_length);+ return (ZIP_LOCHDR_LEN + filename_length + extra_length); } static int@@ -4148,16 +4154,16 @@ return (ARCHIVE_WARN); } - if (rsrc->uncompressed_size > (4 * 1024 * 1024)) {+ if (rsrc->uncompressed_size > ZIP_MAX_METADATA * 1048576U) { archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,- "Mac metadata is too large: %jd > 4M bytes",- (intmax_t)rsrc->uncompressed_size);+ "Mac metadata is too large: %jd > %u MiB",+ (intmax_t)rsrc->uncompressed_size, ZIP_MAX_METADATA); return (ARCHIVE_WARN); }- if (rsrc->compressed_size > (4 * 1024 * 1024)) {+ if (rsrc->compressed_size > ZIP_MAX_METADATA * 1048576U) { archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,- "Mac metadata is too large: %jd > 4M bytes",- (intmax_t)rsrc->compressed_size);+ "Mac metadata is too large: %jd > %u MiB",+ (intmax_t)rsrc->compressed_size, ZIP_MAX_METADATA); return (ARCHIVE_WARN); }
c/archive_string.c view
@@ -2054,6 +2054,26 @@ return (r); } +struct archive_string *+archive_string_dirname(struct archive_string *as)+{+ /* strip trailing separators */+ while (as->length > 1 && as->s[as->length - 1] == '/')+ as->length--;+ /* strip final component */+ while (as->length > 0 && as->s[as->length - 1] != '/')+ as->length--;+ /* empty path -> cwd */+ if (as->length == 0)+ return (archive_strcat(as, "."));+ /* strip separator(s) */+ while (as->length > 1 && as->s[as->length - 1] == '/')+ as->length--;+ /* terminate */+ as->s[as->length] = '\0';+ return (as);+}+ #if HAVE_ICONV /*@@ -3553,7 +3573,7 @@ if (sc->to_cp == CP_C_LOCALE) { /*- * "C" locale special process.+ * "C" locale special processing. */ u16 = _p; ll = 0;@@ -3670,7 +3690,7 @@ avail = as16->buffer_length - 2; if (sc->from_cp == CP_C_LOCALE) { /*- * "C" locale special process.+ * "C" locale special processing. */ count = 0; while (count < length && *s) {
c/archive_string.h view
@@ -192,6 +192,10 @@ void archive_string_sprintf(struct archive_string *, const char *, ...) __LA_PRINTF(2, 3); +/* Equivalent to dirname(3) */+struct archive_string *+archive_string_dirname(struct archive_string *);+ /* Translates from MBS to Unicode. */ /* Returns non-zero if conversion failed in any way. */ int archive_wstring_append_from_mbs(struct archive_wstring *dest,
c/archive_util.c view
@@ -456,7 +456,7 @@ return (-1); if (ruid != euid || ruid != suid) return (1);- if (getresgid(&ruid, &egid, &sgid) != 0)+ if (getresgid(&rgid, &egid, &sgid) != 0) return (-1); if (rgid != egid || rgid != sgid) return (1);
c/archive_version_details.c view
@@ -333,7 +333,7 @@ const char * archive_libxml2_version(void) {-#if HAVE_LIBXML_XMLREADER_H && HAVE_LIBXML2+#if HAVE_LIBXML_XMLVERSION_H && HAVE_LIBXML2 return LIBXML_DOTTED_VERSION; #else return NULL;
c/archive_windows.c view
@@ -253,7 +253,7 @@ createExParams.dwSize = sizeof(createExParams); createExParams.dwFileAttributes = dwFlagsAndAttributes & 0xFFFF; createExParams.dwFileFlags = dwFlagsAndAttributes & 0xFFF00000;- createExParams.dwSecurityQosFlags = dwFlagsAndAttributes & 0x000F00000;+ createExParams.dwSecurityQosFlags = dwFlagsAndAttributes & 0x000F0000; createExParams.lpSecurityAttributes = lpSecurityAttributes; createExParams.hTemplateFile = hTemplateFile; handle = CreateFile2(wpath, dwDesiredAccess, dwShareMode,@@ -747,7 +747,8 @@ int ret; ret = __hstat((HANDLE)_get_osfhandle(fd), &u);- copy_seek_stat(st, &u);+ if (ret >= 0)+ copy_seek_stat(st, &u); return (ret); }
c/archive_write.c view
@@ -821,7 +821,7 @@ { struct archive_write *a = (struct archive_write *)_a; const size_t max_write = INT_MAX;- int ret;+ ssize_t ret; archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC, ARCHIVE_STATE_DATA, "archive_write_data");
c/archive_write_disk_posix.c view
@@ -412,12 +412,14 @@ static int la_mktemp(struct archive_write_disk *a) {+ struct archive_string *tmp = &a->_tmpname_data; int oerrno, fd; mode_t mode; - archive_string_empty(&a->_tmpname_data);- archive_string_sprintf(&a->_tmpname_data, "%s.XXXXXX", a->name);- a->tmpname = a->_tmpname_data.s;+ archive_strcpy(tmp, a->name);+ archive_string_dirname(tmp);+ archive_strcat(tmp, "/tar.XXXXXXXX");+ a->tmpname = tmp->s; fd = __archive_mkstemp(a->tmpname); if (fd == -1)@@ -2559,9 +2561,9 @@ * for directories. For other file types * we need to verify via fstat() or lstat() */- if (fd < 0 || p->filetype != AE_IFDIR) {+ if (fd == -1 || p->filetype != AE_IFDIR) { #if HAVE_FSTAT- if (fd >= 0 && (+ if (fd > 0 && ( fstat(fd, &st) != 0 || la_verify_filetype(st.st_mode, p->filetype) == 0)) {@@ -4287,8 +4289,10 @@ int tmpfd; archive_string_init(&tmpdatafork);- archive_strcpy(&tmpdatafork, "tar.md.XXXXXX");- tmpfd = mkstemp(tmpdatafork.s);+ archive_strcpy(&tmpdatafork, pathname);+ archive_string_dirname(&tmpdatafork);+ archive_strcat(&tmpdatafork, "/tar.XXXXXXXX");+ tmpfd = __archive_mkstemp(tmpdatafork.s); if (tmpfd < 0) { archive_set_error(&a->archive, errno, "Failed to mkstemp");@@ -4367,8 +4371,10 @@ * silly dance of writing the data to disk just so that * copyfile() can read it back in again. */ archive_string_init(&tmp);- archive_strcpy(&tmp, "tar.mmd.XXXXXX");- fd = mkstemp(tmp.s);+ archive_strcpy(&tmp, pathname);+ archive_string_dirname(&tmp);+ archive_strcat(&tmp, "/tar.XXXXXXXX");+ fd = __archive_mkstemp(tmp.s); if (fd < 0) { archive_set_error(&a->archive, errno,@@ -4441,7 +4447,7 @@ */ fd = open(pathname, O_RDONLY | O_BINARY | O_CLOEXEC); __archive_ensure_cloexec_flag(fd);- if (fd < 0) {+ if (fd == -1) { archive_set_error(&a->archive, errno, "Failed to open a restoring file"); ret = ARCHIVE_WARN;
c/archive_write_open_fd.c view
@@ -135,11 +135,7 @@ static int file_free(struct archive *a, void *client_data) {- struct write_fd_data *mine = (struct write_fd_data *)client_data;- (void)a; /* UNUSED */- if (mine == NULL)- return (ARCHIVE_OK);- free(mine);+ free(client_data); return (ARCHIVE_OK); }
c/archive_write_open_file.c view
@@ -96,11 +96,7 @@ static int file_free(struct archive *a, void *client_data) {- struct write_FILE_data *mine = client_data;- (void)a; /* UNUSED */- if (mine == NULL)- return (ARCHIVE_OK);- free(mine);+ free(client_data); return (ARCHIVE_OK); }
c/archive_write_open_filename.c view
@@ -191,6 +191,8 @@ archive_set_error(a, errno, "Couldn't stat '%s'", mbs); else archive_set_error(a, errno, "Couldn't stat '%ls'", wcs);+ close(mine->fd);+ mine->fd = -1; return (ARCHIVE_FATAL); }
c/archive_write_open_memory.c view
@@ -104,11 +104,7 @@ static int memory_write_free(struct archive *a, void *client_data) {- struct write_memory_data *mine; (void)a; /* UNUSED */- mine = client_data;- if (mine == NULL)- return (ARCHIVE_OK);- free(mine);+ free(client_data); return (ARCHIVE_OK); }
c/archive_write_set_format_shar.c view
@@ -144,7 +144,9 @@ struct archive_write *a = (struct archive_write *)_a; struct shar *shar; - archive_write_set_format_shar(&a->archive);+ int ret = archive_write_set_format_shar(&a->archive);+ if (ret != ARCHIVE_OK)+ return ret; shar = (struct shar *)a->format_data; shar->dump = 1; a->format_write_data = archive_write_shar_data_uuencode;@@ -240,6 +242,7 @@ shar_quote(&shar->work, p, 1); archive_strcat(&shar->work, " > /dev/null 2>&1\n");+ free(shar->last_dir); shar->last_dir = p; } } else {
c/archive_write_set_format_ustar.c view
@@ -539,7 +539,7 @@ ret = ARCHIVE_WARN; } if (copy_length > 0) {- if (strlen(p) > USTAR_gname_size) {+ if (copy_length > USTAR_gname_size) { if (tartype != 'x') { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "Group name too long");
c/archive_write_set_format_xar.c view
@@ -1000,13 +1000,13 @@ const char *encname; int r; - r = xmlwrite_fstring(a, writer, "length", "%ju", heap->length);+ r = xmlwrite_fstring(a, writer, "length", "%ju", (uintmax_t)heap->length); if (r < 0) return (ARCHIVE_FATAL);- r = xmlwrite_fstring(a, writer, "offset", "%ju", heap->temp_offset);+ r = xmlwrite_fstring(a, writer, "offset", "%ju", (uintmax_t)heap->temp_offset); if (r < 0) return (ARCHIVE_FATAL);- r = xmlwrite_fstring(a, writer, "size", "%ju", heap->size);+ r = xmlwrite_fstring(a, writer, "size", "%ju", (uintmax_t)heap->size); if (r < 0) return (ARCHIVE_FATAL); switch (heap->compression) {@@ -1356,7 +1356,7 @@ * Make a inode entry, "<inode>". */ r = xmlwrite_fstring(a, writer, "inode",- "%jd", archive_entry_ino64(file->entry));+ "%jd", (intmax_t)archive_entry_ino64(file->entry)); if (r < 0) return (ARCHIVE_FATAL); if (archive_entry_dev(file->entry) != 0) {@@ -1378,7 +1378,7 @@ * Make a user entry, "<uid>" and "<user>. */ r = xmlwrite_fstring(a, writer, "uid",- "%d", archive_entry_uid(file->entry));+ "%jd", (intmax_t)archive_entry_uid(file->entry)); if (r < 0) return (ARCHIVE_FATAL); r = archive_entry_uname_l(file->entry, &p, &len, xar->sconv);@@ -1404,7 +1404,7 @@ * Make a group entry, "<gid>" and "<group>. */ r = xmlwrite_fstring(a, writer, "gid",- "%d", archive_entry_gid(file->entry));+ "%jd", (intmax_t)archive_entry_gid(file->entry)); if (r < 0) return (ARCHIVE_FATAL); r = archive_entry_gname_l(file->entry, &p, &len, xar->sconv);
libarchive-clib.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.0 name: libarchive-clib-version: 3.8.2+version: 3.8.5 license: OtherLicense license-file: LICENSE copyright: Copyright: (c) 2018-2020 Vanessa McHale