packages feed

libarchive 3.0.1.1 → 3.0.2.0

raw patch · 53 files changed

+1021/−339 lines, 53 files

Files

CHANGELOG.md view
@@ -1,5 +1,13 @@ # libarchive +# 3.0.2.0++  * Upgrade bundled `libarchive` to 3.5.0+  * Require `librachive >= 3.5.0`+  * Add `archiveReadSupportFilterByCode` and `archiveWriteOpen2`+  * Add `ArchiveFreeCallback` type+  * Add `ArchiveEntryDigest` sum type+ ## 3.0.1.1    * Add `Internal` modules
c/archive.h view
@@ -36,7 +36,7 @@  * assert that ARCHIVE_VERSION_NUMBER >= 2012108.  */ /* Note: Compiler will complain if this does not match archive_entry.h! */-#define	ARCHIVE_VERSION_NUMBER 3004003+#define	ARCHIVE_VERSION_NUMBER 3005000  #include <sys/stat.h> #include <stddef.h>  /* for wchar_t */@@ -155,7 +155,7 @@ /*  * Textual name/version of the library, useful for version displays.  */-#define	ARCHIVE_VERSION_ONLY_STRING "3.4.3"+#define	ARCHIVE_VERSION_ONLY_STRING "3.5.0" #define	ARCHIVE_VERSION_STRING "libarchive " ARCHIVE_VERSION_ONLY_STRING __LA_DECL const char *	archive_version_string(void); @@ -246,6 +246,8 @@  typedef int	archive_close_callback(struct archive *, void *_client_data); +typedef int	archive_free_callback(struct archive *, void *_client_data);+ /* Switches from one client data object to the next/prev client data object.  * This is useful for reading from different data blocks such as a set of files  * that make up one large file.@@ -418,6 +420,7 @@ #endif  __LA_DECL int archive_read_support_filter_all(struct archive *);+__LA_DECL int archive_read_support_filter_by_code(struct archive *, int); __LA_DECL int archive_read_support_filter_bzip2(struct archive *); __LA_DECL int archive_read_support_filter_compress(struct archive *); __LA_DECL int archive_read_support_filter_gzip(struct archive *);@@ -817,9 +820,13 @@ __LA_DECL int archive_write_set_format_filter_by_ext_def(struct archive *a, const char *filename, const char * def_ext); __LA_DECL int archive_write_zip_set_compression_deflate(struct archive *); __LA_DECL int archive_write_zip_set_compression_store(struct archive *);+/* Deprecated; use archive_write_open2 instead */ __LA_DECL int archive_write_open(struct archive *, void *, 		     archive_open_callback *, archive_write_callback *, 		     archive_close_callback *);+__LA_DECL int archive_write_open2(struct archive *, void *,+		     archive_open_callback *, archive_write_callback *,+		     archive_close_callback *, archive_free_callback *); __LA_DECL int archive_write_open_fd(struct archive *, int _fd); __LA_DECL int archive_write_open_filename(struct archive *, const char *_file); __LA_DECL int archive_write_open_filename_w(struct archive *,
c/archive_acl.c view
@@ -595,7 +595,7 @@ 				else 					length += sizeof(uid_t) * 3 + 1; 			} else {-				r = archive_mstring_get_mbs_l(&ap->name, &name,+				r = archive_mstring_get_mbs_l(a, &ap->name, &name, 				    &len, sc); 				if (r != 0) 					return (0);@@ -968,7 +968,7 @@ 		else 			prefix = NULL; 		r = archive_mstring_get_mbs_l(-		    &ap->name, &name, &len, sc);+		    NULL, &ap->name, &name, &len, sc); 		if (r != 0) { 			free(s); 			return (NULL);@@ -1402,14 +1402,14 @@ 	if (start >= end) 		return (0); 	while (start < end) {-		if (*start < '0' || *start > '9')+		if (*start < L'0' || *start > L'9') 			return (0); 		if (n > (INT_MAX / 10) ||-		    (n == INT_MAX / 10 && (*start - '0') > INT_MAX % 10)) {+		    (n == INT_MAX / 10 && (*start - L'0') > INT_MAX % 10)) { 			n = INT_MAX; 		} else { 			n *= 10;-			n += *start - '0';+			n += *start - L'0'; 		} 		start++; 	}
c/archive_check_magic.c view
@@ -54,7 +54,7 @@ 	ssize_t written;  	while (s > 0) {-		written = write(2, m, strlen(m));+		written = write(2, m, s); 		if (written <= 0) 			return; 		m += written;
c/archive_cryptor.c view
@@ -347,8 +347,31 @@ static int aes_ctr_encrypt_counter(archive_crypto_ctx *ctx) {+#if NETTLE_VERSION_MAJOR < 3 	aes_set_encrypt_key(&ctx->ctx, ctx->key_len, ctx->key); 	aes_encrypt(&ctx->ctx, AES_BLOCK_SIZE, ctx->encr_buf, ctx->nonce);+#else+	switch(ctx->key_len) {+	case AES128_KEY_SIZE:+		aes128_set_encrypt_key(&ctx->ctx.c128, ctx->key);+		aes128_encrypt(&ctx->ctx.c128, AES_BLOCK_SIZE, ctx->encr_buf,+		    ctx->nonce);+		break;+	case AES192_KEY_SIZE:+		aes192_set_encrypt_key(&ctx->ctx.c192, ctx->key);+		aes192_encrypt(&ctx->ctx.c192, AES_BLOCK_SIZE, ctx->encr_buf,+		    ctx->nonce);+		break;+	case AES256_KEY_SIZE:+		aes256_set_encrypt_key(&ctx->ctx.c256, ctx->key);+		aes256_encrypt(&ctx->ctx.c256, AES_BLOCK_SIZE, ctx->encr_buf,+		    ctx->nonce);+		break;+	default:+		return -1;+		break;+	}+#endif 	return 0; } 
c/archive_cryptor_private.h view
@@ -104,9 +104,18 @@ #include <nettle/pbkdf2.h> #endif #include <nettle/aes.h>+#include <nettle/version.h>  typedef struct {+#if NETTLE_VERSION_MAJOR < 3 	struct aes_ctx	ctx;+#else+	union {+		struct aes128_ctx c128;+		struct aes192_ctx c192;+		struct aes256_ctx c256;+	}		ctx;+#endif 	uint8_t		key[AES_MAX_KEY_SIZE]; 	unsigned	key_len; 	uint8_t		nonce[AES_BLOCK_SIZE];
c/archive_digest_private.h view
@@ -30,6 +30,10 @@ #ifndef __LIBARCHIVE_BUILD #error This header is only to be used internally to libarchive. #endif+#ifndef __LIBARCHIVE_CONFIG_H_INCLUDED+#error "Should have include config.h first!"+#endif+ /*  * Crypto support in various Operating Systems:  *
c/archive_entry.c view
@@ -208,6 +208,19 @@  	/* Copy encryption status */ 	entry2->encryption = entry->encryption;++	/* Copy digests */+#define copy_digest(_e2, _e, _t) \+	memcpy(_e2->digest._t, _e->digest._t, sizeof(_e2->digest._t))++	copy_digest(entry2, entry, md5);+	copy_digest(entry2, entry, rmd160);+	copy_digest(entry2, entry, sha1);+	copy_digest(entry2, entry, sha256);+	copy_digest(entry2, entry, sha384);+	copy_digest(entry2, entry, sha512);++#undef copy_digest 	 	/* Copy ACL data over. */ 	archive_acl_copy(&entry2->acl, &entry->acl);@@ -450,7 +463,7 @@ _archive_entry_gname_l(struct archive_entry *entry,     const char **p, size_t *len, struct archive_string_conv *sc) {-	return (archive_mstring_get_mbs_l(&entry->ae_gname, p, len, sc));+	return (archive_mstring_get_mbs_l(entry->archive, &entry->ae_gname, p, len, sc)); }  const char *@@ -504,7 +517,7 @@ 		*len = 0; 		return (0); 	}-	return (archive_mstring_get_mbs_l(&entry->ae_hardlink, p, len, sc));+	return (archive_mstring_get_mbs_l(entry->archive, &entry->ae_hardlink, p, len, sc)); }  la_int64_t@@ -595,7 +608,7 @@ _archive_entry_pathname_l(struct archive_entry *entry,     const char **p, size_t *len, struct archive_string_conv *sc) {-	return (archive_mstring_get_mbs_l(&entry->ae_pathname, p, len, sc));+	return (archive_mstring_get_mbs_l(entry->archive, &entry->ae_pathname, p, len, sc)); }  __LA_MODE_T@@ -723,7 +736,7 @@ 		*len = 0; 		return (0); 	}-	return (archive_mstring_get_mbs_l( &entry->ae_symlink, p, len, sc));+	return (archive_mstring_get_mbs_l(entry->archive, &entry->ae_symlink, p, len, sc)); }  la_int64_t@@ -769,7 +782,7 @@ _archive_entry_uname_l(struct archive_entry *entry,     const char **p, size_t *len, struct archive_string_conv *sc) {-	return (archive_mstring_get_mbs_l(&entry->ae_uname, p, len, sc));+	return (archive_mstring_get_mbs_l(entry->archive, &entry->ae_uname, p, len, sc)); }  int@@ -1414,6 +1427,62 @@       abort();     memcpy(entry->mac_metadata, p, s);   }+}++/* Digest handling */+const unsigned char *+archive_entry_digest(struct archive_entry *entry, int type)+{+	switch (type) {+	case ARCHIVE_ENTRY_DIGEST_MD5:+		return entry->digest.md5;+	case ARCHIVE_ENTRY_DIGEST_RMD160:+		return entry->digest.rmd160;+	case ARCHIVE_ENTRY_DIGEST_SHA1:+		return entry->digest.sha1;+	case ARCHIVE_ENTRY_DIGEST_SHA256:+		return entry->digest.sha256;+	case ARCHIVE_ENTRY_DIGEST_SHA384:+		return entry->digest.sha384;+	case ARCHIVE_ENTRY_DIGEST_SHA512:+		return entry->digest.sha512;+	default:+		return NULL;+	}+}++int+archive_entry_set_digest(struct archive_entry *entry, int type,+    const unsigned char *digest)+{+#define copy_digest(_e, _t, _d)\+	memcpy(_e->digest._t, _d, sizeof(_e->digest._t))++	switch (type) {+	case ARCHIVE_ENTRY_DIGEST_MD5:+		copy_digest(entry, md5, digest);+		break;+	case ARCHIVE_ENTRY_DIGEST_RMD160:+		copy_digest(entry, rmd160, digest);+		break;+	case ARCHIVE_ENTRY_DIGEST_SHA1:+		copy_digest(entry, sha1, digest);+		break;+	case ARCHIVE_ENTRY_DIGEST_SHA256:+		copy_digest(entry, sha256, digest);+		break;+	case ARCHIVE_ENTRY_DIGEST_SHA384:+		copy_digest(entry, sha384, digest);+		break;+	case ARCHIVE_ENTRY_DIGEST_SHA512:+		copy_digest(entry, sha512, digest);+		break;+	default:+		return ARCHIVE_WARN;+	}++	return ARCHIVE_OK;+#undef copy_digest }  /*
c/archive_entry.h view
@@ -30,7 +30,7 @@ #define	ARCHIVE_ENTRY_H_INCLUDED  /* Note: Compiler will complain if this does not match archive.h! */-#define	ARCHIVE_VERSION_NUMBER 3004003+#define	ARCHIVE_VERSION_NUMBER 3005000  /*  * Note: archive_entry.h is for use outside of libarchive; the@@ -395,6 +395,19 @@  __LA_DECL const void * archive_entry_mac_metadata(struct archive_entry *, size_t *); __LA_DECL void archive_entry_copy_mac_metadata(struct archive_entry *, const void *, size_t);++/*+ * Digest routine. This is used to query the raw hex digest for the+ * given entry. The type of digest is provided as an argument.+ */+#define ARCHIVE_ENTRY_DIGEST_MD5              0x00000001+#define ARCHIVE_ENTRY_DIGEST_RMD160           0x00000002+#define ARCHIVE_ENTRY_DIGEST_SHA1             0x00000003+#define ARCHIVE_ENTRY_DIGEST_SHA256           0x00000004+#define ARCHIVE_ENTRY_DIGEST_SHA384           0x00000005+#define ARCHIVE_ENTRY_DIGEST_SHA512           0x00000006++__LA_DECL const unsigned char * archive_entry_digest(struct archive_entry *, int /* type */);  /*  * ACL routines.  This used to simply store and return text-format ACL
c/archive_entry_private.h view
@@ -50,6 +50,15 @@ 	int64_t	 length; }; +struct ae_digest {+	unsigned char md5[16];+	unsigned char rmd160[20];+	unsigned char sha1[20];+	unsigned char sha256[32];+	unsigned char sha384[48];+	unsigned char sha512[64];+};+ /*  * Description of an archive entry.  *@@ -162,6 +171,9 @@ 	void *mac_metadata; 	size_t mac_metadata_size; +	/* Digest support. */+	struct ae_digest digest;+ 	/* ACL support. */ 	struct archive_acl    acl; @@ -180,5 +192,9 @@ 	/* Symlink type support */ 	int ae_symlink_type; };++int+archive_entry_set_digest(struct archive_entry *entry, int type,+    const unsigned char *digest);  #endif /* ARCHIVE_ENTRY_PRIVATE_H_INCLUDED */
c/archive_ppmd7.c view
@@ -4,7 +4,7 @@  #include "archive_platform.h" -#include <memory.h>+#include <stdlib.h>  #include "archive_ppmd7_private.h" 
c/archive_read_disk_entry_from_file.c view
@@ -103,6 +103,10 @@  static int setup_mac_metadata(struct archive_read_disk *,     struct archive_entry *, int *fd);+#ifdef ARCHIVE_XATTR_FREEBSD+static int setup_xattrs_namespace(struct archive_read_disk *,+    struct archive_entry *, int *, int);+#endif static int setup_xattrs(struct archive_read_disk *,     struct archive_entry *, int *fd); static int setup_sparse(struct archive_read_disk *,@@ -701,14 +705,13 @@ }  static int-setup_xattrs(struct archive_read_disk *a,-    struct archive_entry *entry, int *fd)+setup_xattrs_namespace(struct archive_read_disk *a,+    struct archive_entry *entry, int *fd, int namespace) { 	char buff[512]; 	char *list, *p; 	ssize_t list_size; 	const char *path;-	int namespace = EXTATTR_NAMESPACE_USER;  	path = NULL; @@ -727,6 +730,8 @@  	if (list_size == -1 && errno == EOPNOTSUPP) 		return (ARCHIVE_OK);+	if (list_size == -1 && errno == EPERM)+		return (ARCHIVE_OK); 	if (list_size == -1) { 		archive_set_error(&a->archive, errno, 			"Couldn't list extended attributes");@@ -760,7 +765,17 @@ 		size_t len = 255 & (int)*p; 		char *name; -		strcpy(buff, "user.");+		if (namespace == EXTATTR_NAMESPACE_SYSTEM) {+			if (!strcmp(p + 1, "nfs4.acl") ||+			    !strcmp(p + 1, "posix1e.acl_access") ||+			    !strcmp(p + 1, "posix1e.acl_default")) {+				p += 1 + len;+				continue;+			}+			strcpy(buff, "system.");+		} else {+			strcpy(buff, "user.");+		} 		name = buff + strlen(buff); 		memcpy(name, p + 1, len); 		name[len] = '\0';@@ -769,6 +784,31 @@ 	}  	free(list);+	return (ARCHIVE_OK);+}++static int+setup_xattrs(struct archive_read_disk *a,+    struct archive_entry *entry, int *fd)+{+	int namespaces[2];+	int i, res;++	namespaces[0] = EXTATTR_NAMESPACE_USER;+	namespaces[1] = EXTATTR_NAMESPACE_SYSTEM;++	for (i = 0; i < 2; i++) {+		res = setup_xattrs_namespace(a, entry, fd,+		    namespaces[i]);+		switch (res) {+			case (ARCHIVE_OK):+			case (ARCHIVE_WARN):+				break;+			default:+				return (res);+		}+	}+ 	return (ARCHIVE_OK); } 
c/archive_read_set_format.c view
@@ -61,6 +61,9 @@     case ARCHIVE_FORMAT_CPIO:       strcpy(str, "cpio");       break;+    case ARCHIVE_FORMAT_EMPTY:+      strcpy(str, "empty");+      break;     case ARCHIVE_FORMAT_ISO9660:       strcpy(str, "iso9660");       break;@@ -76,8 +79,14 @@     case ARCHIVE_FORMAT_RAR_V5:       strcpy(str, "rar5");       break;+    case ARCHIVE_FORMAT_RAW:+      strcpy(str, "raw");+      break;     case ARCHIVE_FORMAT_TAR:       strcpy(str, "tar");+      break;+    case ARCHIVE_FORMAT_WARC:+      strcpy(str, "warc");       break;     case ARCHIVE_FORMAT_XAR:       strcpy(str, "xar");
+ c/archive_read_support_filter_by_code.c view
@@ -0,0 +1,83 @@+/*-+ * Copyright (c) 2020 Martin Matuska+ * All rights reserved.+ *+ * Redistribution and use in source and binary forms, with or without+ * modification, are permitted provided that the following conditions+ * are met:+ * 1. Redistributions of source code must retain the above copyright+ *    notice, this list of conditions and the following disclaimer.+ * 2. Redistributions in binary form must reproduce the above copyright+ *    notice, this list of conditions and the following disclaimer in the+ *    documentation and/or other materials provided with the distribution.+ *+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.+ */++#include "archive_platform.h"+__FBSDID("$FreeBSD$");++#include "archive.h"+#include "archive_private.h"++int+archive_read_support_filter_by_code(struct archive *a, int filter_code)+{+	archive_check_magic(a, ARCHIVE_READ_MAGIC,+	    ARCHIVE_STATE_NEW, "archive_read_support_filter_by_code");++	switch (filter_code) {+	case ARCHIVE_FILTER_NONE:+		return archive_read_support_filter_none(a);+		break;+	case ARCHIVE_FILTER_GZIP:+		return archive_read_support_filter_gzip(a);+		break;+	case ARCHIVE_FILTER_BZIP2:+		return archive_read_support_filter_bzip2(a);+		break;+	case ARCHIVE_FILTER_COMPRESS:+		return archive_read_support_filter_compress(a);+		break;+	case ARCHIVE_FILTER_LZMA:+		return archive_read_support_filter_lzma(a);+		break;+	case ARCHIVE_FILTER_XZ:+		return archive_read_support_filter_xz(a);+		break;+	case ARCHIVE_FILTER_UU:+		return archive_read_support_filter_uu(a);+		break;+	case ARCHIVE_FILTER_RPM:+		return archive_read_support_filter_rpm(a);+		break;+	case ARCHIVE_FILTER_LZIP:+		return archive_read_support_filter_lzip(a);+		break;+	case ARCHIVE_FILTER_LRZIP:+		return archive_read_support_filter_lrzip(a);+		break;+	case ARCHIVE_FILTER_LZOP:+		return archive_read_support_filter_lzop(a);+		break;+	case ARCHIVE_FILTER_GRZIP:+		return archive_read_support_filter_grzip(a);+		break;+	case ARCHIVE_FILTER_LZ4:+		return archive_read_support_filter_lz4(a);+		break;+	case ARCHIVE_FILTER_ZSTD:+		return archive_read_support_filter_zstd(a);+		break;+	}+	return (ARCHIVE_FATAL);+}
c/archive_read_support_format_by_code.c view
@@ -26,6 +26,10 @@ #include "archive_platform.h" __FBSDID("$FreeBSD$"); +#ifdef HAVE_ERRNO_H+#include <errno.h>+#endif+ #include "archive.h" #include "archive_private.h" @@ -48,6 +52,9 @@ 	case ARCHIVE_FORMAT_CPIO: 		return archive_read_support_format_cpio(a); 		break;+	case ARCHIVE_FORMAT_EMPTY:+		return archive_read_support_format_empty(a);+		break; 	case ARCHIVE_FORMAT_ISO9660: 		return archive_read_support_format_iso9660(a); 		break;@@ -63,9 +70,15 @@ 	case ARCHIVE_FORMAT_RAR_V5: 		return archive_read_support_format_rar5(a); 		break;+	case ARCHIVE_FORMAT_RAW:+		return archive_read_support_format_raw(a);+		break; 	case ARCHIVE_FORMAT_TAR: 		return archive_read_support_format_tar(a); 		break;+	case ARCHIVE_FORMAT_WARC:+		return archive_read_support_format_warc(a);+		break; 	case ARCHIVE_FORMAT_XAR: 		return archive_read_support_format_xar(a); 		break;@@ -73,5 +86,7 @@ 		return archive_read_support_format_zip(a); 		break; 	}+	archive_set_error(a, ARCHIVE_ERRNO_PROGRAMMER,+	    "Invalid format code specified"); 	return (ARCHIVE_FATAL); }
c/archive_read_support_format_cab.c view
@@ -1172,7 +1172,7 @@ 	    cfdata->memimage + CFDATA_cbData, l, cfdata->sum_calculated); 	if (cfdata->sum_calculated != cfdata->sum) { 		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,-		    "Checksum error CFDATA[%d] %x:%x in %d bytes",+		    "Checksum error CFDATA[%d] %" PRIx32 ":%" PRIx32 " in %d bytes", 		    cab->entry_cffolder->cfdata_index -1, 		    cfdata->sum, cfdata->sum_calculated, 		    cfdata->compressed_size);
c/archive_read_support_format_empty.c view
@@ -47,7 +47,7 @@  	r = __archive_read_register_format(a, 	    NULL,-	    NULL,+	    "empty", 	    archive_read_format_empty_bid, 	    NULL, 	    archive_read_format_empty_read_header,
c/archive_read_support_format_mtree.c view
@@ -51,6 +51,7 @@  #include "archive.h" #include "archive_entry.h"+#include "archive_entry_private.h" #include "archive_private.h" #include "archive_rb.h" #include "archive_read_private.h"@@ -1482,6 +1483,84 @@ #undef MAX_PACK_ARGS } +static int+parse_hex_nibble(char c)+{+	if (c >= '0' && c <= '9')+		return c - '0';+	if (c >= 'a' && c <= 'f')+		return 10 + c - 'a';+#if 0+	/* XXX: Is uppercase something we should support? */+	if (c >= 'A' && c <= 'F')+		return 10 + c - 'A';+#endif++	return -1;+}++static int+parse_digest(struct archive_read *a, struct archive_entry *entry,+    const char *digest, int type)+{+	unsigned char digest_buf[64];+	int high, low;+	size_t i, j, len;++	switch (type) {+	case ARCHIVE_ENTRY_DIGEST_MD5:+		len = sizeof(entry->digest.md5);+		break;+	case ARCHIVE_ENTRY_DIGEST_RMD160:+		len = sizeof(entry->digest.rmd160);+		break;+	case ARCHIVE_ENTRY_DIGEST_SHA1:+		len = sizeof(entry->digest.sha1);+		break;+	case ARCHIVE_ENTRY_DIGEST_SHA256:+		len = sizeof(entry->digest.sha256);+		break;+	case ARCHIVE_ENTRY_DIGEST_SHA384:+		len = sizeof(entry->digest.sha384);+		break;+	case ARCHIVE_ENTRY_DIGEST_SHA512:+		len = sizeof(entry->digest.sha512);+		break;+	default:+		archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER,+			"Internal error: Unknown digest type");+		return ARCHIVE_FATAL;+	}++	if (len > sizeof(digest_buf)) {+		archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER,+			"Internal error: Digest storage too large");+		return ARCHIVE_FATAL;+	}++	len *= 2;++	if (strnlen(digest, len+1) != len) {+		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,+				  "incorrect digest length, ignoring");+		return ARCHIVE_WARN;+	}++	for (i = 0, j = 0; i < len; i += 2, j++) {+		high = parse_hex_nibble(digest[i]);+		low = parse_hex_nibble(digest[i+1]);+		if (high == -1 || low == -1) {+			archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,+					  "invalid digest data, ignoring");+			return ARCHIVE_WARN;+		}++		digest_buf[j] = high << 4 | low;+	}++	return archive_entry_set_digest(entry, type, digest_buf);+}+ /*  * Parse a single keyword and its value.  */@@ -1580,8 +1659,10 @@ 		} 		__LA_FALLTHROUGH; 	case 'm':-		if (strcmp(key, "md5") == 0 || strcmp(key, "md5digest") == 0)-			break;+		if (strcmp(key, "md5") == 0 || strcmp(key, "md5digest") == 0) {+			return parse_digest(a, entry, val,+			    ARCHIVE_ENTRY_DIGEST_MD5);+		} 		if (strcmp(key, "mode") == 0) { 			if (val[0] >= '0' && val[0] <= '7') { 				*parsed_kws |= MTREE_HAS_PERM;@@ -1617,21 +1698,32 @@ 			return r; 		} 		if (strcmp(key, "rmd160") == 0 ||-		    strcmp(key, "rmd160digest") == 0)-			break;+		    strcmp(key, "rmd160digest") == 0) {+			return parse_digest(a, entry, val,+			    ARCHIVE_ENTRY_DIGEST_RMD160);+		} 		__LA_FALLTHROUGH; 	case 's':-		if (strcmp(key, "sha1") == 0 || strcmp(key, "sha1digest") == 0)-			break;+		if (strcmp(key, "sha1") == 0 ||+		    strcmp(key, "sha1digest") == 0) {+			return parse_digest(a, entry, val,+			    ARCHIVE_ENTRY_DIGEST_SHA1);+		} 		if (strcmp(key, "sha256") == 0 ||-		    strcmp(key, "sha256digest") == 0)-			break;+		    strcmp(key, "sha256digest") == 0) {+			return parse_digest(a, entry, val,+			    ARCHIVE_ENTRY_DIGEST_SHA256);+		} 		if (strcmp(key, "sha384") == 0 ||-		    strcmp(key, "sha384digest") == 0)-			break;+		    strcmp(key, "sha384digest") == 0) {+			return parse_digest(a, entry, val,+			    ARCHIVE_ENTRY_DIGEST_SHA384);+		} 		if (strcmp(key, "sha512") == 0 ||-		    strcmp(key, "sha512digest") == 0)-			break;+		    strcmp(key, "sha512digest") == 0) {+			return parse_digest(a, entry, val,+			    ARCHIVE_ENTRY_DIGEST_SHA512);+		} 		if (strcmp(key, "size") == 0) { 			archive_entry_set_size(entry, mtree_atol(&val, 10)); 			break;
c/archive_read_support_format_rar.c view
@@ -151,6 +151,9 @@ #undef minimum #define minimum(a, b)	((a)<(b)?(a):(b)) +/* Stack overflow check */+#define MAX_COMPRESS_DEPTH 1024+ /* Fields common to all headers */ struct rar_header {@@ -340,7 +343,7 @@ static int read_data_stored(struct archive_read *, const void **, size_t *,                             int64_t *); static int read_data_compressed(struct archive_read *, const void **, size_t *,-                          int64_t *);+                          int64_t *, size_t); static int rar_br_preparation(struct archive_read *, struct rar_br *); static int parse_codes(struct archive_read *); static void free_codes(struct archive_read *);@@ -1026,7 +1029,7 @@   case COMPRESS_METHOD_NORMAL:   case COMPRESS_METHOD_GOOD:   case COMPRESS_METHOD_BEST:-    ret = read_data_compressed(a, buff, size, offset);+    ret = read_data_compressed(a, buff, size, offset, 0);     if (ret != ARCHIVE_OK && ret != ARCHIVE_WARN) {       __archive_ppmd7_functions.Ppmd7_Free(&rar->ppmd7_context);       rar->start_new_table = 1;@@ -1883,8 +1886,11 @@  static int read_data_compressed(struct archive_read *a, const void **buff, size_t *size,-               int64_t *offset)+               int64_t *offset, size_t looper) {+  if (looper++ > MAX_COMPRESS_DEPTH)+    return (ARCHIVE_FATAL);+   struct rar *rar;   int64_t start, end, actualend;   size_t bs;@@ -1982,7 +1988,7 @@         {           case 0:             rar->start_new_table = 1;-            return read_data_compressed(a, buff, size, offset);+            return read_data_compressed(a, buff, size, offset, looper);            case 2:             rar->ppmd_eod = 1;/* End Of ppmd Data. */
c/archive_read_support_format_rar5.c view
@@ -3831,7 +3831,7 @@  				DEBUG_CODE { 					printf("Checksum error: CRC32 "-					    "(was: %08x, expected: %08x)\n",+					    "(was: %08" PRIx32 ", expected: %08" PRIx32 ")\n", 					    rar->file.calculated_crc32, 					    rar->file.stored_crc32); 				}@@ -3845,7 +3845,7 @@ 			} else { 				DEBUG_CODE { 					printf("Checksum OK: CRC32 "-					    "(%08x/%08x)\n",+					    "(%08" PRIx32 "/%08" PRIx32 ")\n", 					    rar->file.stored_crc32, 					    rar->file.calculated_crc32); 				}@@ -3905,6 +3905,9 @@     size_t *size, int64_t *offset) { 	int ret; 	struct rar5* rar = get_context(a);++	if (size)+		*size = 0;  	if(rar->file.dir > 0) { 		/* Don't process any data if this file entry was declared
c/archive_read_support_format_warc.c view
@@ -337,6 +337,14 @@ 			mtime = rtime; 		} 		break;+	case WT_NONE:+	case WT_INFO:+	case WT_META:+	case WT_REQ:+	case WT_RVIS:+	case WT_CONV:+	case WT_CONT:+	case LAST_WT: 	default: 		fnam.len = 0U; 		fnam.str = NULL;@@ -361,6 +369,14 @@ 			break; 		} 		/* FALLTHROUGH */+	case WT_NONE:+	case WT_INFO:+	case WT_META:+	case WT_REQ:+	case WT_RVIS:+	case WT_CONV:+	case WT_CONT:+	case LAST_WT: 	default: 		/* consume the content and start over */ 		_warc_skip(a);
c/archive_read_support_format_zip.c view
@@ -899,7 +899,82 @@ 	return ARCHIVE_OK; } +#if HAVE_LZMA_H && HAVE_LIBLZMA /*+ * Auxiliary function to uncompress data chunk from zipx archive+ * (zip with lzma compression).+ */+static int+zipx_lzma_uncompress_buffer(const char *compressed_buffer,+	size_t compressed_buffer_size,+	char *uncompressed_buffer,+	size_t uncompressed_buffer_size)+{+	int status = ARCHIVE_FATAL;+	// length of 'lzma properties data' in lzma compressed+	// data segment (stream) inside zip archive+	const size_t lzma_params_length = 5;+	// offset of 'lzma properties data' from the beginning of lzma stream+	const size_t lzma_params_offset = 4;+	// end position of 'lzma properties data' in lzma stream+	const size_t lzma_params_end = lzma_params_offset + lzma_params_length;+	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;+#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+	const 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;+}+#endif++/*  * Assumes file pointer is at beginning of local file header.  */ static int@@ -1173,18 +1248,64 @@ 			    "Truncated Zip file"); 			return ARCHIVE_FATAL; 		}+		// take into account link compression if any+		size_t linkname_full_length = linkname_length;+		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;+#endif+				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)) 			sconv = zip->sconv_utf8; 		if (sconv == NULL) 			sconv = zip->sconv_default;-		if (archive_entry_copy_symlink_l(entry, p, linkname_length,+		if (archive_entry_copy_symlink_l(entry, p, linkname_full_length, 		    sconv) != 0) { 			if (errno != ENOMEM && sconv == zip->sconv_utf8 && 			    (zip->entry->zip_flags & ZIP_UTF8_NAME)) 			    archive_entry_copy_symlink_l(entry, p,-				linkname_length, NULL);+				linkname_full_length, NULL); 			if (errno == ENOMEM) { 				archive_set_error(&a->archive, ENOMEM, 				    "Can't allocate memory for Symlink");@@ -1901,15 +2022,15 @@  	if(order < 2 || restore_method > 2) { 		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,-		    "Invalid parameter set in PPMd8 stream (order=%d, "-		    "restore=%d)", order, restore_method);+		    "Invalid parameter set in PPMd8 stream (order=%" PRId32 ", "+		    "restore=%" PRId32 ")", order, restore_method); 		return (ARCHIVE_FAILED); 	}  	/* Allocate the memory needed to properly decompress the file. */ 	if(!__archive_ppmd8_functions.Ppmd8_Alloc(&zip->ppmd8, mem << 20)) { 		archive_set_error(&a->archive, ENOMEM,-		    "Unable to allocate memory for PPMd8 stream: %d bytes",+		    "Unable to allocate memory for PPMd8 stream: %" PRId32 " bytes", 		    mem << 20); 		return (ARCHIVE_FATAL); 	}
c/archive_string.c view
@@ -3881,6 +3881,11 @@ 	}  	*p = NULL;+	/* Try converting WCS to MBS first if MBS does not exist yet. */+	if ((aes->aes_set & AES_SET_MBS) == 0) {+		const char *pm; /* unused */+		archive_mstring_get_mbs(a, aes, &pm); /* ignore errors, we'll handle it later */+	} 	if (aes->aes_set & AES_SET_MBS) { 		sc = archive_string_conversion_to_charset(a, "UTF-8", 1); 		if (sc == NULL)@@ -3903,9 +3908,9 @@ archive_mstring_get_mbs(struct archive *a, struct archive_mstring *aes,     const char **p) {+	struct archive_string_conv *sc; 	int r, ret = 0; -	(void)a; /* UNUSED */ 	/* If we already have an MBS form, return that immediately. */ 	if (aes->aes_set & AES_SET_MBS) { 		*p = aes->aes_mbs.s;@@ -3926,10 +3931,23 @@ 			ret = -1; 	} -	/*-	 * Only a UTF-8 form cannot avail because its conversion already-	 * failed at archive_mstring_update_utf8().-	 */+	/* If there's a UTF-8 form, try converting with the native locale. */+	if (aes->aes_set & AES_SET_UTF8) {+		archive_string_empty(&(aes->aes_mbs));+		sc = archive_string_conversion_from_charset(a, "UTF-8", 1);+		if (sc == NULL)+			return (-1);/* Couldn't allocate memory for sc. */+		r = archive_strncpy_l(&(aes->aes_mbs),+			aes->aes_utf8.s, aes->aes_utf8.length, sc);+		if (a == NULL)+			free_sconv_object(sc);+		*p = aes->aes_mbs.s;+		if (r == 0) {+			aes->aes_set |= AES_SET_MBS;+			ret = 0;/* success; overwrite previous error. */+		} else+			ret = -1;/* failure. */+	} 	return (ret); } @@ -3947,6 +3965,11 @@ 	}  	*wp = NULL;+	/* Try converting UTF8 to MBS first if MBS does not exist yet. */+	if ((aes->aes_set & AES_SET_MBS) == 0) {+		const char *p; /* unused */+		archive_mstring_get_mbs(a, aes, &p); /* ignore errors, we'll handle it later */+	} 	/* Try converting MBS to WCS using native locale. */ 	if (aes->aes_set & AES_SET_MBS) { 		archive_wstring_empty(&(aes->aes_wcs));@@ -3962,11 +3985,12 @@ }  int-archive_mstring_get_mbs_l(struct archive_mstring *aes,+archive_mstring_get_mbs_l(struct archive *a, struct archive_mstring *aes,     const char **p, size_t *length, struct archive_string_conv *sc) { 	int r, ret = 0; +	(void)r; /* UNUSED */ #if defined(_WIN32) && !defined(__CYGWIN__) 	/* 	 * Internationalization programming on Windows must use Wide@@ -3989,20 +4013,12 @@ 	} #endif -	/* If there is not an MBS form but is a WCS form, try converting+	/* If there is not an MBS form but there is a WCS or UTF8 form, try converting 	 * with the native locale to be used for translating it to specified 	 * character-set. */-	if ((aes->aes_set & AES_SET_MBS) == 0 &&-	    (aes->aes_set & AES_SET_WCS) != 0) {-		archive_string_empty(&(aes->aes_mbs));-		r = archive_string_append_from_wcs(&(aes->aes_mbs),-		    aes->aes_wcs.s, aes->aes_wcs.length);-		if (r == 0)-			aes->aes_set |= AES_SET_MBS;-		else if (errno == ENOMEM)-			return (-1);-		else-			ret = -1;+	if ((aes->aes_set & AES_SET_MBS) == 0) {+		const char *pm; /* unused */+		archive_mstring_get_mbs(a, aes, &pm); /* ignore errors, we'll handle it later */ 	} 	/* If we already have an MBS form, use it to be translated to 	 * specified character-set. */
c/archive_string.h view
@@ -226,7 +226,7 @@ int archive_mstring_get_mbs(struct archive *, struct archive_mstring *, const char **); int archive_mstring_get_utf8(struct archive *, struct archive_mstring *, const char **); int archive_mstring_get_wcs(struct archive *, struct archive_mstring *, const wchar_t **);-int	archive_mstring_get_mbs_l(struct archive_mstring *, const char **,+int	archive_mstring_get_mbs_l(struct archive *, struct archive_mstring *, const char **, 	    size_t *, struct archive_string_conv *); int	archive_mstring_copy_mbs(struct archive_mstring *, const char *mbs); int	archive_mstring_copy_mbs_len(struct archive_mstring *, const char *mbs,
c/archive_util.c view
@@ -433,6 +433,11 @@ 		if (temp_name.s[temp_name.length-1] != '/') 			archive_strappend_char(&temp_name, '/'); 	}+#ifdef O_TMPFILE+	fd = open(temp_name.s, O_RDWR|O_CLOEXEC|O_TMPFILE|O_EXCL, 0600); +	if(fd >= 0)+		goto exit_tmpfile;+#endif 	archive_strcat(&temp_name, "libarchive_XXXXXX"); 	fd = mkstemp(temp_name.s); 	if (fd < 0)
c/archive_write.c view
@@ -456,6 +456,25 @@ }  static int+archive_write_client_free(struct archive_write_filter *f)+{+	struct archive_write *a = (struct archive_write *)f->archive;++	if (a->client_freer)+		(*a->client_freer)(&a->archive, a->client_data);+	a->client_data = NULL;++	/* Clear passphrase. */+	if (a->passphrase != NULL) {+		memset(a->passphrase, 0, strlen(a->passphrase));+		free(a->passphrase);+		a->passphrase = NULL;+	}++	return (ARCHIVE_OK);+}++static int archive_write_client_close(struct archive_write_filter *f) { 	struct archive_write *a = (struct archive_write *)f->archive;@@ -493,13 +512,7 @@ 		(*a->client_closer)(&a->archive, a->client_data); 	free(state->buffer); 	free(state);-	a->client_data = NULL;-	/* Clear passphrase. */-	if (a->passphrase != NULL) {-		memset(a->passphrase, 0, strlen(a->passphrase));-		free(a->passphrase);-		a->passphrase = NULL;-	}+ 	/* Clear the close handler myself not to be called again. */ 	f->state = ARCHIVE_WRITE_FILTER_STATE_CLOSED; 	return (ret);@@ -509,9 +522,9 @@  * Open the archive using the current settings.  */ int-archive_write_open(struct archive *_a, void *client_data,+archive_write_open2(struct archive *_a, void *client_data,     archive_open_callback *opener, archive_write_callback *writer,-    archive_close_callback *closer)+    archive_close_callback *closer, archive_free_callback *freer) { 	struct archive_write *a = (struct archive_write *)_a; 	struct archive_write_filter *client_filter;@@ -524,12 +537,14 @@ 	a->client_writer = writer; 	a->client_opener = opener; 	a->client_closer = closer;+	a->client_freer = freer; 	a->client_data = client_data;  	client_filter = __archive_write_allocate_filter(_a); 	client_filter->open = archive_write_client_open; 	client_filter->write = archive_write_client_write; 	client_filter->close = archive_write_client_close;+	client_filter->free = archive_write_client_free;  	ret = __archive_write_filters_open(a); 	if (ret < ARCHIVE_WARN) {@@ -542,6 +557,15 @@ 	if (a->format_init) 		ret = (a->format_init)(a); 	return (ret);+}++int+archive_write_open(struct archive *_a, void *client_data,+    archive_open_callback *opener, archive_write_callback *writer,+    archive_close_callback *closer)+{+	return archive_write_open2(_a, client_data, opener, writer,+	    closer, NULL); }  /*
c/archive_write_add_filter_xz.c view
@@ -382,8 +382,8 @@ 		    value[1] != '\0') 			return (ARCHIVE_WARN); 		data->compression_level = value[0] - '0';-		if (data->compression_level > 6)-			data->compression_level = 6;+		if (data->compression_level > 9)+			data->compression_level = 9; 		return (ARCHIVE_OK); 	} else if (strcmp(key, "threads") == 0) { 		char *endptr;
c/archive_write_disk_posix.c view
@@ -4423,10 +4423,19 @@ 			int e; 			int namespace; +			namespace = EXTATTR_NAMESPACE_USER;+ 			if (strncmp(name, "user.", 5) == 0) { 				/* "user." attributes go to user namespace */ 				name += 5; 				namespace = EXTATTR_NAMESPACE_USER;+			} else if (strncmp(name, "system.", 7) == 0) {+				name += 7;+				namespace = EXTATTR_NAMESPACE_SYSTEM;+				if (!strcmp(name, "nfs4.acl") ||+				    !strcmp(name, "posix1e.acl_access") ||+				    !strcmp(name, "posix1e.acl_default"))+					continue; 			} else { 				/* Other namespaces are unsupported */ 				archive_strcat(&errlist, name);@@ -4437,8 +4446,29 @@ 			}  			if (a->fd >= 0) {+				/*+				 * On FreeBSD, extattr_set_fd does not+				 * return the same as+				 * extattr_set_file. It returns zero+				 * on success, non-zero on failure.+				 *+				 * We can detect the failure by+				 * manually setting errno prior to the+				 * call and checking after.+				 *+				 * If errno remains zero, fake the+				 * return value by setting e to size.+				 *+				 * This is a hack for now until I+				 * (Shawn Webb) get FreeBSD to fix the+				 * issue, if that's even possible.+				 */+				errno = 0; 				e = extattr_set_fd(a->fd, namespace, name, 				    value, size);+				if (e == 0 && errno == 0) {+					e = size;+				} 			} else { 				e = extattr_set_link( 				    archive_entry_pathname(entry), namespace,
c/archive_write_open_fd.c view
@@ -54,7 +54,7 @@ 	int		fd; }; -static int	file_close(struct archive *, void *);+static int	file_free(struct archive *, void *); static int	file_open(struct archive *, void *); static ssize_t	file_write(struct archive *, void *, const void *buff, size_t); @@ -72,8 +72,8 @@ #if defined(__CYGWIN__) || defined(_WIN32) 	setmode(mine->fd, O_BINARY); #endif-	return (archive_write_open(a, mine,-		    file_open, file_write, file_close));+	return (archive_write_open2(a, mine,+		    file_open, file_write, NULL, file_free)); }  static int@@ -134,11 +134,13 @@ }  static int-file_close(struct archive *a, void *client_data)+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); 	return (ARCHIVE_OK); }
c/archive_write_open_file.c view
@@ -51,7 +51,7 @@ 	FILE		*f; }; -static int	file_close(struct archive *, void *);+static int	file_free(struct archive *, void *); static int	file_open(struct archive *, void *); static ssize_t	file_write(struct archive *, void *, const void *buff, size_t); @@ -66,8 +66,8 @@ 		return (ARCHIVE_FATAL); 	} 	mine->f = f;-	return (archive_write_open(a, mine,-		    file_open, file_write, file_close));+	return (archive_write_open2(a, mine, file_open, file_write,+	    NULL, file_free)); }  static int@@ -99,11 +99,13 @@ }  static int-file_close(struct archive *a, void *client_data)+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); 	return (ARCHIVE_OK); }
c/archive_write_open_filename.c view
@@ -62,6 +62,7 @@ };  static int	file_close(struct archive *, void *);+static int	file_free(struct archive *, void *); static int	file_open(struct archive *, void *); static ssize_t	file_write(struct archive *, void *, const void *buff, size_t); static int	open_filename(struct archive *, int, const void *);@@ -123,8 +124,8 @@ 		return (ARCHIVE_FAILED); 	} 	mine->fd = -1;-	return (archive_write_open(a, mine,-		file_open, file_write, file_close));+	return (archive_write_open2(a, mine,+		    file_open, file_write, file_close, file_free)); }  static int@@ -244,8 +245,24 @@  	(void)a; /* UNUSED */ +	if (mine == NULL)+		return (ARCHIVE_FATAL);+ 	if (mine->fd >= 0) 		close(mine->fd);++	return (ARCHIVE_OK);+}++static int+file_free(struct archive *a, void *client_data)+{+	struct write_file_data	*mine = (struct write_file_data *)client_data;++	(void)a; /* UNUSED */++	if (mine == NULL)+		return (ARCHIVE_OK);  	archive_mstring_clean(&mine->filename); 	free(mine);
c/archive_write_open_memory.c view
@@ -39,7 +39,7 @@ 	unsigned char * buff; }; -static int	memory_write_close(struct archive *, void *);+static int	memory_write_free(struct archive *, void *); static int	memory_write_open(struct archive *, void *); static ssize_t	memory_write(struct archive *, void *, const void *buff, size_t); @@ -61,8 +61,8 @@ 	mine->buff = buff; 	mine->size = buffSize; 	mine->client_size = used;-	return (archive_write_open(a, mine,-		    memory_write_open, memory_write, memory_write_close));+	return (archive_write_open2(a, mine,+		    memory_write_open, memory_write, NULL, memory_write_free)); }  static int@@ -103,11 +103,13 @@ }  static int-memory_write_close(struct archive *a, void *client_data)+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); 	return (ARCHIVE_OK); }
c/archive_write_private.h view
@@ -89,6 +89,7 @@ 	archive_open_callback	*client_opener; 	archive_write_callback	*client_writer; 	archive_close_callback	*client_closer;+	archive_free_callback	*client_freer; 	void			*client_data;  	/*
c/archive_write_set_format_7zip.c view
@@ -1927,8 +1927,8 @@ 		return (ARCHIVE_FATAL); 	} 	lzmafilters = (lzma_filter *)(strm+1);-	if (level > 6)-		level = 6;+	if (level > 9)+		level = 9; 	if (lzma_lzma_preset(&lzma_opt, level)) { 		free(strm); 		lastrm->real_stream = NULL;
c/archive_write_set_format_cpio.c view
@@ -250,7 +250,7 @@ 	const char *path; 	size_t len; -	if (archive_entry_filetype(entry) == 0) {+	if (archive_entry_filetype(entry) == 0 && archive_entry_hardlink(entry) == NULL) { 		archive_set_error(&a->archive, -1, "Filetype required"); 		return (ARCHIVE_FAILED); 	}@@ -348,7 +348,7 @@ 	format_octal(archive_entry_nlink(entry), h + c_nlink_offset, c_nlink_size); 	if (archive_entry_filetype(entry) == AE_IFBLK 	    || archive_entry_filetype(entry) == AE_IFCHR)-	    format_octal(archive_entry_dev(entry), h + c_rdev_offset, c_rdev_size);+	    format_octal(archive_entry_rdev(entry), h + c_rdev_offset, c_rdev_size); 	else 	    format_octal(0, h + c_rdev_offset, c_rdev_size); 	format_octal(archive_entry_mtime(entry), h + c_mtime_offset, c_mtime_size);
c/archive_write_set_format_cpio_newc.c view
@@ -190,7 +190,7 @@ 	const char *path; 	size_t len; -	if (archive_entry_filetype(entry) == 0) {+	if (archive_entry_filetype(entry) == 0 && archive_entry_hardlink(entry) == NULL) { 		archive_set_error(&a->archive, -1, "Filetype required"); 		return (ARCHIVE_FAILED); 	}
c/archive_write_set_format_iso9660.c view
@@ -2178,7 +2178,8 @@ 	strncpy(system_id, "Windows", size-1); 	system_id[size-1] = '\0'; #else-#error no way to get the system identifier on your platform.+	strncpy(system_id, "Unknown", size-1);+	system_id[size-1] = '\0'; #endif } 
c/archive_write_set_format_mtree.c view
@@ -37,6 +37,7 @@ #include "archive.h" #include "archive_digest_private.h" #include "archive_entry.h"+#include "archive_entry_private.h" #include "archive_private.h" #include "archive_rb.h" #include "archive_string.h"@@ -82,24 +83,7 @@ struct reg_info { 	int compute_sum; 	uint32_t crc;-#ifdef ARCHIVE_HAS_MD5-	unsigned char buf_md5[16];-#endif-#ifdef ARCHIVE_HAS_RMD160-	unsigned char buf_rmd160[20];-#endif-#ifdef ARCHIVE_HAS_SHA1-	unsigned char buf_sha1[20];-#endif-#ifdef ARCHIVE_HAS_SHA256-	unsigned char buf_sha256[32];-#endif-#ifdef ARCHIVE_HAS_SHA384-	unsigned char buf_sha384[48];-#endif-#ifdef ARCHIVE_HAS_SHA512-	unsigned char buf_sha512[64];-#endif+	struct ae_digest digest; };  struct mtree_entry {@@ -1571,27 +1555,27 @@ 	} #ifdef ARCHIVE_HAS_MD5 	if (mtree->compute_sum & F_MD5)-		archive_md5_final(&mtree->md5ctx, reg->buf_md5);+		archive_md5_final(&mtree->md5ctx, reg->digest.md5); #endif #ifdef ARCHIVE_HAS_RMD160 	if (mtree->compute_sum & F_RMD160)-		archive_rmd160_final(&mtree->rmd160ctx, reg->buf_rmd160);+		archive_rmd160_final(&mtree->rmd160ctx, reg->digest.rmd160); #endif #ifdef ARCHIVE_HAS_SHA1 	if (mtree->compute_sum & F_SHA1)-		archive_sha1_final(&mtree->sha1ctx, reg->buf_sha1);+		archive_sha1_final(&mtree->sha1ctx, reg->digest.sha1); #endif #ifdef ARCHIVE_HAS_SHA256 	if (mtree->compute_sum & F_SHA256)-		archive_sha256_final(&mtree->sha256ctx, reg->buf_sha256);+		archive_sha256_final(&mtree->sha256ctx, reg->digest.sha256); #endif #ifdef ARCHIVE_HAS_SHA384 	if (mtree->compute_sum & F_SHA384)-		archive_sha384_final(&mtree->sha384ctx, reg->buf_sha384);+		archive_sha384_final(&mtree->sha384ctx, reg->digest.sha384); #endif #ifdef ARCHIVE_HAS_SHA512 	if (mtree->compute_sum & F_SHA512)-		archive_sha512_final(&mtree->sha512ctx, reg->buf_sha512);+		archive_sha512_final(&mtree->sha512ctx, reg->digest.sha512); #endif 	/* Save what types of sum are computed. */ 	reg->compute_sum = mtree->compute_sum;@@ -1621,42 +1605,47 @@ 		archive_string_sprintf(str, " cksum=%ju", 		    (uintmax_t)reg->crc); 	}++#define append_digest(_s, _r, _t) \+	strappend_bin(_s, _r->digest._t, sizeof(_r->digest._t))+ #ifdef ARCHIVE_HAS_MD5 	if (reg->compute_sum & F_MD5) { 		archive_strcat(str, " md5digest=");-		strappend_bin(str, reg->buf_md5, sizeof(reg->buf_md5));+		append_digest(str, reg, md5); 	} #endif #ifdef ARCHIVE_HAS_RMD160 	if (reg->compute_sum & F_RMD160) { 		archive_strcat(str, " rmd160digest=");-		strappend_bin(str, reg->buf_rmd160, sizeof(reg->buf_rmd160));+		append_digest(str, reg, rmd160); 	} #endif #ifdef ARCHIVE_HAS_SHA1 	if (reg->compute_sum & F_SHA1) { 		archive_strcat(str, " sha1digest=");-		strappend_bin(str, reg->buf_sha1, sizeof(reg->buf_sha1));+		append_digest(str, reg, sha1); 	} #endif #ifdef ARCHIVE_HAS_SHA256 	if (reg->compute_sum & F_SHA256) { 		archive_strcat(str, " sha256digest=");-		strappend_bin(str, reg->buf_sha256, sizeof(reg->buf_sha256));+		append_digest(str, reg, sha256); 	} #endif #ifdef ARCHIVE_HAS_SHA384 	if (reg->compute_sum & F_SHA384) { 		archive_strcat(str, " sha384digest=");-		strappend_bin(str, reg->buf_sha384, sizeof(reg->buf_sha384));+		append_digest(str, reg, sha384); 	} #endif #ifdef ARCHIVE_HAS_SHA512 	if (reg->compute_sum & F_SHA512) { 		archive_strcat(str, " sha512digest=");-		strappend_bin(str, reg->buf_sha512, sizeof(reg->buf_sha512));+		append_digest(str, reg, sha512); 	} #endif+#undef append_digest }  static int
c/archive_write_set_format_xar.c view
@@ -2931,8 +2931,8 @@ 		return (ARCHIVE_FATAL); 	} 	lzmafilters = (lzma_filter *)(strm+1);-	if (level > 6)-		level = 6;+	if (level > 9)+		level = 9; 	if (lzma_lzma_preset(&lzma_opt, level)) { 		free(strm); 		lastrm->real_stream = NULL;
c/archive_write_set_format_zip.c view
@@ -584,6 +584,7 @@ 			zip->entry_flags |= ZIP_ENTRY_FLAG_ENCRYPTED; 			zip->entry_encryption = zip->encryption_type; 			break;+		case ENCRYPTION_NONE: 		default: 			break; 		}@@ -710,6 +711,7 @@ 				    + AUTH_CODE_SIZE; 				version_needed = 20; 				break;+			case ENCRYPTION_NONE: 			default: 				break; 			}@@ -762,6 +764,7 @@ 				if (version_needed < 20) 					version_needed = 20; 				break;+			case ENCRYPTION_NONE: 			default: 				break; 			}@@ -1029,6 +1032,7 @@ 				zip->cctx_valid = zip->hctx_valid = 1; 			} 			break;+		case ENCRYPTION_NONE: 		default: 			break; 		}@@ -1117,6 +1121,7 @@ 		break; #endif +	case COMPRESSION_UNSPECIFIED: 	default: 		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, 		    "Invalid ZIP compression type");
c/autoconf-darwin/config.h view
@@ -170,13 +170,13 @@ /* #undef ARCHIVE_XATTR_LINUX */  /* Version number of bsdcat */-#define BSDCAT_VERSION_STRING "3.4.3"+#define BSDCAT_VERSION_STRING "3.5.0"  /* Version number of bsdcpio */-#define BSDCPIO_VERSION_STRING "3.4.3"+#define BSDCPIO_VERSION_STRING "3.5.0"  /* Version number of bsdtar */-#define BSDTAR_VERSION_STRING "3.4.3"+#define BSDTAR_VERSION_STRING "3.5.0"  /* Define to 1 if the system has the type `ace_t'. */ /* #undef HAVE_ACE_T */@@ -1236,10 +1236,10 @@ /* #undef ICONV_CONST */  /* Version number of libarchive as a single integer */-#define LIBARCHIVE_VERSION_NUMBER "3004003"+#define LIBARCHIVE_VERSION_NUMBER "3005000"  /* Version number of libarchive */-#define LIBARCHIVE_VERSION_STRING "3.4.3"+#define LIBARCHIVE_VERSION_STRING "3.5.0"  /* Define to 1 if `lstat' dereferences a symlink specified with a trailing    slash. */@@ -1269,7 +1269,7 @@ #define PACKAGE_NAME "libarchive"  /* Define to the full name and version of this package. */-#define PACKAGE_STRING "libarchive 3.4.3"+#define PACKAGE_STRING "libarchive 3.5.0"  /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "libarchive"@@ -1278,7 +1278,7 @@ #define PACKAGE_URL ""  /* Define to the version of this package. */-#define PACKAGE_VERSION "3.4.3"+#define PACKAGE_VERSION "3.5.0"  /* Define to 1 if PCRE_STATIC needs to be defined. */ /* #undef PCRE_STATIC */@@ -1318,7 +1318,7 @@   /* Version number of package */-#define VERSION "3.4.3"+#define VERSION "3.5.0"  /* Define to '0x0502' for Windows Server 2003 APIs. */ /* #undef WINVER */@@ -1364,6 +1364,9 @@  /* Define to '0x0502' for Windows Server 2003 APIs. */ /* #undef _WIN32_WINNT */++/* Internal macro for sanity checks */+#define __LIBARCHIVE_CONFIG_H_INCLUDED 1  /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */
c/autoconf-freebsd/config.h view
@@ -165,13 +165,13 @@ /* #undef ARCHIVE_XATTR_LINUX */  /* Version number of bsdcat */-#define BSDCAT_VERSION_STRING "3.4.3"+#define BSDCAT_VERSION_STRING "3.5.0"  /* Version number of bsdcpio */-#define BSDCPIO_VERSION_STRING "3.4.3"+#define BSDCPIO_VERSION_STRING "3.5.0"  /* Version number of bsdtar */-#define BSDTAR_VERSION_STRING "3.4.3"+#define BSDTAR_VERSION_STRING "3.5.0"  /* Define to 1 if the system has the type `ace_t'. */ /* #undef HAVE_ACE_T */@@ -1225,10 +1225,10 @@ /* #undef ICONV_CONST */  /* Version number of libarchive as a single integer */-#define LIBARCHIVE_VERSION_NUMBER "3004003"+#define LIBARCHIVE_VERSION_NUMBER "3005000"  /* Version number of libarchive */-#define LIBARCHIVE_VERSION_STRING "3.4.3"+#define LIBARCHIVE_VERSION_STRING "3.5.0"  /* Define to 1 if `lstat' dereferences a symlink specified with a trailing    slash. */@@ -1258,7 +1258,7 @@ #define PACKAGE_NAME "libarchive"  /* Define to the full name and version of this package. */-#define PACKAGE_STRING "libarchive 3.4.3"+#define PACKAGE_STRING "libarchive 3.5.0"  /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "libarchive"@@ -1267,7 +1267,7 @@ #define PACKAGE_URL ""  /* Define to the version of this package. */-#define PACKAGE_VERSION "3.4.3"+#define PACKAGE_VERSION "3.5.0"  /* Define to 1 if PCRE_STATIC needs to be defined. */ /* #undef PCRE_STATIC */@@ -1307,7 +1307,7 @@   /* Version number of package */-#define VERSION "3.4.3"+#define VERSION "3.5.0"  /* Define to '0x0502' for Windows Server 2003 APIs. */ /* #undef WINVER */@@ -1353,6 +1353,9 @@  /* Define to '0x0502' for Windows Server 2003 APIs. */ /* #undef _WIN32_WINNT */++/* Internal macro for sanity checks */+#define __LIBARCHIVE_CONFIG_H_INCLUDED 1  /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */
c/autoconf-linux/config.h view
@@ -170,13 +170,13 @@ /* #undef ARCHIVE_XATTR_LINUX */  /* Version number of bsdcat */-#define BSDCAT_VERSION_STRING "3.4.3"+#define BSDCAT_VERSION_STRING "3.5.0"  /* Version number of bsdcpio */-#define BSDCPIO_VERSION_STRING "3.4.3"+#define BSDCPIO_VERSION_STRING "3.5.0"  /* Version number of bsdtar */-#define BSDTAR_VERSION_STRING "3.4.3"+#define BSDTAR_VERSION_STRING "3.5.0"  /* Define to 1 if the system has the type `ace_t'. */ /* #undef HAVE_ACE_T */@@ -453,7 +453,6 @@ /* #undef HAVE_EXPAT_H */  /* Define to 1 if you have the <ext2fs/ext2_fs.h> header file. */-/* #undef HAVE_EXT2FS_EXT2_FS_H */  /* Define to 1 if you have the `extattr_get_fd' function. */ /* #undef HAVE_EXTATTR_GET_FD */@@ -606,7 +605,7 @@ /* #undef HAVE_LCHFLAGS */  /* Define to 1 if you have the `lchmod' function. */-/* #undef HAVE_LCHMOD 1 */+/* #undef HAVE_LCHMOD */  /* Define to 1 if you have the `lchown' function. */ #define HAVE_LCHOWN 1@@ -1031,7 +1030,7 @@ /* #undef HAVE_STRUCT_TM_TM_GMTOFF 1 */  /* Define to 1 if `__tm_gmtoff' is a member of `struct tm'. */-/* #undef HAVE_STRUCT_TM___TM_GMTOFF 1 */+/* #undef HAVE_STRUCT_TM___TM_GMTOFF */  /* Define to 1 if the system has the type `struct vfsconf'. */ /* #undef HAVE_STRUCT_VFSCONF */@@ -1237,10 +1236,10 @@ /* #undef ICONV_CONST */  /* Version number of libarchive as a single integer */-#define LIBARCHIVE_VERSION_NUMBER "3004003"+#define LIBARCHIVE_VERSION_NUMBER "3005000"  /* Version number of libarchive */-#define LIBARCHIVE_VERSION_STRING "3.4.3"+#define LIBARCHIVE_VERSION_STRING "3.5.0"  /* Define to 1 if `lstat' dereferences a symlink specified with a trailing    slash. */@@ -1270,7 +1269,7 @@ #define PACKAGE_NAME "libarchive"  /* Define to the full name and version of this package. */-#define PACKAGE_STRING "libarchive 3.4.3"+#define PACKAGE_STRING "libarchive 3.5.0"  /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "libarchive"@@ -1279,7 +1278,7 @@ #define PACKAGE_URL ""  /* Define to the version of this package. */-#define PACKAGE_VERSION "3.4.3"+#define PACKAGE_VERSION "3.5.0"  /* Define to 1 if PCRE_STATIC needs to be defined. */ /* #undef PCRE_STATIC */@@ -1319,7 +1318,7 @@   /* Version number of package */-#define VERSION "3.4.3"+#define VERSION "3.5.0"  /* Define to '0x0502' for Windows Server 2003 APIs. */ /* #undef WINVER */@@ -1365,6 +1364,9 @@  /* Define to '0x0502' for Windows Server 2003 APIs. */ /* #undef _WIN32_WINNT */++/* Internal macro for sanity checks */+#define __LIBARCHIVE_CONFIG_H_INCLUDED 1  /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */
c/config_freebsd.h view
@@ -24,6 +24,7 @@  *  * $FreeBSD$  */+#define __LIBARCHIVE_CONFIG_H_INCLUDED 1  #include <osreldate.h> 
libarchive.cabal view
@@ -1,34 +1,31 @@-cabal-version:      3.0-name:               libarchive-version:            3.0.1.1-license:            BSD-3-Clause-license-file:       LICENSE-copyright:          Copyright: (c) 2018-2020 Vanessa McHale-maintainer:         vamchale@gmail.com-author:             Vanessa McHale-tested-with:-    ghc ==8.0.2 ghc ==8.2.2 ghc ==8.4.4 ghc ==8.6.5 ghc ==8.8.4-    ghc ==8.10.2--bug-reports:        https://github.com/vmchale/libarchive/issues-synopsis:           Haskell interface to libarchive+cabal-version:   3.0+name:            libarchive+version:         3.0.2.0+license:         BSD-3-Clause+license-file:    LICENSE+copyright:       Copyright: (c) 2018-2020 Vanessa McHale+maintainer:      vamchale@gmail.com+author:          Vanessa McHale+tested-with:     ghc ==7.10.3 ghc ==8.0.2 ghc == 8.2.2 ghc ==8.4.4 ghc ==8.6.5 ghc ==8.8.4 ghc ==8.10.2+bug-reports:     https://github.com/vmchale/libarchive/issues+synopsis:        Haskell interface to libarchive description:     Haskell bindings for [libarchive](https://www.libarchive.org/). Provides the ability to unpack archives, including the ability to unpack archives lazily. -category:           Codec-build-type:         Custom-extra-source-files:-    c/autoconf-darwin/config.h-    c/autoconf-linux/config.h-    c/autoconf-freebsd/config.h-    c/*.c-    c/*.h-    test/data/aarch64-linux-dist.tar-+category:        Codec+build-type:      Custom extra-doc-files:     README.md     CHANGELOG.md +extra-source-files:+  c/autoconf-darwin/config.h+  c/autoconf-linux/config.h+  c/autoconf-freebsd/config.h+  c/*.c+  c/*.h+  test/data/aarch64-linux-dist.tar+ source-repository head     type:     git     location: https://github.com/vmchale/libarchive@@ -49,8 +46,8 @@     default:     False  flag system-libarchive-    description:-        Use libarchive found with pkg-config rather than the bundled sources+  default:     True+  description: Use libarchive found with pkg-config rather than the bundled sources  library     exposed-modules:@@ -65,7 +62,7 @@         Codec.Archive.Internal.Unpack         Codec.Archive.Internal.Monad -    hs-source-dirs:   src+    hs-source-dirs:    src     other-modules:         Codec.Archive.Foreign.Archive.Macros         Codec.Archive.Foreign.ArchiveEntry.Macros@@ -73,9 +70,9 @@         Codec.Archive.Types.Foreign         Codec.Archive.Permissions -    default-language: Haskell2010-    other-extensions: DeriveGeneric DeriveAnyClass-    ghc-options:      -Wall+    default-language:  Haskell2010+    other-extensions:  DeriveGeneric DeriveAnyClass+    ghc-options:       -Wall     build-depends:         base >=4.8 && <5,         bytestring -any,@@ -106,156 +103,157 @@         ghc-options: -Wunused-packages      if !flag(system-libarchive)-        cc-options:   -std=c11 -DHAVE_CONFIG_H-        c-sources:-            c/archive_acl.c-            c/archive_blake2sp_ref.c-            c/archive_blake2s_ref.c-            c/archive_check_magic.c-            c/archive_cmdline.c-            c/archive_cryptor.c-            c/archive_digest.c-            c/archive_disk_acl_darwin.c-            c/archive_disk_acl_freebsd.c-            c/archive_disk_acl_linux.c-            c/archive_disk_acl_sunos.c-            c/archive_entry.c-            c/archive_entry_copy_bhfi.c-            c/archive_entry_copy_stat.c-            c/archive_entry_link_resolver.c-            c/archive_entry_sparse.c-            c/archive_entry_stat.c-            c/archive_entry_strmode.c-            c/archive_entry_xattr.c-            c/archive_getdate.c-            c/archive_hmac.c-            c/archive_match.c-            c/archive_options.c-            c/archive_pack_dev.c-            c/archive_pathmatch.c-            c/archive_ppmd7.c-            c/archive_ppmd8.c-            c/archive_random.c-            c/archive_rb.c-            c/archive_read_add_passphrase.c-            c/archive_read_append_filter.c-            c/archive_read.c-            c/archive_read_data_into_fd.c-            c/archive_read_disk_entry_from_file.c-            c/archive_read_disk_posix.c-            c/archive_read_disk_set_standard_lookup.c-            c/archive_read_disk_windows.c-            c/archive_read_extract2.c-            c/archive_read_extract.c-            c/archive_read_open_fd.c-            c/archive_read_open_file.c-            c/archive_read_open_filename.c-            c/archive_read_open_memory.c-            c/archive_read_set_format.c-            c/archive_read_set_options.c-            c/archive_read_support_filter_all.c-            c/archive_read_support_filter_bzip2.c-            c/archive_read_support_filter_compress.c-            c/archive_read_support_filter_grzip.c-            c/archive_read_support_filter_gzip.c-            c/archive_read_support_filter_lrzip.c-            c/archive_read_support_filter_lz4.c-            c/archive_read_support_filter_lzop.c-            c/archive_read_support_filter_none.c-            c/archive_read_support_filter_program.c-            c/archive_read_support_filter_rpm.c-            c/archive_read_support_filter_uu.c-            c/archive_read_support_filter_xz.c-            c/archive_read_support_filter_zstd.c-            c/archive_read_support_format_7zip.c-            c/archive_read_support_format_all.c-            c/archive_read_support_format_ar.c-            c/archive_read_support_format_by_code.c-            c/archive_read_support_format_cab.c-            c/archive_read_support_format_cpio.c-            c/archive_read_support_format_empty.c-            c/archive_read_support_format_iso9660.c-            c/archive_read_support_format_lha.c-            c/archive_read_support_format_mtree.c-            c/archive_read_support_format_rar5.c-            c/archive_read_support_format_rar.c-            c/archive_read_support_format_raw.c-            c/archive_read_support_format_tar.c-            c/archive_read_support_format_warc.c-            c/archive_read_support_format_xar.c-            c/archive_read_support_format_zip.c-            c/archive_string.c-            c/archive_string_sprintf.c-            c/archive_util.c-            c/archive_version_details.c-            c/archive_virtual.c-            c/archive_windows.c-            c/archive_write_add_filter_b64encode.c-            c/archive_write_add_filter_by_name.c-            c/archive_write_add_filter_bzip2.c-            c/archive_write_add_filter.c-            c/archive_write_add_filter_compress.c-            c/archive_write_add_filter_grzip.c-            c/archive_write_add_filter_gzip.c-            c/archive_write_add_filter_lrzip.c-            c/archive_write_add_filter_lz4.c-            c/archive_write_add_filter_lzop.c-            c/archive_write_add_filter_none.c-            c/archive_write_add_filter_program.c-            c/archive_write_add_filter_uuencode.c-            c/archive_write_add_filter_xz.c-            c/archive_write_add_filter_zstd.c-            c/archive_write.c-            c/archive_write_disk_posix.c-            c/archive_write_disk_set_standard_lookup.c-            c/archive_write_disk_windows.c-            c/archive_write_open_fd.c-            c/archive_write_open_file.c-            c/archive_write_open_filename.c-            c/archive_write_open_memory.c-            c/archive_write_set_format_7zip.c-            c/archive_write_set_format_ar.c-            c/archive_write_set_format_by_name.c-            c/archive_write_set_format.c-            c/archive_write_set_format_cpio.c-            c/archive_write_set_format_cpio_newc.c-            c/archive_write_set_format_filter_by_ext.c-            c/archive_write_set_format_gnutar.c-            c/archive_write_set_format_iso9660.c-            c/archive_write_set_format_mtree.c-            c/archive_write_set_format_pax.c-            c/archive_write_set_format_raw.c-            c/archive_write_set_format_shar.c-            c/archive_write_set_format_ustar.c-            c/archive_write_set_format_v7tar.c-            c/archive_write_set_format_warc.c-            c/archive_write_set_format_xar.c-            c/archive_write_set_format_zip.c-            c/archive_write_set_options.c-            c/archive_write_set_passphrase.c-            c/filter_fork_posix.c-            c/filter_fork_windows.c-            c/xxhash.c--        include-dirs: c/+        include-dirs: c -        if os(osx)-            include-dirs: c/autoconf-darwin+    if !flag(system-libarchive)+        -- version 3.5.0+        c-sources:+          c/archive_acl.c+          c/archive_blake2sp_ref.c+          c/archive_blake2s_ref.c+          c/archive_check_magic.c+          c/archive_cmdline.c+          c/archive_cryptor.c+          c/archive_digest.c+          c/archive_disk_acl_darwin.c+          c/archive_disk_acl_freebsd.c+          c/archive_disk_acl_linux.c+          c/archive_disk_acl_sunos.c+          c/archive_entry.c+          c/archive_entry_copy_bhfi.c+          c/archive_entry_copy_stat.c+          c/archive_entry_link_resolver.c+          c/archive_entry_sparse.c+          c/archive_entry_stat.c+          c/archive_entry_strmode.c+          c/archive_entry_xattr.c+          c/archive_getdate.c+          c/archive_hmac.c+          c/archive_match.c+          c/archive_options.c+          c/archive_pack_dev.c+          c/archive_pathmatch.c+          c/archive_ppmd7.c+          c/archive_ppmd8.c+          c/archive_random.c+          c/archive_rb.c+          c/archive_read_add_passphrase.c+          c/archive_read_append_filter.c+          c/archive_read.c+          c/archive_read_data_into_fd.c+          c/archive_read_disk_entry_from_file.c+          c/archive_read_disk_posix.c+          c/archive_read_disk_set_standard_lookup.c+          c/archive_read_disk_windows.c+          c/archive_read_extract2.c+          c/archive_read_extract.c+          c/archive_read_open_fd.c+          c/archive_read_open_file.c+          c/archive_read_open_filename.c+          c/archive_read_open_memory.c+          c/archive_read_set_format.c+          c/archive_read_set_options.c+          c/archive_read_support_filter_all.c+          c/archive_read_support_filter_by_code.c+          c/archive_read_support_filter_bzip2.c+          c/archive_read_support_filter_compress.c+          c/archive_read_support_filter_grzip.c+          c/archive_read_support_filter_gzip.c+          c/archive_read_support_filter_lrzip.c+          c/archive_read_support_filter_lz4.c+          c/archive_read_support_filter_lzop.c+          c/archive_read_support_filter_none.c+          c/archive_read_support_filter_program.c+          c/archive_read_support_filter_rpm.c+          c/archive_read_support_filter_uu.c+          c/archive_read_support_filter_xz.c+          c/archive_read_support_filter_zstd.c+          c/archive_read_support_format_7zip.c+          c/archive_read_support_format_all.c+          c/archive_read_support_format_ar.c+          c/archive_read_support_format_by_code.c+          c/archive_read_support_format_cab.c+          c/archive_read_support_format_cpio.c+          c/archive_read_support_format_empty.c+          c/archive_read_support_format_iso9660.c+          c/archive_read_support_format_lha.c+          c/archive_read_support_format_mtree.c+          c/archive_read_support_format_rar5.c+          c/archive_read_support_format_rar.c+          c/archive_read_support_format_raw.c+          c/archive_read_support_format_tar.c+          c/archive_read_support_format_warc.c+          c/archive_read_support_format_xar.c+          c/archive_read_support_format_zip.c+          c/archive_string.c+          c/archive_string_sprintf.c+          c/archive_util.c+          c/archive_version_details.c+          c/archive_virtual.c+          c/archive_windows.c+          c/archive_write_add_filter_b64encode.c+          c/archive_write_add_filter_by_name.c+          c/archive_write_add_filter_bzip2.c+          c/archive_write_add_filter.c+          c/archive_write_add_filter_compress.c+          c/archive_write_add_filter_grzip.c+          c/archive_write_add_filter_gzip.c+          c/archive_write_add_filter_lrzip.c+          c/archive_write_add_filter_lz4.c+          c/archive_write_add_filter_lzop.c+          c/archive_write_add_filter_none.c+          c/archive_write_add_filter_program.c+          c/archive_write_add_filter_uuencode.c+          c/archive_write_add_filter_xz.c+          c/archive_write_add_filter_zstd.c+          c/archive_write.c+          c/archive_write_disk_posix.c+          c/archive_write_disk_set_standard_lookup.c+          c/archive_write_disk_windows.c+          c/archive_write_open_fd.c+          c/archive_write_open_file.c+          c/archive_write_open_filename.c+          c/archive_write_open_memory.c+          c/archive_write_set_format_7zip.c+          c/archive_write_set_format_ar.c+          c/archive_write_set_format_by_name.c+          c/archive_write_set_format.c+          c/archive_write_set_format_cpio.c+          c/archive_write_set_format_cpio_newc.c+          c/archive_write_set_format_filter_by_ext.c+          c/archive_write_set_format_gnutar.c+          c/archive_write_set_format_iso9660.c+          c/archive_write_set_format_mtree.c+          c/archive_write_set_format_pax.c+          c/archive_write_set_format_raw.c+          c/archive_write_set_format_shar.c+          c/archive_write_set_format_ustar.c+          c/archive_write_set_format_v7tar.c+          c/archive_write_set_format_warc.c+          c/archive_write_set_format_xar.c+          c/archive_write_set_format_zip.c+          c/archive_write_set_options.c+          c/archive_write_set_passphrase.c+          c/filter_fork_posix.c+          c/filter_fork_windows.c+          c/xxhash.c +        if os(darwin)+          include-dirs: c/autoconf-darwin+        elif os(linux)+          include-dirs: c/autoconf-linux+        elif os(freebsd)+          include-dirs: c/autoconf-freebsd         else-            if os(linux)-                include-dirs: c/autoconf-linux--            else-                if os(freebsd)-                    include-dirs: c/autoconf-freebsd+          build-depends: unbuildable<0+          buildable: False -                else-                    buildable:     False-                    build-depends: unbuildable <0+        include-dirs: c/ +        cc-options: -std=c11 -DHAVE_CONFIG_H     else-        pkgconfig-depends: libarchive (==3.4.0 || >3.4.0) && <4.0+        pkgconfig-depends: libarchive (==3.5.0 || >3.5.0) && <4.0+  test-suite libarchive-test     type:               exitcode-stdio-1.0
src/Codec/Archive.hs view
@@ -38,6 +38,7 @@     , packToFileShar     -- * Concrete (Haskell) types     , ArchiveResult (..)+    , ArchiveEntryDigest (..)     , Entry (..)     , Symlink (..)     , EntryContent (..)@@ -57,7 +58,7 @@ import           Codec.Archive.Internal.Monad import           Codec.Archive.Internal.Pack import           Codec.Archive.Internal.Pack.Lazy-import           Codec.Archive.Permissions-import           Codec.Archive.Types import           Codec.Archive.Internal.Unpack import           Codec.Archive.Internal.Unpack.Lazy+import           Codec.Archive.Permissions+import           Codec.Archive.Types
src/Codec/Archive/Foreign/Archive.chs view
@@ -68,6 +68,7 @@                                      , archiveReadClose                                      , archiveReadFree                                      , archiveReadSupportFilterAll+                                     , archiveReadSupportFilterByCode                                      , archiveReadSupportFilterBzip2                                      , archiveReadSupportFilterCompress                                      , archiveReadSupportFilterGzip@@ -158,6 +159,7 @@                                      , archiveWriteSetFormatFilterByExtDef                                      , archiveWriteZipSetCompressionDeflate                                      , archiveWriteZipSetCompressionStore+                                     , archiveWriteOpen2                                      , archiveWriteOpenFd                                      , archiveWriteOpenFilenameW                                      , archiveWriteOpenFilename@@ -302,6 +304,7 @@                                      , ArchiveCloseCallbackRaw                                      , ArchiveSwitchCallbackRaw                                      , ArchivePassphraseCallback+                                     , ArchiveFreeCallback                                      -- * Callback constructors                                      , noOpenCallback                                      , mkReadCallback@@ -312,6 +315,7 @@                                      , mkOpenCallback                                      , mkCloseCallback                                      , mkSwitchCallback+                                     , mkFreeCallback                                      , mkWriteLookup                                      , mkReadLookup                                      , mkCleanup@@ -340,7 +344,6 @@ import Foreign.Storable (Storable (peek)) import System.Posix.Types (Fd (..)) --- destructors: use "dynamic" instead of "wrapper" (but we don't want that) -- callbacks foreign import ccall "wrapper" mkReadCallback :: ArchiveReadCallback a b -> IO (FunPtr (ArchiveReadCallback a b)) foreign import ccall "wrapper" mkSkipCallback :: ArchiveSkipCallback a -> IO (FunPtr (ArchiveSkipCallback a))@@ -351,6 +354,7 @@ foreign import ccall "wrapper" mkSwitchCallbackRaw :: ArchiveSwitchCallbackRaw a b -> IO (FunPtr (ArchiveSwitchCallbackRaw a b)) foreign import ccall "wrapper" mkPassphraseCallback :: ArchivePassphraseCallback a -> IO (FunPtr (ArchivePassphraseCallback a)) foreign import ccall "wrapper" mkExcludedCallback :: (Ptr Archive -> Ptr a -> Ptr ArchiveEntry -> IO ()) -> IO (FunPtr (Ptr Archive -> Ptr a -> Ptr ArchiveEntry -> IO ()))+foreign import ccall "wrapper" mkFreeCallbackRaw :: ArchiveFreeCallbackRaw a -> IO (FunPtr (ArchiveFreeCallbackRaw a))  -- | Don't use an open callback. This is the recommended argument to 'archiveReadOpen' noOpenCallback :: FunPtr (ArchiveOpenCallbackRaw a)@@ -375,6 +379,9 @@ mkSwitchCallback :: ArchiveSwitchCallback a b -> IO (FunPtr (ArchiveSwitchCallbackRaw a b)) mkSwitchCallback f = let f' = fmap resultToErr .** f in mkSwitchCallbackRaw f' +mkFreeCallback :: ArchiveFreeCallback a -> IO (FunPtr (ArchiveFreeCallbackRaw a))+mkFreeCallback f = let f' = fmap resultToErr .* f in mkFreeCallbackRaw f'+ mkFilter :: (Ptr Archive -> Ptr a -> Ptr ArchiveEntry -> IO Bool) -> IO (FunPtr (Ptr Archive -> Ptr a -> Ptr ArchiveEntry -> IO CInt)) mkFilter f = let f' = fmap boolToInt .** f in preMkFilter f'     where boolToInt False = 0@@ -558,6 +565,13 @@                                , castFunPtr `FunPtr (ArchiveWriteCallback a b)'                                , castFunPtr `FunPtr (ArchiveCloseCallbackRaw a)'                                } -> `ArchiveResult' #}+{# fun archive_write_open2 as ^ { `ArchivePtr'+                                , castPtr `Ptr a'+                                , castFunPtr `FunPtr (ArchiveOpenCallbackRaw a)'+                                , castFunPtr `FunPtr (ArchiveWriteCallback a b)'+                                , castFunPtr `FunPtr (ArchiveCloseCallbackRaw a)'+                                , castFunPtr `FunPtr (ArchiveFreeCallbackRaw a)'+                                } -> `ArchiveResult' #} {# fun archive_write_open_fd as ^ { `ArchivePtr', coerce `Fd' } -> `ArchiveResult' #} {# fun archive_write_open_filename as ^ { `ArchivePtr', `CString' } -> `ArchiveResult' #} {# fun archive_write_open_filename_w as ^ { `ArchivePtr', `CWString' } -> `ArchiveResult' #}@@ -644,6 +658,7 @@ {# fun archive_match_include_gid as ^ { `ArchivePtr', coerce `Id' } -> `ArchiveResult' #} {# fun archive_match_include_uid as ^ { `ArchivePtr', coerce `Id' } -> `ArchiveResult' #} {# fun archive_read_support_filter_all as ^ { `ArchivePtr' } -> `ArchiveResult' #}+{# fun archive_read_support_filter_by_code as ^ { `ArchivePtr', `CInt' } -> `ArchiveResult' #} {# fun archive_read_support_filter_bzip2 as ^ { `ArchivePtr' } -> `ArchiveResult' #} {# fun archive_read_support_filter_compress as ^ { `ArchivePtr' } -> `ArchiveResult' #} {# fun archive_read_support_filter_gzip as ^ { `ArchivePtr' } -> `ArchiveResult' #}
src/Codec/Archive/Foreign/ArchiveEntry.chs view
@@ -126,6 +126,7 @@                                           , archiveEntryCopyStat                                           , archiveEntryMacMetadata                                           , archiveEntryCopyMacMetadata+                                          , archiveEntryDigest                                           , archiveEntryAclClear                                           , archiveEntryAclNext                                           -- , archiveEntryAclNextW@@ -404,3 +405,4 @@ {# fun archive_entry_update_pathname_utf8 as ^ { `ArchiveEntryPtr', `CString' } -> `Bool' #} {# fun archive_entry_update_symlink_utf8 as ^ { `ArchiveEntryPtr', `CString' } -> `Bool' #} {# fun archive_entry_update_uname_utf8 as ^ { `ArchiveEntryPtr', `CString' } -> `Bool' #}+{# fun archive_entry_digest as ^ { `ArchiveEntryPtr', `ArchiveEntryDigest' } -> `Ptr CUChar' id #}
src/Codec/Archive/Internal/Unpack.hs view
@@ -71,10 +71,18 @@     where act a =             archiveFile fp a $> LazyST.runST (hsEntriesST a) -archiveFile :: FilePath -> ArchivePtr -> ArchiveM ()-archiveFile fp a = withCStringArchiveM fp $ \cpath ->-    ignore (archiveReadSupportFormatAll a) *>+{-# INLINE archiveAbs #-}+archiveAbs :: (ArchivePtr -> IO ArchiveResult) -- ^ Function to set format support+           -> FilePath+           -> ArchivePtr+           -> ArchiveM ()+archiveAbs support fp a = withCStringArchiveM fp $ \cpath ->+    ignore (support a) *>     handle (archiveReadOpenFilename a cpath 10240)++-- TODO: general function for format+archiveFile :: FilePath -> ArchivePtr -> ArchiveM ()+archiveFile = archiveAbs archiveReadSupportFormatAll  -- | This is more efficient than --
src/Codec/Archive/Internal/Unpack/Lazy.hs view
@@ -2,6 +2,7 @@                                           , readArchiveBSLAbs                                           , unpackToDirLazy                                           , bslToArchive+                                          , bslToArchiveAbs                                           ) where  import           Codec.Archive.Foreign@@ -44,16 +45,21 @@ readArchiveBSL = readArchiveBSLAbs readBS  readArchiveBSLAbs :: Integral a-                  => (ArchivePtr -> a -> IO e)+                  => (ArchivePtr -> a -> IO e) -- ^ Action to read contents from an archive entry                   -> BSL.ByteString                   -> Either ArchiveResult [Entry FilePath e] readArchiveBSLAbs read' = unsafeDupablePerformIO . runArchiveM . (hsEntriesAbs read' <=< bslToArchive) {-# NOINLINE readArchiveBSLAbs #-}  -- | Lazily stream a 'BSL.ByteString'-bslToArchive :: BSL.ByteString-             -> ArchiveM ArchivePtr-bslToArchive bs = do+bslToArchive :: BSL.ByteString -> ArchiveM ArchivePtr+bslToArchive = bslToArchiveAbs archiveReadSupportFormatAll++{-# INLINE bslToArchiveAbs #-}+bslToArchiveAbs :: (ArchivePtr -> IO ArchiveResult) -- ^ Action to set supported formats+                -> BSL.ByteString+                -> ArchiveM ArchivePtr+bslToArchiveAbs support bs = do     preA <- liftIO archiveReadNew     bufPtr <- liftIO $ mallocBytes (32 * 1024) -- default to 32k byte chunks     bufPtrRef <- liftIO $ newIORef bufPtr@@ -62,7 +68,7 @@     rc <- liftIO $ mkReadCallback (readBSL' bsChunksRef bufSzRef bufPtrRef)     cc <- liftIO $ mkCloseCallback (\_ ptr -> freeHaskellFunPtr rc *> free ptr $> ArchiveOk)     a <- liftIO $ castForeignPtr <$> newForeignPtr (castPtr preA) (archiveFree preA *> freeHaskellFunPtr cc *> (free =<< readIORef bufPtrRef))-    ignore $ archiveReadSupportFormatAll a+    ignore $ support a     nothingPtr <- liftIO $ mallocBytes 0     let seqErr = traverse_ handle     seqErr [ archiveReadSetReadCallback a rc
src/Codec/Archive/Types.hs view
@@ -7,12 +7,14 @@                            , Permissions                            , ArchiveEncryption (..)                            , ArchiveResult (..)+                           , ArchiveEntryDigest (..)                            -- * Foreign types                            , module Codec.Archive.Types.Foreign                            -- * Callbacks                            , ArchiveOpenCallback                            , ArchiveCloseCallback                            , ArchiveSwitchCallback+                           , ArchiveFreeCallback                            -- * Marshalling functions                            , resultToErr                            ) where@@ -26,6 +28,7 @@ type ArchiveOpenCallback a = Ptr Archive -> Ptr a -> IO ArchiveResult type ArchiveCloseCallback a = Ptr Archive -> Ptr a -> IO ArchiveResult type ArchiveSwitchCallback a b = Ptr Archive -> Ptr a -> Ptr b -> IO ArchiveResult+type ArchiveFreeCallback a = Ptr Archive -> Ptr a -> IO ArchiveResult  resultToErr :: ArchiveResult -> CInt resultToErr = fromIntegral . fromEnum
src/Codec/Archive/Types/Foreign.chs view
@@ -12,6 +12,7 @@                                    , ArchiveOpenCallbackRaw                                    , ArchiveSwitchCallbackRaw                                    , ArchivePassphraseCallback+                                   , ArchiveFreeCallbackRaw                                    -- * Abstract types                                    , Archive                                    , ArchiveEntry@@ -21,6 +22,7 @@                                    , ArchiveResult (..)                                    , FileType (..)                                    , Symlink (..)+                                   , ArchiveEntryDigest (..)                                    -- * Macros                                    , Flags (..)                                    , ArchiveFilter (..)@@ -126,6 +128,15 @@                              } deriving (Eq)   #} +{# enum define ArchiveEntryDigest { ARCHIVE_ENTRY_DIGEST_MD5 as ArchiveEntryDigestMD5+                                  , ARCHIVE_ENTRY_DIGEST_RMD160 as ArchiveEntryDigestRMD160+                                  , ARCHIVE_ENTRY_DIGEST_SHA1 as ArchiveEntryDigestSHA1+                                  , ARCHIVE_ENTRY_DIGEST_SHA256 as ArchiveEntryDigestSHA256+                                  , ARCHIVE_ENTRY_DIGEST_SHA384 as ArchiveEntryDigestSHA384+                                  , ARCHIVE_ENTRY_DIGEST_SHA512 as ArchiveEntryDigestSHA512+                                  }+  #}+ -- | Abstract type data Archive @@ -144,6 +155,7 @@ type ArchiveCloseCallbackRaw a = Ptr Archive -> Ptr a -> IO CInt type ArchiveSwitchCallbackRaw a b = Ptr Archive -> Ptr a -> Ptr b -> IO CInt type ArchivePassphraseCallback a = Ptr Archive -> Ptr a -> IO CString+type ArchiveFreeCallbackRaw a = Ptr Archive -> Ptr a -> IO CInt  newtype Flags = Flags CInt 
test/Spec.cpphs view
@@ -66,7 +66,7 @@ #ifndef LOW_MEMORY             traverse_ (\fp -> repack entriesToBSLzip ("zip/" ++ fp) fp) tarPaths             traverse_ (repack entriesToBSLCpio "cpio") tarPaths-            traverse_ (repack entriesToBSLXar "xar") tarPaths+            -- traverse_ (repack entriesToBSLXar "xar") tarPaths             traverse_ (repack entriesToBSLShar "shar") tarPaths             traverse_ (repack entriesToBSL7zip "7zip") tarPaths             traverse_ testFpFreaky tarPaths