packages feed

libarchive 3.0.3.2 → 3.0.4.1

raw patch · 83 files changed

+3470/−1314 lines, 83 filesdep −tar-conduit

Dependencies removed: tar-conduit

Files

CHANGELOG.md view
@@ -1,5 +1,14 @@ # libarchive +# 3.0.4.1++  * Bundled libarchive 3.7.1++# 3.0.4.0++  * Bundled libarchive 3.6.1+  * Add `archiveReadDiskNoSparse`+ # 3.0.3.2    * Bundled libarchive 3.5.3
bench/Bench.hs view
@@ -7,7 +7,6 @@ import           Control.Monad.IO.Class (liftIO) import           Criterion.Main import qualified Data.ByteString.Lazy   as BSL-import           Data.Conduit.Tar       as TarConduit import           System.IO.Temp         (withSystemTempDirectory)  roundtrip :: BSL.ByteString -> Either ArchiveResult BSL.ByteString@@ -33,11 +32,6 @@ extractTar = withSystemTempDirectory "tar" $     \fp -> Tar.extract fp "test/data/libarchive-1.0.5.1.tar" --- I'm not even sure why I'm benchmarking this since it doesn't work-unpackTarConduit :: IO ()-unpackTarConduit = withSystemTempDirectory "tar" $-    \fp -> void $ TarConduit.extractTarballLenient "test/data/libarchive-1.0.5.1.tar" (Just fp)- main :: IO () main =     defaultMain [ env file $ \ f ->@@ -49,7 +43,6 @@                       [ bench "libarchive (via bytestring)" $ nfIO unpackHs                       , bench "libarchive (C API)" $ nfIO unpack                       , bench "tar" $ nfIO extractTar-                      , bench "tarConduit" $ nfIO unpackTarConduit                       ]                 ]     where file = BSL.readFile "test/data/libarchive-1.0.5.1.tar"
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 3005003+#define	ARCHIVE_VERSION_NUMBER 3007001  #include <sys/stat.h> #include <stddef.h>  /* for wchar_t */@@ -97,7 +97,7 @@ #endif  /* Large file support for Android */-#ifdef __ANDROID__+#if defined(__LIBARCHIVE_BUILD) && defined(__ANDROID__) #include "android_lf.h" #endif @@ -120,6 +120,8 @@ #   define __LA_DECL	__declspec(dllimport) #  endif # endif+#elif defined __LIBARCHIVE_ENABLE_VISIBILITY+#  define __LA_DECL __attribute__((visibility("default"))) #else /* Static libraries or non-Windows needs no special declaration. */ # define __LA_DECL@@ -155,7 +157,7 @@ /*  * Textual name/version of the library, useful for version displays.  */-#define	ARCHIVE_VERSION_ONLY_STRING "3.5.3"+#define	ARCHIVE_VERSION_ONLY_STRING "3.7.1" #define	ARCHIVE_VERSION_STRING "libarchive " ARCHIVE_VERSION_ONLY_STRING __LA_DECL const char *	archive_version_string(void); @@ -1024,6 +1026,8 @@ #define	ARCHIVE_READDISK_NO_ACL			(0x0020) /* Default: File flags are read from disk. */ #define	ARCHIVE_READDISK_NO_FFLAGS		(0x0040)+/* Default: Sparse file information is read from disk. */+#define	ARCHIVE_READDISK_NO_SPARSE		(0x0080)  __LA_DECL int  archive_read_disk_set_behavior(struct archive *, 		    int flags);
c/archive_blake2.h view
@@ -21,8 +21,10 @@  #if defined(_MSC_VER) #define BLAKE2_PACKED(x) __pragma(pack(push, 1)) x __pragma(pack(pop))-#else+#elif defined(__GNUC__) #define BLAKE2_PACKED(x) x __attribute__((packed))+#else+#define BLAKE2_PACKED(x) _Pragma("pack 1") x _Pragma("pack 0") #endif  #if defined(__cplusplus)
c/archive_blake2_impl.h view
@@ -154,7 +154,7 @@ /* prevents compiler optimizing out memset() */ static BLAKE2_INLINE void secure_zero_memory(void *v, size_t n) {-  static void *(*const volatile memset_v)(void *, int, size_t) = &memset;+  static void *(__LA_LIBC_CC *const volatile memset_v)(void *, int, size_t) = &memset;   memset_v(v, 0, n); } 
c/archive_blake2s_ref.c view
@@ -13,6 +13,8 @@    https://blake2.net. */ +#include "archive_platform.h"+ #include <stdint.h> #include <string.h> #include <stdio.h>
c/archive_blake2sp_ref.c view
@@ -13,6 +13,8 @@    https://blake2.net. */ +#include "archive_platform.h"+ #include <stdlib.h> #include <string.h> #include <stdio.h>
c/archive_cryptor.c view
@@ -401,14 +401,6 @@ 	memcpy(ctx->key, key, key_len); 	memset(ctx->nonce, 0, sizeof(ctx->nonce)); 	ctx->encr_pos = AES_BLOCK_SIZE;-#if OPENSSL_VERSION_NUMBER  >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)-	if (!EVP_CIPHER_CTX_reset(ctx->ctx)) {-		EVP_CIPHER_CTX_free(ctx->ctx);-		ctx->ctx = NULL;-	}-#else-	EVP_CIPHER_CTX_init(ctx->ctx);-#endif 	return 0; } 
c/archive_digest.c view
@@ -36,6 +36,11 @@ #error Cannot use both OpenSSL and libmd. #endif +/* Common in other bcrypt implementations, but missing from VS2008. */+#ifndef BCRYPT_SUCCESS+#define BCRYPT_SUCCESS(r) ((NTSTATUS)(r) == STATUS_SUCCESS)+#endif+ /*  * Message digest functions for Windows platform.  */@@ -48,17 +53,37 @@ /*  * Initialize a Message digest.  */+#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA static int-win_crypto_init(Digest_CTX *ctx, ALG_ID algId)+win_crypto_init(Digest_CTX *ctx, const WCHAR *algo) {+	NTSTATUS status;+	ctx->valid = 0; +	status = BCryptOpenAlgorithmProvider(&ctx->hAlg, algo, NULL, 0);+	if (!BCRYPT_SUCCESS(status))+		return (ARCHIVE_FAILED);+	status = BCryptCreateHash(ctx->hAlg, &ctx->hHash, NULL, 0, NULL, 0, 0);+	if (!BCRYPT_SUCCESS(status)) {+		BCryptCloseAlgorithmProvider(ctx->hAlg, 0);+		return (ARCHIVE_FAILED);+	}++	ctx->valid = 1;+	return (ARCHIVE_OK);+}+#else+static int+win_crypto_init(Digest_CTX *ctx, DWORD prov, ALG_ID algId)+{+ 	ctx->valid = 0; 	if (!CryptAcquireContext(&ctx->cryptProv, NULL, NULL,-	    PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {+	    prov, CRYPT_VERIFYCONTEXT)) { 		if (GetLastError() != (DWORD)NTE_BAD_KEYSET) 			return (ARCHIVE_FAILED); 		if (!CryptAcquireContext(&ctx->cryptProv, NULL, NULL,-		    PROV_RSA_FULL, CRYPT_NEWKEYSET))+		    prov, CRYPT_NEWKEYSET)) 			return (ARCHIVE_FAILED); 	} @@ -70,6 +95,7 @@ 	ctx->valid = 1; 	return (ARCHIVE_OK); }+#endif  /*  * Update a Message digest.@@ -81,23 +107,37 @@ 	if (!ctx->valid) 		return (ARCHIVE_FAILED); +#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA+	BCryptHashData(ctx->hHash,+		      (PUCHAR)(uintptr_t)buf,+		      len, 0);+#else 	CryptHashData(ctx->hash, 		      (unsigned char *)(uintptr_t)buf, 		      (DWORD)len, 0);+#endif 	return (ARCHIVE_OK); }  static int win_crypto_Final(unsigned char *buf, size_t bufsize, Digest_CTX *ctx) {+#if !(defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA) 	DWORD siglen = (DWORD)bufsize;+#endif  	if (!ctx->valid) 		return (ARCHIVE_FAILED); +#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA+	BCryptFinishHash(ctx->hHash, buf, (ULONG)bufsize, 0);+	BCryptDestroyHash(ctx->hHash);+	BCryptCloseAlgorithmProvider(ctx->hAlg, 0);+#else 	CryptGetHashParam(ctx->hash, HP_HASHVAL, buf, &siglen, 0); 	CryptDestroyHash(ctx->hash); 	CryptReleaseContext(ctx->cryptProv, 0);+#endif 	ctx->valid = 0; 	return (ARCHIVE_OK); }@@ -243,7 +283,8 @@ {   if ((*ctx = EVP_MD_CTX_new()) == NULL) 	return (ARCHIVE_FAILED);-  EVP_DigestInit(*ctx, EVP_md5());+  if (!EVP_DigestInit(*ctx, EVP_md5()))+	return (ARCHIVE_FAILED);   return (ARCHIVE_OK); } @@ -275,7 +316,11 @@ static int __archive_md5init(archive_md5_ctx *ctx) {-  return (win_crypto_init(ctx, CALG_MD5));+#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA+  return (win_crypto_init(ctx, BCRYPT_MD5_ALGORITHM));+#else+  return (win_crypto_init(ctx, PROV_RSA_FULL, CALG_MD5));+#endif }  static int@@ -434,7 +479,8 @@ {   if ((*ctx = EVP_MD_CTX_new()) == NULL) 	return (ARCHIVE_FAILED);-  EVP_DigestInit(*ctx, EVP_ripemd160());+  if (!EVP_DigestInit(*ctx, EVP_ripemd160()))+	return (ARCHIVE_FAILED);   return (ARCHIVE_OK); } @@ -624,7 +670,8 @@ {   if ((*ctx = EVP_MD_CTX_new()) == NULL) 	return (ARCHIVE_FAILED);-  EVP_DigestInit(*ctx, EVP_sha1());+  if (!EVP_DigestInit(*ctx, EVP_sha1()))+	return (ARCHIVE_FAILED);   return (ARCHIVE_OK); } @@ -656,7 +703,11 @@ static int __archive_sha1init(archive_sha1_ctx *ctx) {-  return (win_crypto_init(ctx, CALG_SHA1));+#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA+  return (win_crypto_init(ctx, BCRYPT_SHA1_ALGORITHM));+#else+  return (win_crypto_init(ctx, PROV_RSA_FULL, CALG_SHA1));+#endif }  static int@@ -887,7 +938,8 @@ {   if ((*ctx = EVP_MD_CTX_new()) == NULL) 	return (ARCHIVE_FAILED);-  EVP_DigestInit(*ctx, EVP_sha256());+  if (!EVP_DigestInit(*ctx, EVP_sha256()))+	return (ARCHIVE_FAILED);   return (ARCHIVE_OK); } @@ -915,7 +967,11 @@ static int __archive_sha256init(archive_sha256_ctx *ctx) {-  return (win_crypto_init(ctx, CALG_SHA_256));+#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA+  return (win_crypto_init(ctx, BCRYPT_SHA256_ALGORITHM));+#else+  return (win_crypto_init(ctx, PROV_RSA_AES, CALG_SHA_256));+#endif }  static int@@ -1122,7 +1178,8 @@ {   if ((*ctx = EVP_MD_CTX_new()) == NULL) 	return (ARCHIVE_FAILED);-  EVP_DigestInit(*ctx, EVP_sha384());+  if (!EVP_DigestInit(*ctx, EVP_sha384()))+	return (ARCHIVE_FAILED);   return (ARCHIVE_OK); } @@ -1150,7 +1207,11 @@ static int __archive_sha384init(archive_sha384_ctx *ctx) {-  return (win_crypto_init(ctx, CALG_SHA_384));+#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA+  return (win_crypto_init(ctx, BCRYPT_SHA384_ALGORITHM));+#else+  return (win_crypto_init(ctx, PROV_RSA_AES, CALG_SHA_384));+#endif }  static int@@ -1381,7 +1442,8 @@ {   if ((*ctx = EVP_MD_CTX_new()) == NULL) 	return (ARCHIVE_FAILED);-  EVP_DigestInit(*ctx, EVP_sha512());+  if (!EVP_DigestInit(*ctx, EVP_sha512()))+	return (ARCHIVE_FAILED);   return (ARCHIVE_OK); } @@ -1409,7 +1471,11 @@ static int __archive_sha512init(archive_sha512_ctx *ctx) {-  return (win_crypto_init(ctx, CALG_SHA_512));+#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA+  return (win_crypto_init(ctx, BCRYPT_SHA512_ALGORITHM));+#else+  return (win_crypto_init(ctx, PROV_RSA_AES, CALG_SHA_512));+#endif }  static int
c/archive_digest_private.h view
@@ -164,6 +164,15 @@   defined(ARCHIVE_CRYPTO_SHA256_WIN) ||\   defined(ARCHIVE_CRYPTO_SHA384_WIN) ||\   defined(ARCHIVE_CRYPTO_SHA512_WIN)+#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA+/* don't use bcrypt when XP needs to be supported */+#include <bcrypt.h>+typedef struct {+  int   valid;+  BCRYPT_ALG_HANDLE  hAlg;+  BCRYPT_HASH_HANDLE hHash;+} Digest_CTX;+#else #include <windows.h> #include <wincrypt.h> typedef struct {@@ -171,6 +180,7 @@   HCRYPTPROV  cryptProv;   HCRYPTHASH  hash; } Digest_CTX;+#endif #endif  /* typedefs */
c/archive_entry.c view
@@ -568,6 +568,13 @@ 	return (entry->ae_stat.aest_nlink); } +/* Instead, our caller could have chosen a specific encoding+ * (archive_mstring_get_mbs, archive_mstring_get_utf8,+ * archive_mstring_get_wcs).  So we should try multiple+ * encodings.  Try mbs first because of history, even though+ * utf8 might be better for pathname portability.+ * Also omit wcs because of type mismatch (char * versus wchar *)+ */ const char * archive_entry_pathname(struct archive_entry *entry) {@@ -575,6 +582,13 @@ 	if (archive_mstring_get_mbs( 	    entry->archive, &entry->ae_pathname, &p) == 0) 		return (p);+#if HAVE_EILSEQ  /*{*/+    if (errno == EILSEQ) {+	    if (archive_mstring_get_utf8(+	        entry->archive, &entry->ae_pathname, &p) == 0)+		    return (p);+    }+#endif  /*}*/ 	if (errno == ENOMEM) 		__archive_errx(1, "No memory"); 	return (NULL);
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 3005003+#define	ARCHIVE_VERSION_NUMBER 3007001  /*  * Note: archive_entry.h is for use outside of libarchive; the@@ -99,7 +99,7 @@ #endif  /* Large file support for Android */-#ifdef __ANDROID__+#if defined(__LIBARCHIVE_BUILD) && defined(__ANDROID__) #include "android_lf.h" #endif @@ -122,6 +122,8 @@ #   define __LA_DECL	__declspec(dllimport) #  endif # endif+#elif defined __LIBARCHIVE_ENABLE_VISIBILITY+#  define __LA_DECL __attribute__((visibility("default"))) #else /* Static libraries on all platforms and shared libraries on non-Windows. */ # define __LA_DECL
c/archive_getdate.c view
@@ -698,13 +698,9 @@ 	time_t		Julian; 	int		i; 	struct tm	*ltime;-#if defined(HAVE_LOCALTIME_R) || defined(HAVE__LOCALTIME64_S)+#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S) 	struct tm	tmbuf; #endif-#if defined(HAVE__LOCALTIME64_S)-	errno_t		terr;-	__time64_t	tmptime;-#endif  	if (Year < 69) 		Year += 2000;@@ -714,7 +710,7 @@ 	    ? 29 : 28; 	/* Checking for 2038 bogusly assumes that time_t is 32 bits.  But 	   I'm too lazy to try to check for time_t overflow in another way.  */-	if (Year < EPOCH || Year > 2038+	if (Year < EPOCH || Year >= 2038 	    || Month < 1 || Month > 12 	    /* Lint fluff:  "conversion from long may lose accuracy" */ 	    || Day < 1 || Day > DaysInMonth[(int)--Month]@@ -731,15 +727,10 @@ 	Julian *= DAY; 	Julian += Timezone; 	Julian += Hours * HOUR + Minutes * MINUTE + Seconds;-#if defined(HAVE_LOCALTIME_R)+#if defined(HAVE_LOCALTIME_S)+	ltime = localtime_s(&tmbuf, &Julian) ? NULL : &tmbuf;+#elif defined(HAVE_LOCALTIME_R) 	ltime = localtime_r(&Julian, &tmbuf);-#elif defined(HAVE__LOCALTIME64_S)-	tmptime = Julian;-	terr = _localtime64_s(&tmbuf, &tmptime);-	if (terr)-		ltime = NULL;-	else-		ltime = &tmbuf; #else 	ltime = localtime(&Julian); #endif@@ -755,36 +746,21 @@ 	time_t		StartDay; 	time_t		FutureDay; 	struct tm	*ltime;-#if defined(HAVE_LOCALTIME_R) || defined(HAVE__LOCALTIME64_S)+#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S) 	struct tm	tmbuf; #endif-#if defined(HAVE__LOCALTIME64_S)-	errno_t		terr;-	__time64_t	tmptime;-#endif--#if defined(HAVE_LOCALTIME_R)+#if defined(HAVE_LOCALTIME_S)+	ltime = localtime_s(&tmbuf, &Start) ? NULL : &tmbuf;+#elif defined(HAVE_LOCALTIME_R) 	ltime = localtime_r(&Start, &tmbuf);-#elif defined(HAVE__LOCALTIME64_S)-	tmptime = Start;-	terr = _localtime64_s(&tmbuf, &tmptime);-	if (terr)-		ltime = NULL;-	else-		ltime = &tmbuf; #else 	ltime = localtime(&Start); #endif 	StartDay = (ltime->tm_hour + 1) % 24;-#if defined(HAVE_LOCALTIME_R)+#if defined(HAVE_LOCALTIME_S)+	ltime = localtime_s(&tmbuf, &Future) ? NULL : &tmbuf;+#elif defined(HAVE_LOCALTIME_R) 	ltime = localtime_r(&Future, &tmbuf);-#elif defined(HAVE__LOCALTIME64_S)-	tmptime = Future;-	terr = _localtime64_s(&tmbuf, &tmptime);-	if (terr)-		ltime = NULL;-	else-		ltime = &tmbuf; #else 	ltime = localtime(&Future); #endif@@ -799,24 +775,15 @@ { 	struct tm	*tm; 	time_t	t, now;-#if defined(HAVE_GMTIME_R) || defined(HAVE__GMTIME64_S)+#if defined(HAVE_GMTIME_R) || defined(HAVE_GMTIME_S) 	struct tm	tmbuf; #endif-#if defined(HAVE__GMTIME64_S)-	errno_t		terr;-	__time64_t	tmptime;-#endif  	t = Start - zone;-#if defined(HAVE_GMTIME_R)+#if defined(HAVE_GMTIME_S)+	tm = gmtime_s(&tmbuf, &t) ? NULL : &tmbuf;+#elif defined(HAVE_GMTIME_R) 	tm = gmtime_r(&t, &tmbuf);-#elif defined(HAVE__GMTIME64_S)-	tmptime = t;-	terr = _gmtime64_s(&tmbuf, &tmptime);-	if (terr)-		tm = NULL;-	else-		tm = &tmbuf; #else 	tm = gmtime(&t); #endif@@ -835,25 +802,16 @@ 	struct tm	*tm; 	time_t	Month; 	time_t	Year;-#if defined(HAVE_LOCALTIME_R) || defined(HAVE__LOCALTIME64_S)+#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S) 	struct tm	tmbuf; #endif-#if defined(HAVE__LOCALTIME64_S)-	errno_t		terr;-	__time64_t	tmptime;-#endif  	if (RelMonth == 0) 		return 0;-#if defined(HAVE_LOCALTIME_R)+#if defined(HAVE_LOCALTIME_S)+	tm = localtime_s(&tmbuf, &Start) ? NULL : &tmbuf;+#elif defined(HAVE_LOCALTIME_R) 	tm = localtime_r(&Start, &tmbuf);-#elif defined(HAVE__LOCALTIME64_S)-	tmptime = Start;-	terr = _localtime64_s(&tmbuf, &tmptime);-	if (terr)-		tm = NULL;-	else-		tm = &tmbuf; #else 	tm = localtime(&Start); #endif@@ -993,10 +951,6 @@ 	time_t		Start; 	time_t		tod; 	long		tzone;-#if defined(HAVE__LOCALTIME64_S) || defined(HAVE__GMTIME64_S)-	errno_t		terr;-	__time64_t	tmptime;-#endif  	/* Clear out the parsed token array. */ 	memset(tokens, 0, sizeof(tokens));@@ -1005,36 +959,26 @@ 	gds = &_gds;  	/* Look up the current time. */-#if defined(HAVE_LOCALTIME_R)+#if defined(HAVE_LOCALTIME_S)+	tm = localtime_s(&local, &now) ? NULL : &local;+#elif defined(HAVE_LOCALTIME_R) 	tm = localtime_r(&now, &local);-#elif defined(HAVE__LOCALTIME64_S)-	tmptime = now;-	terr = _localtime64_s(&local, &tmptime);-	if (terr)-		tm = NULL;-	else-		tm = &local; #else 	memset(&local, 0, sizeof(local)); 	tm = localtime(&now); #endif 	if (tm == NULL) 		return -1;-#if !defined(HAVE_LOCALTIME_R) && !defined(HAVE__LOCALTIME64_S)+#if !defined(HAVE_LOCALTIME_R) && !defined(HAVE_LOCALTIME_S) 	local = *tm; #endif  	/* Look up UTC if we can and use that to determine the current 	 * timezone offset. */-#if defined(HAVE_GMTIME_R)+#if defined(HAVE_GMTIME_S)+	gmt_ptr = gmtime_s(&gmt, &now) ? NULL : &gmt;+#elif defined(HAVE_GMTIME_R) 	gmt_ptr = gmtime_r(&now, &gmt);-#elif defined(HAVE__GMTIME64_S)-	tmptime = now;-	terr = _gmtime64_s(&gmt, &tmptime);-	if (terr)-		gmt_ptr = NULL;-	else-		gmt_ptr = &gmt; #else 	memset(&gmt, 0, sizeof(gmt)); 	gmt_ptr = gmtime(&now);@@ -1076,15 +1020,10 @@ 	 * time components instead of the local timezone. */ 	if (gds->HaveZone && gmt_ptr != NULL) { 		now -= gds->Timezone;-#if defined(HAVE_GMTIME_R)+#if defined(HAVE_GMTIME_S)+		gmt_ptr = gmtime_s(&gmt, &now) ? NULL : &gmt;+#elif defined(HAVE_GMTIME_R) 		gmt_ptr = gmtime_r(&now, &gmt);-#elif defined(HAVE__GMTIME64_S)-		tmptime = now;-		terr = _gmtime64_s(&gmt, &tmptime);-		if (terr)-			gmt_ptr = NULL;-		else-			gmt_ptr = &gmt; #else 		gmt_ptr = gmtime(&now); #endif
c/archive_hmac.c view
@@ -230,10 +230,28 @@ static int __hmac_sha1_init(archive_hmac_sha1_ctx *ctx, const uint8_t *key, size_t key_len) {+#if OPENSSL_VERSION_NUMBER >= 0x30000000L+	EVP_MAC *mac;++	char sha1[] = "SHA1";+	OSSL_PARAM params[] = {+		OSSL_PARAM_utf8_string("digest", sha1, sizeof(sha1) - 1),+		OSSL_PARAM_END+	};++	mac = EVP_MAC_fetch(NULL, "HMAC", NULL);+	*ctx = EVP_MAC_CTX_new(mac);+	EVP_MAC_free(mac);+	if (*ctx == NULL)+		return -1;++	EVP_MAC_init(*ctx, key, key_len, params);+#else 	*ctx = HMAC_CTX_new(); 	if (*ctx == NULL) 		return -1; 	HMAC_Init_ex(*ctx, key, key_len, EVP_sha1(), NULL);+#endif 	return 0; } @@ -241,22 +259,38 @@ __hmac_sha1_update(archive_hmac_sha1_ctx *ctx, const uint8_t *data,     size_t data_len) {+#if OPENSSL_VERSION_NUMBER >= 0x30000000L+	EVP_MAC_update(*ctx, data, data_len);+#else 	HMAC_Update(*ctx, data, data_len);+#endif }  static void __hmac_sha1_final(archive_hmac_sha1_ctx *ctx, uint8_t *out, size_t *out_len) {+#if OPENSSL_VERSION_NUMBER >= 0x30000000L+	size_t len = *out_len;+#else 	unsigned int len = (unsigned int)*out_len;+#endif +#if OPENSSL_VERSION_NUMBER >= 0x30000000L+	EVP_MAC_final(*ctx, out, &len, *out_len);+#else 	HMAC_Final(*ctx, out, &len);+#endif 	*out_len = len; }  static void __hmac_sha1_cleanup(archive_hmac_sha1_ctx *ctx) {+#if OPENSSL_VERSION_NUMBER >= 0x30000000L+	EVP_MAC_CTX_free(*ctx);+#else 	HMAC_CTX_free(*ctx);+#endif 	*ctx = NULL; } 
c/archive_hmac_private.h view
@@ -74,9 +74,18 @@ typedef	struct hmac_sha1_ctx archive_hmac_sha1_ctx;  #elif defined(HAVE_LIBCRYPTO)+#include <openssl/opensslv.h>+#include <openssl/hmac.h>+#if OPENSSL_VERSION_NUMBER >= 0x30000000L+#include <openssl/params.h>++typedef EVP_MAC_CTX *archive_hmac_sha1_ctx;++#else #include "archive_openssl_hmac_private.h"  typedef	HMAC_CTX* archive_hmac_sha1_ctx;+#endif  #else 
c/archive_openssl_evp_private.h view
@@ -33,7 +33,8 @@ #include <openssl/evp.h> #include <openssl/opensslv.h> -#if OPENSSL_VERSION_NUMBER < 0x10100000L+#if OPENSSL_VERSION_NUMBER < 0x10100000L || \+    (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x2070000fL) #include <stdlib.h> /* malloc, free */ #include <string.h> /* memset */ static inline EVP_MD_CTX *EVP_MD_CTX_new(void)
c/archive_pack_dev.c view
@@ -77,7 +77,7 @@ static	pack_t	pack_14_18; static	pack_t	pack_8_24; static	pack_t	pack_bsdos;-static	int	compare_format(const void *, const void *);+static	int	__LA_LIBC_CC compare_format(const void *, const void *);  static const char iMajorError[] = "invalid major number"; static const char iMinorError[] = "invalid minor number";@@ -310,6 +310,7 @@ };  static int+__LA_LIBC_CC compare_format(const void *key, const void *element) { 	const char		*name;
c/archive_platform.h view
@@ -69,8 +69,16 @@  * either Windows or Posix APIs. */ #if (defined(__WIN32__) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__) #include "archive_windows.h"+/* The C library on Windows specifies a calling convention for callback+ * functions and exports; when we interact with them (capture pointers,+ * call and pass function pointers) we need to match their calling+ * convention.+ * This only matters when libarchive is built with /Gr, /Gz or /Gv+ * (which change the default calling convention.) */+#define __LA_LIBC_CC __cdecl #else #define la_stat(path,stref)		stat(path,stref)+#define __LA_LIBC_CC #endif  /*@@ -155,6 +163,28 @@ #define	INTMAX_MIN ((intmax_t)(~INTMAX_MAX)) #endif +/* Some platforms lack the standard PRIxN/PRIdN definitions. */+#if !HAVE_INTTYPES_H || !defined(PRIx32) || !defined(PRId32)+#ifndef PRIx32+#if SIZEOF_INT == 4+#define PRIx32 "x"+#elif SIZEOF_LONG == 4+#define PRIx32 "lx"+#else+#error No suitable 32-bit unsigned integer type found for this platform+#endif+#endif // PRIx32+#ifndef PRId32+#if SIZEOF_INT == 4+#define PRId32 "d"+#elif SIZEOF_LONG == 4+#define PRId32 "ld"+#else+#error No suitable 32-bit signed integer type found for this platform+#endif+#endif // PRId32+#endif // !HAVE_INTTYPES_H || !defined(PRIx32) || !defined(PRId32)+ /*  * If we can't restore metadata using a file descriptor, then  * for compatibility's sake, close files before trying to restore metadata.@@ -165,8 +195,9 @@  /*  * glibc 2.24 deprecates readdir_r+ * bionic c deprecates readdir_r too  */-#if defined(HAVE_READDIR_R) && (!defined(__GLIBC__) || !defined(__GLIBC_MINOR__) || __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 24))+#if defined(HAVE_READDIR_R) && (!defined(__GLIBC__) || !defined(__GLIBC_MINOR__) || __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 24)) && (!defined(__ANDROID__)) #define	USE_READDIR_R	1 #else #undef	USE_READDIR_R
c/archive_private.h view
@@ -107,13 +107,10 @@ 	 * Some public API functions depend on the "real" type of the 	 * archive object. 	 */-	struct archive_vtable *vtable;+	const struct archive_vtable *vtable;  	int		  archive_format; 	const char	 *archive_format_name;--	int	  compression_code;	/* Currently active compression. */-	const char *compression_name;  	/* Number of file entries processed. */ 	int		  file_count;
c/archive_random.c view
@@ -51,16 +51,27 @@ #include <pthread.h> #endif -static void arc4random_buf(void *, size_t);+static void la_arc4random_buf(void *, size_t);  #endif /* HAVE_ARC4RANDOM_BUF */  #include "archive.h" #include "archive_random_private.h" -#if defined(HAVE_WINCRYPT_H) && !defined(__CYGWIN__)+#if defined(_WIN32) && !defined(__CYGWIN__)+#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA+/* don't use bcrypt when XP needs to be supported */+#include <bcrypt.h>++/* Common in other bcrypt implementations, but missing from VS2008. */+#ifndef BCRYPT_SUCCESS+#define BCRYPT_SUCCESS(r) ((NTSTATUS)(r) == STATUS_SUCCESS)+#endif++#elif defined(HAVE_WINCRYPT_H) #include <wincrypt.h> #endif+#endif  #ifndef O_CLOEXEC #define O_CLOEXEC	0@@ -75,6 +86,20 @@ archive_random(void *buf, size_t nbytes) { #if defined(_WIN32) && !defined(__CYGWIN__)+# if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA+	NTSTATUS status;+	BCRYPT_ALG_HANDLE hAlg;++	status = BCryptOpenAlgorithmProvider(&hAlg, BCRYPT_RNG_ALGORITHM, NULL, 0);+	if (!BCRYPT_SUCCESS(status))+		return ARCHIVE_FAILED;+	status = BCryptGenRandom(hAlg, buf, nbytes, 0);+	BCryptCloseAlgorithmProvider(hAlg, 0);+	if (!BCRYPT_SUCCESS(status))+		return ARCHIVE_FAILED;++	return ARCHIVE_OK;+# else 	HCRYPTPROV hProv; 	BOOL success; @@ -92,6 +117,10 @@ 	} 	/* TODO: Does this case really happen? */ 	return ARCHIVE_FAILED;+# endif+#elif !defined(HAVE_ARC4RANDOM_BUF) && (!defined(_WIN32) || defined(__CYGWIN__))+	la_arc4random_buf(buf, nbytes);+	return ARCHIVE_OK; #else 	arc4random_buf(buf, nbytes); 	return ARCHIVE_OK;@@ -256,7 +285,7 @@ }  static void-arc4random_buf(void *_buf, size_t n)+la_arc4random_buf(void *_buf, size_t n) { 	uint8_t *buf = (uint8_t *)_buf; 	_ARC4_LOCK();
c/archive_read.c view
@@ -58,7 +58,6 @@ static int	choose_filters(struct archive_read *); static int	choose_format(struct archive_read *); static int	close_filters(struct archive_read *);-static struct archive_vtable *archive_read_vtable(void); static int64_t	_archive_filter_bytes(struct archive *, int); static int	_archive_filter_code(struct archive *, int); static const char *_archive_filter_name(struct archive *, int);@@ -73,26 +72,18 @@ 		    struct archive_entry *); static int64_t  advance_file_pointer(struct archive_read_filter *, int64_t); -static struct archive_vtable *-archive_read_vtable(void)-{-	static struct archive_vtable av;-	static int inited = 0;--	if (!inited) {-		av.archive_filter_bytes = _archive_filter_bytes;-		av.archive_filter_code = _archive_filter_code;-		av.archive_filter_name = _archive_filter_name;-		av.archive_filter_count = _archive_filter_count;-		av.archive_read_data_block = _archive_read_data_block;-		av.archive_read_next_header = _archive_read_next_header;-		av.archive_read_next_header2 = _archive_read_next_header2;-		av.archive_free = _archive_read_free;-		av.archive_close = _archive_read_close;-		inited = 1;-	}-	return (&av);-}+static const struct archive_vtable+archive_read_vtable = {+	.archive_filter_bytes = _archive_filter_bytes,+	.archive_filter_code = _archive_filter_code,+	.archive_filter_name = _archive_filter_name,+	.archive_filter_count = _archive_filter_count,+	.archive_read_data_block = _archive_read_data_block,+	.archive_read_next_header = _archive_read_next_header,+	.archive_read_next_header2 = _archive_read_next_header2,+	.archive_free = _archive_read_free,+	.archive_close = _archive_read_close,+};  /*  * Allocate, initialize and return a struct archive object.@@ -109,7 +100,7 @@  	a->archive.state = ARCHIVE_STATE_NEW; 	a->entry = archive_entry_new2(&a->archive);-	a->archive.vtable = archive_read_vtable();+	a->archive.vtable = &archive_read_vtable;  	a->passphrases.last = &a->passphrases.first; @@ -245,18 +236,17 @@ }  static int-client_close_proxy(struct archive_read_filter *self)+read_client_close_proxy(struct archive_read *a) { 	int r = ARCHIVE_OK, r2; 	unsigned int i; -	if (self->archive->client.closer == NULL)+	if (a->client.closer == NULL) 		return (r);-	for (i = 0; i < self->archive->client.nodes; i++)+	for (i = 0; i < a->client.nodes; i++) 	{-		r2 = (self->archive->client.closer)-			((struct archive *)self->archive,-				self->archive->client.dataset[i].data);+		r2 = (a->client.closer)+			((struct archive *)a, a->client.dataset[i].data); 		if (r > r2) 			r = r2; 	}@@ -264,6 +254,12 @@ }  static int+client_close_proxy(struct archive_read_filter *self)+{+	return read_client_close_proxy(self->archive);+}++static int client_open_proxy(struct archive_read_filter *self) {   int r = ARCHIVE_OK;@@ -298,9 +294,7 @@ 			r1 = (self->archive->client.closer) 				((struct archive *)self->archive, self->data); 		self->data = data2;-		if (self->archive->client.opener != NULL)-			r2 = (self->archive->client.opener)-				((struct archive *)self->archive, self->data);+		r2 = client_open_proxy(self); 	} 	return (r1 < r2) ? r1 : r2; }@@ -457,13 +451,18 @@ 	return archive_read_add_callback_data(_a, client_data, 0); } +static const struct archive_read_filter_vtable+none_reader_vtable = {+	.read = client_read_proxy,+	.close = client_close_proxy,+};+ int archive_read_open1(struct archive *_a) { 	struct archive_read *a = (struct archive_read *)_a; 	struct archive_read_filter *filter, *tmp; 	int slot, e = ARCHIVE_OK;-	unsigned int i;  	archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW, 	    "archive_read_open");@@ -481,11 +480,7 @@ 		e = (a->client.opener)(&a->archive, a->client.dataset[0].data); 		if (e != 0) { 			/* If the open failed, call the closer to clean up. */-			if (a->client.closer) {-				for (i = 0; i < a->client.nodes; i++)-					(a->client.closer)(&a->archive,-					    a->client.dataset[i].data);-			}+			read_client_close_proxy(a); 			return (e); 		} 	}@@ -497,14 +492,11 @@ 	filter->upstream = NULL; 	filter->archive = a; 	filter->data = a->client.dataset[0].data;-	filter->open = client_open_proxy;-	filter->read = client_read_proxy;-	filter->skip = client_skip_proxy;-	filter->seek = client_seek_proxy;-	filter->close = client_close_proxy;-	filter->sswitch = client_switch_proxy;+	filter->vtable = &none_reader_vtable; 	filter->name = "none"; 	filter->code = ARCHIVE_FILTER_NONE;+	filter->can_skip = 1;+	filter->can_seek = 1;  	a->client.dataset[0].begin_position = 0; 	if (!a->filter || !a->bypass_filter_bidding)@@ -570,12 +562,12 @@  		bidder = a->bidders; 		for (i = 0; i < number_bidders; i++, bidder++) {-			if (bidder->bid != NULL) {-				bid = (bidder->bid)(bidder, a->filter);-				if (bid > best_bid) {-					best_bid = bid;-					best_bidder = bidder;-				}+			if (bidder->vtable == NULL)+				continue;+			bid = (bidder->vtable->bid)(bidder, a->filter);+			if (bid > best_bid) {+				best_bid = bid;+				best_bidder = bidder; 			} 		} @@ -587,8 +579,6 @@ 				__archive_read_free_filters(a); 				return (ARCHIVE_FATAL); 			}-			a->archive.compression_name = a->filter->name;-			a->archive.compression_code = a->filter->code; 			return (ARCHIVE_OK); 		} @@ -600,7 +590,7 @@ 		filter->archive = a; 		filter->upstream = a->filter; 		a->filter = filter;-		r = (best_bidder->init)(a->filter);+		r = (best_bidder->vtable->init)(a->filter); 		if (r != ARCHIVE_OK) { 			__archive_read_free_filters(a); 			return (ARCHIVE_FATAL);@@ -614,10 +604,9 @@ int __archive_read_header(struct archive_read *a, struct archive_entry *entry) {-	if (a->filter->read_header)-		return a->filter->read_header(a->filter, entry);-	else+	if (!a->filter->vtable->read_header) 		return (ARCHIVE_OK);+	return a->filter->vtable->read_header(a->filter, entry); }  /*@@ -1006,8 +995,8 @@ 	/* Close each filter in the pipeline. */ 	while (f != NULL) { 		struct archive_read_filter *t = f->upstream;-		if (!f->closed && f->close != NULL) {-			int r1 = (f->close)(f);+		if (!f->closed && f->vtable != NULL) {+			int r1 = (f->vtable->close)(f); 			f->closed = 1; 			if (r1 < r) 				r = r1;@@ -1112,11 +1101,10 @@ 	/* Release the bidder objects. */ 	n = sizeof(a->bidders)/sizeof(a->bidders[0]); 	for (i = 0; i < n; i++) {-		if (a->bidders[i].free != NULL) {-			int r1 = (a->bidders[i].free)(&a->bidders[i]);-			if (r1 < r)-				r = r1;-		}+		if (a->bidders[i].vtable == NULL ||+		    a->bidders[i].vtable->free == NULL)+			continue;+		(a->bidders[i].vtable->free)(&a->bidders[i]); 	}  	/* Release passphrase list. */@@ -1241,19 +1229,35 @@  * initialization functions.  */ int-__archive_read_get_bidder(struct archive_read *a,-    struct archive_read_filter_bidder **bidder)+__archive_read_register_bidder(struct archive_read *a,+	void *bidder_data,+	const char *name,+	const struct archive_read_filter_bidder_vtable *vtable) {+	struct archive_read_filter_bidder *bidder; 	int i, number_slots; +	archive_check_magic(&a->archive, ARCHIVE_READ_MAGIC,+	    ARCHIVE_STATE_NEW, "__archive_read_register_bidder");+ 	number_slots = sizeof(a->bidders) / sizeof(a->bidders[0]);  	for (i = 0; i < number_slots; i++) {-		if (a->bidders[i].bid == NULL) {-			memset(a->bidders + i, 0, sizeof(a->bidders[0]));-			*bidder = (a->bidders + i);-			return (ARCHIVE_OK);+		if (a->bidders[i].vtable != NULL)+			continue;+		memset(a->bidders + i, 0, sizeof(a->bidders[0]));+		bidder = (a->bidders + i);+		bidder->data = bidder_data;+		bidder->name = name;+		bidder->vtable = vtable;+		if (bidder->vtable->bid == NULL || bidder->vtable->init == NULL) {+			archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER,+					"Internal error: "+					"no bid/init for filter bidder");+			return (ARCHIVE_FATAL); 		}++		return (ARCHIVE_OK); 	}  	archive_set_error(&a->archive, ENOMEM,@@ -1382,7 +1386,7 @@ 					*avail = 0; 				return (NULL); 			}-			bytes_read = (filter->read)(filter,+			bytes_read = (filter->vtable->read)(filter, 			    &filter->client_buff); 			if (bytes_read < 0) {		/* Read error. */ 				filter->client_total = filter->client_avail = 0;@@ -1561,8 +1565,8 @@ 		return (total_bytes_skipped);  	/* If there's an optimized skip function, use it. */-	if (filter->skip != NULL) {-		bytes_skipped = (filter->skip)(filter, request);+	if (filter->can_skip != 0) {+		bytes_skipped = client_skip_proxy(filter, request); 		if (bytes_skipped < 0) {	/* error */ 			filter->fatal = 1; 			return (bytes_skipped);@@ -1576,7 +1580,7 @@  	/* Use ordinary reads as necessary to complete the request. */ 	for (;;) {-		bytes_read = (filter->read)(filter, &filter->client_buff);+		bytes_read = (filter->vtable->read)(filter, &filter->client_buff); 		if (bytes_read < 0) { 			filter->client_buff = NULL; 			filter->fatal = 1;@@ -1631,7 +1635,7 @@  	if (filter->closed || filter->fatal) 		return (ARCHIVE_FATAL);-	if (filter->seek == NULL)+	if (filter->can_seek == 0) 		return (ARCHIVE_FAILED);  	client = &(filter->archive->client);
c/archive_read_append_filter.c view
@@ -135,7 +135,7 @@     filter->archive = a;     filter->upstream = a->filter;     a->filter = filter;-    r2 = (bidder->init)(a->filter);+    r2 = (bidder->vtable->init)(a->filter);     if (r2 != ARCHIVE_OK) {       __archive_read_free_filters(a);       return (ARCHIVE_FATAL);@@ -192,7 +192,7 @@   filter->archive = a;   filter->upstream = a->filter;   a->filter = filter;-  r = (bidder->init)(a->filter);+  r = (bidder->vtable->init)(a->filter);   if (r != ARCHIVE_OK) {     __archive_read_free_filters(a);     return (ARCHIVE_FATAL);
c/archive_read_data_into_fd.c view
@@ -95,8 +95,13 @@ 	    "archive_read_data_into_fd");  	can_lseek = (fstat(fd, &st) == 0) && S_ISREG(st.st_mode);-	if (!can_lseek)+	if (!can_lseek) { 		nulls = calloc(1, nulls_size);+		if (!nulls) {+			r = ARCHIVE_FATAL;+			goto cleanup;+		}+	}  	while ((r = archive_read_data_block(a, &buff, &size, &target_offset)) == 	    ARCHIVE_OK) {
c/archive_read_disk_entry_from_file.c view
@@ -303,9 +303,11 @@ 		if (r1 < r) 			r = r1; 	}-	r1 = setup_sparse(a, entry, &fd);-	if (r1 < r)-		r = r1;+	if ((a->flags & ARCHIVE_READDISK_NO_SPARSE) == 0) {+		r1 = setup_sparse(a, entry, &fd);+		if (r1 < r)+			r = r1;+	}  	/* If we opened the file earlier in this function, close it. */ 	if (initial_fd != fd)
c/archive_read_disk_posix.c view
@@ -34,9 +34,6 @@ #ifdef HAVE_SYS_PARAM_H #include <sys/param.h> #endif-#ifdef HAVE_SYS_MOUNT_H-#include <sys/mount.h>-#endif #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> #endif@@ -54,6 +51,8 @@ #endif #ifdef HAVE_LINUX_FS_H #include <linux/fs.h>+#elif HAVE_SYS_MOUNT_H+#include <sys/mount.h> #endif /*  * Some Linux distributions have both linux/ext2_fs.h and ext2fs/ext2_fs.h.@@ -109,6 +108,11 @@ #define O_CLOEXEC	0 #endif +#if defined(__hpux) && !defined(HAVE_DIRFD)+#define dirfd(x) ((x)->__dd_fd)+#define HAVE_DIRFD+#endif+ /*-  * This is a new directory-walking system that addresses a number  * of problems I've had with fts(3).  In particular, it has no@@ -369,22 +373,14 @@ static int	tree_dup(int);  -static struct archive_vtable *-archive_read_disk_vtable(void)-{-	static struct archive_vtable av;-	static int inited = 0;--	if (!inited) {-		av.archive_free = _archive_read_free;-		av.archive_close = _archive_read_close;-		av.archive_read_data_block = _archive_read_data_block;-		av.archive_read_next_header = _archive_read_next_header;-		av.archive_read_next_header2 = _archive_read_next_header2;-		inited = 1;-	}-	return (&av);-}+static const struct archive_vtable+archive_read_disk_vtable = {+	.archive_free = _archive_read_free,+	.archive_close = _archive_read_close,+	.archive_read_data_block = _archive_read_data_block,+	.archive_read_next_header = _archive_read_next_header,+	.archive_read_next_header2 = _archive_read_next_header2,+};  const char * archive_read_disk_gname(struct archive *_a, la_int64_t gid)@@ -461,7 +457,7 @@ 		return (NULL); 	a->archive.magic = ARCHIVE_READ_DISK_MAGIC; 	a->archive.state = ARCHIVE_STATE_NEW;-	a->archive.vtable = archive_read_disk_vtable();+	a->archive.vtable = &archive_read_disk_vtable; 	a->entry = archive_entry_new2(&a->archive); 	a->lookup_uname = trivial_lookup_uname; 	a->lookup_gname = trivial_lookup_gname;@@ -1290,7 +1286,7 @@ 	    ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA, 	    "archive_read_disk_descend"); -	if (t->visit_type != TREE_REGULAR || !t->descend)+	if (!archive_read_disk_can_descend(_a)) 		return (ARCHIVE_OK);  	/*@@ -1674,6 +1670,11 @@ 	else 		t->current_filesystem->name_max = nm; #endif+	if (t->current_filesystem->name_max == 0) {+		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,+		    "Cannot determine name_max");+		return (ARCHIVE_FAILED);+	} #endif /* USE_READDIR_R */ 	return (ARCHIVE_OK); }@@ -1864,8 +1865,17 @@  #if defined(USE_READDIR_R) 	/* Set maximum filename length. */+#if defined(HAVE_STATVFS)+	t->current_filesystem->name_max = svfs.f_namemax;+#else 	t->current_filesystem->name_max = sfs.f_namelen; #endif+	if (t->current_filesystem->name_max == 0) {+		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,+		    "Cannot determine name_max");+		return (ARCHIVE_FAILED);+	}+#endif 	return (ARCHIVE_OK); } @@ -1946,6 +1956,11 @@ #if defined(USE_READDIR_R) 	/* Set maximum filename length. */ 	t->current_filesystem->name_max = svfs.f_namemax;+	if (t->current_filesystem->name_max == 0) {+		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,+		    "Cannot determine name_max");+		return (ARCHIVE_FAILED);+	} #endif 	return (ARCHIVE_OK); }@@ -2000,6 +2015,11 @@ 	else 		t->current_filesystem->name_max = nm; #  endif /* _PC_NAME_MAX */+	if (t->current_filesystem->name_max == 0) {+		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,+		    "Cannot determine name_max");+		return (ARCHIVE_FAILED);+	} #endif /* USE_READDIR_R */ 	return (ARCHIVE_OK); }@@ -2106,6 +2126,8 @@ 	struct tree_entry *te;  	te = calloc(1, sizeof(*te));+	if (te == NULL)+		__archive_errx(1, "Out of memory"); 	te->next = t->stack; 	te->parent = t->current; 	if (te->parent)@@ -2436,7 +2458,7 @@ #else /* HAVE_FDOPENDIR */ 		if (tree_enter_working_dir(t) == 0) { 			t->d = opendir(".");-#if HAVE_DIRFD || defined(dirfd)+#ifdef HAVE_DIRFD 			__archive_ensure_cloexec_flag(dirfd(t->d)); #endif 		}@@ -2545,7 +2567,11 @@ #else 		if (tree_enter_working_dir(t) != 0) 			return NULL;+#ifdef HAVE_LSTAT 		if (lstat(tree_current_access_path(t), &t->lst) != 0)+#else+		if (la_stat(tree_current_access_path(t), &t->lst) != 0)+#endif #endif 			return NULL; 		t->flags |= hasLstat;
c/archive_read_disk_windows.c view
@@ -418,8 +418,19 @@ 	    FILE_FLAG_OPEN_REPARSE_POINT; 	int ret; -	h = CreateFileW(path, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, flag,-	    NULL);+# if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+	CREATEFILE2_EXTENDED_PARAMETERS createExParams;+	ZeroMemory(&createExParams, sizeof(createExParams));+	createExParams.dwSize = sizeof(createExParams);+	createExParams.dwFileFlags = flag;+	h = CreateFile2(path, 0,+	    FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,+	    OPEN_EXISTING, &createExParams);+#else+	h = CreateFileW(path, 0,+	    FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,+	    OPEN_EXISTING, flag, NULL);+#endif 	if (h == INVALID_HANDLE_VALUE) { 		la_dosmaperr(GetLastError()); 		return (-1);@@ -449,22 +460,14 @@ 	return; } -static struct archive_vtable *-archive_read_disk_vtable(void)-{-	static struct archive_vtable av;-	static int inited = 0;--	if (!inited) {-		av.archive_free = _archive_read_free;-		av.archive_close = _archive_read_close;-		av.archive_read_data_block = _archive_read_data_block;-		av.archive_read_next_header = _archive_read_next_header;-		av.archive_read_next_header2 = _archive_read_next_header2;-		inited = 1;-	}-	return (&av);-}+static const struct archive_vtable+archive_read_disk_vtable = {+	.archive_free = _archive_read_free,+	.archive_close = _archive_read_close,+	.archive_read_data_block = _archive_read_data_block,+	.archive_read_next_header = _archive_read_next_header,+	.archive_read_next_header2 = _archive_read_next_header2,+};  const char * archive_read_disk_gname(struct archive *_a, la_int64_t gid)@@ -541,7 +544,7 @@ 		return (NULL); 	a->archive.magic = ARCHIVE_READ_DISK_MAGIC; 	a->archive.state = ARCHIVE_STATE_NEW;-	a->archive.vtable = archive_read_disk_vtable();+	a->archive.vtable = &archive_read_disk_vtable; 	a->entry = archive_entry_new2(&a->archive); 	a->lookup_uname = trivial_lookup_uname; 	a->lookup_gname = trivial_lookup_gname;@@ -1074,14 +1077,29 @@ 	if (archive_entry_filetype(entry) == AE_IFREG && 	    archive_entry_size(entry) > 0) { 		DWORD flags = FILE_FLAG_BACKUP_SEMANTICS;+#if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+		CREATEFILE2_EXTENDED_PARAMETERS createExParams;+#endif 		if (t->async_io) 			flags |= FILE_FLAG_OVERLAPPED; 		if (t->direct_io) 			flags |= FILE_FLAG_NO_BUFFERING; 		else 			flags |= FILE_FLAG_SEQUENTIAL_SCAN;+#if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+		ZeroMemory(&createExParams, sizeof(createExParams));+		createExParams.dwSize = sizeof(createExParams);+		createExParams.dwFileFlags = flags;+		t->entry_fh = CreateFile2(tree_current_access_path(t),+		    GENERIC_READ,+		    FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,+		    OPEN_EXISTING, &createExParams);+#else 		t->entry_fh = CreateFileW(tree_current_access_path(t),-		    GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, flags, NULL);+		    GENERIC_READ,+		    FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,+		    NULL, OPEN_EXISTING, flags, NULL);+#endif 		if (t->entry_fh == INVALID_HANDLE_VALUE) { 			la_dosmaperr(GetLastError()); 			archive_set_error(&a->archive, errno,@@ -1090,9 +1108,11 @@ 		}  		/* Find sparse data from the disk. */-		if (archive_entry_hardlink(entry) == NULL &&-		    (st->dwFileAttributes & FILE_ATTRIBUTE_SPARSE_FILE) != 0)-			r = setup_sparse_from_disk(a, entry, t->entry_fh);+		if ((a->flags & ARCHIVE_READDISK_NO_SPARSE) == 0) {+			if (archive_entry_hardlink(entry) == NULL &&+			    (st->dwFileAttributes & FILE_ATTRIBUTE_SPARSE_FILE) != 0)+				r = setup_sparse_from_disk(a, entry, t->entry_fh);+		} 	} 	return (r); }@@ -1300,7 +1320,7 @@ 	    ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA, 	    "archive_read_disk_descend"); -	if (t->visit_type != TREE_REGULAR || !t->descend)+	if (!archive_read_disk_can_descend(_a)) 		return (ARCHIVE_OK);  	if (tree_current_is_physical_dir(t)) {@@ -1550,6 +1570,9 @@ { 	HANDLE handle; 	int r = 0;+#if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+	CREATEFILE2_EXTENDED_PARAMETERS createExParams;+#endif  	if (h == INVALID_HANDLE_VALUE && AE_IFLNK == rt->filetype) 		return (0);@@ -1563,8 +1586,16 @@ 	if ((t->flags & needsRestoreTimes) == 0) 		return (r); +#if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+	ZeroMemory(&createExParams, sizeof(createExParams));+	createExParams.dwSize = sizeof(createExParams);+	createExParams.dwFileFlags = FILE_FLAG_BACKUP_SEMANTICS;+	handle = CreateFile2(rt->full_path, FILE_WRITE_ATTRIBUTES,+		    0, OPEN_EXISTING, &createExParams);+#else 	handle = CreateFileW(rt->full_path, FILE_WRITE_ATTRIBUTES, 		    0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);+#endif 	if (handle == INVALID_HANDLE_VALUE) { 		errno = EINVAL; 		return (-1);@@ -2049,11 +2080,24 @@ 	HANDLE h; 	int r; 	DWORD flag = FILE_FLAG_BACKUP_SEMANTICS;-	+# if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+	CREATEFILE2_EXTENDED_PARAMETERS createExParams;+#endif+ 	if (sim_lstat && tree_current_is_physical_link(t)) 		flag |= FILE_FLAG_OPEN_REPARSE_POINT;-	h = CreateFileW(tree_current_access_path(t), 0, FILE_SHARE_READ, NULL,+# if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+	ZeroMemory(&createExParams, sizeof(createExParams));+	createExParams.dwSize = sizeof(createExParams);+	createExParams.dwFileFlags = flag;+	h = CreateFile2(tree_current_access_path(t), 0,+	    FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,+	    OPEN_EXISTING, &createExParams);+#else+	h = CreateFileW(tree_current_access_path(t), 0,+	    FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, 	    OPEN_EXISTING, flag, NULL);+#endif 	if (h == INVALID_HANDLE_VALUE) { 		la_dosmaperr(GetLastError()); 		t->tree_errno = errno;@@ -2259,7 +2303,10 @@ 		} else { 			WIN32_FIND_DATAW findData; 			DWORD flag, desiredAccess;-	+# if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+			CREATEFILE2_EXTENDED_PARAMETERS createExParams;+#endif+ 			h = FindFirstFileW(path, &findData); 			if (h == INVALID_HANDLE_VALUE) { 				la_dosmaperr(GetLastError());@@ -2281,8 +2328,18 @@ 			} else 				desiredAccess = GENERIC_READ; -			h = CreateFileW(path, desiredAccess, FILE_SHARE_READ, NULL,+# if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+			ZeroMemory(&createExParams, sizeof(createExParams));+			createExParams.dwSize = sizeof(createExParams);+			createExParams.dwFileFlags = flag;+			h = CreateFile2(path, desiredAccess,+			    FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,+			    OPEN_EXISTING, &createExParams);+#else+			h = CreateFileW(path, desiredAccess,+			    FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, 			    OPEN_EXISTING, flag, NULL);+#endif 			if (h == INVALID_HANDLE_VALUE) { 				la_dosmaperr(GetLastError()); 				archive_set_error(&a->archive, errno,@@ -2343,8 +2400,19 @@ 		if (fd >= 0) { 			h = (HANDLE)_get_osfhandle(fd); 		} else {-			h = CreateFileW(path, GENERIC_READ, FILE_SHARE_READ, NULL,+# if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+			CREATEFILE2_EXTENDED_PARAMETERS createExParams;+			ZeroMemory(&createExParams, sizeof(createExParams));+			createExParams.dwSize = sizeof(createExParams);+			createExParams.dwFileFlags = FILE_FLAG_BACKUP_SEMANTICS;+			h = CreateFile2(path, GENERIC_READ,+			    FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,+			    OPEN_EXISTING, &createExParams);+#else+			h = CreateFileW(path, GENERIC_READ,+			    FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, 			    OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);+#endif 			if (h == INVALID_HANDLE_VALUE) { 				la_dosmaperr(GetLastError()); 				archive_set_error(&a->archive, errno,@@ -2371,9 +2439,11 @@ 		return (ARCHIVE_OK); 	} -	r = setup_sparse_from_disk(a, entry, h);-	if (fd < 0)-		CloseHandle(h);+	if ((a->flags & ARCHIVE_READDISK_NO_SPARSE) == 0) {+		r = setup_sparse_from_disk(a, entry, h);+		if (fd < 0)+			CloseHandle(h);+	}  	return (r); }
c/archive_read_open_file.c view
@@ -154,10 +154,10 @@ #ifdef __ANDROID__         /* fileno() isn't safe on all platforms ... see above. */ 	if (lseek(fileno(mine->f), skip, SEEK_CUR) < 0)-#elif HAVE_FSEEKO-	if (fseeko(mine->f, skip, SEEK_CUR) != 0) #elif HAVE__FSEEKI64 	if (_fseeki64(mine->f, skip, SEEK_CUR) != 0)+#elif HAVE_FSEEKO+	if (fseeko(mine->f, skip, SEEK_CUR) != 0) #else 	if (fseek(mine->f, skip, SEEK_CUR) != 0) #endif
c/archive_read_private.h view
@@ -42,6 +42,16 @@ struct archive_read_filter_bidder; struct archive_read_filter; +struct archive_read_filter_bidder_vtable {+	/* Taste the upstream filter to see if we handle this. */+	int (*bid)(struct archive_read_filter_bidder *,+	    struct archive_read_filter *);+	/* Initialize a newly-created filter. */+	int (*init)(struct archive_read_filter *);+	/* Release the bidder's configuration data. */+	void (*free)(struct archive_read_filter_bidder *);+};+ /*  * How bidding works for filters:  *   * The bid manager initializes the client-provided reader as the@@ -62,18 +72,18 @@ 	void *data; 	/* Name of the filter */ 	const char *name;-	/* Taste the upstream filter to see if we handle this. */-	int (*bid)(struct archive_read_filter_bidder *,-	    struct archive_read_filter *);-	/* Initialize a newly-created filter. */-	int (*init)(struct archive_read_filter *);-	/* Set an option for the filter bidder. */-	int (*options)(struct archive_read_filter_bidder *,-	    const char *key, const char *value);-	/* Release the bidder's configuration data. */-	int (*free)(struct archive_read_filter_bidder *);+	const struct archive_read_filter_bidder_vtable *vtable; }; +struct archive_read_filter_vtable {+	/* Return next block. */+	ssize_t (*read)(struct archive_read_filter *, const void **);+	/* Close (just this filter) and free(self). */+	int (*close)(struct archive_read_filter *self);+	/* Read any header metadata if available. */+	int (*read_header)(struct archive_read_filter *self, struct archive_entry *entry);+};+ /*  * This structure is allocated within the archive_read core  * and initialized by archive_read and the init() method of the@@ -86,25 +96,14 @@ 	struct archive_read_filter_bidder *bidder; /* My bidder. */ 	struct archive_read_filter *upstream; /* Who I read from. */ 	struct archive_read *archive; /* Associated archive. */-	/* Open a block for reading */-	int (*open)(struct archive_read_filter *self);-	/* Return next block. */-	ssize_t (*read)(struct archive_read_filter *, const void **);-	/* Skip forward this many bytes. */-	int64_t (*skip)(struct archive_read_filter *self, int64_t request);-	/* Seek to an absolute location. */-	int64_t (*seek)(struct archive_read_filter *self, int64_t offset, int whence);-	/* Close (just this filter) and free(self). */-	int (*close)(struct archive_read_filter *self);-	/* Function that handles switching from reading one block to the next/prev */-	int (*sswitch)(struct archive_read_filter *self, unsigned int iindex);-	/* Read any header metadata if available. */-	int (*read_header)(struct archive_read_filter *self, struct archive_entry *entry);+	const struct archive_read_filter_vtable *vtable; 	/* My private data. */ 	void *data;  	const char	*name; 	int		 code;+	int		 can_skip;+	int		 can_seek;  	/* Used by reblocking logic. */ 	char		*buffer;@@ -242,8 +241,10 @@ 		int (*format_capabilities)(struct archive_read *), 		int (*has_encrypted_entries)(struct archive_read *)); -int __archive_read_get_bidder(struct archive_read *a,-    struct archive_read_filter_bidder **bidder);+int __archive_read_register_bidder(struct archive_read *a,+		void *bidder_data,+		const char *name,+		const struct archive_read_filter_bidder_vtable *vtable);  const void *__archive_read_ahead(struct archive_read *, size_t, ssize_t *); const void *__archive_read_filter_ahead(struct archive_read_filter *,
c/archive_read_set_options.c view
@@ -112,37 +112,15 @@ archive_set_filter_option(struct archive *_a, const char *m, const char *o,     const char *v) {-	struct archive_read *a = (struct archive_read *)_a;-	struct archive_read_filter *filter;-	struct archive_read_filter_bidder *bidder;-	int r, rv = ARCHIVE_WARN, matched_modules = 0;--	for (filter = a->filter; filter != NULL; filter = filter->upstream) {-		bidder = filter->bidder;-		if (bidder == NULL)-			continue;-		if (bidder->options == NULL)-			/* This bidder does not support option */-			continue;-		if (m != NULL) {-			if (strcmp(filter->name, m) != 0)-				continue;-			++matched_modules;-		}--		r = bidder->options(bidder, o, v);--		if (r == ARCHIVE_FATAL)-			return (ARCHIVE_FATAL);+	(void)_a; /* UNUSED */+	(void)o; /* UNUSED */+	(void)v; /* UNUSED */ -		if (r == ARCHIVE_OK)-			rv = ARCHIVE_OK;-	} 	/* If the filter name didn't match, return a special code for 	 * _archive_set_option[s]. */-	if (m != NULL && matched_modules == 0)+	if (m != NULL) 		return ARCHIVE_WARN - 1;-	return (rv);+	return ARCHIVE_WARN; }  static int
c/archive_read_support_filter_bzip2.c view
@@ -70,7 +70,6 @@  */ static int	bzip2_reader_bid(struct archive_read_filter_bidder *, struct archive_read_filter *); static int	bzip2_reader_init(struct archive_read_filter *);-static int	bzip2_reader_free(struct archive_read_filter_bidder *);  #if ARCHIVE_VERSION_NUMBER < 4000000 /* Deprecated; remove in libarchive 4.0 */@@ -81,24 +80,21 @@ } #endif +static const struct archive_read_filter_bidder_vtable+bzip2_bidder_vtable = {+	.bid = bzip2_reader_bid,+	.init = bzip2_reader_init,+};+ int archive_read_support_filter_bzip2(struct archive *_a) { 	struct archive_read *a = (struct archive_read *)_a;-	struct archive_read_filter_bidder *reader; -	archive_check_magic(_a, ARCHIVE_READ_MAGIC,-	    ARCHIVE_STATE_NEW, "archive_read_support_filter_bzip2");--	if (__archive_read_get_bidder(a, &reader) != ARCHIVE_OK)+	if (__archive_read_register_bidder(a, NULL, "bzip2",+				&bzip2_bidder_vtable) != ARCHIVE_OK) 		return (ARCHIVE_FATAL); -	reader->data = NULL;-	reader->name = "bzip2";-	reader->bid = bzip2_reader_bid;-	reader->init = bzip2_reader_init;-	reader->options = NULL;-	reader->free = bzip2_reader_free; #if defined(HAVE_BZLIB_H) && defined(BZ_CONFIG_ERROR) 	return (ARCHIVE_OK); #else@@ -108,12 +104,6 @@ #endif } -static int-bzip2_reader_free(struct archive_read_filter_bidder *self){-	(void)self; /* UNUSED */-	return (ARCHIVE_OK);-}- /*  * Test whether we can handle this data.  *@@ -183,6 +173,12 @@  #else +static const struct archive_read_filter_vtable+bzip2_reader_vtable = {+	.read = bzip2_filter_read,+	.close = bzip2_filter_close,+};+ /*  * Setup the callbacks.  */@@ -209,9 +205,7 @@ 	self->data = state; 	state->out_block_size = out_block_size; 	state->out_block = out_block;-	self->read = bzip2_filter_read;-	self->skip = NULL; /* not supported */-	self->close = bzip2_filter_close;+	self->vtable = &bzip2_reader_vtable;  	return (ARCHIVE_OK); }@@ -236,7 +230,7 @@  	/* Empty our output buffer. */ 	state->stream.next_out = state->out_block;-	state->stream.avail_out = state->out_block_size;+	state->stream.avail_out = (uint32_t)state->out_block_size;  	/* Try to fill the output buffer. */ 	for (;;) {@@ -294,7 +288,7 @@ 			return (ARCHIVE_FATAL); 		} 		state->stream.next_in = (char *)(uintptr_t)read_buf;-		state->stream.avail_in = ret;+		state->stream.avail_in = (uint32_t)ret; 		/* There is no more data, return whatever we have. */ 		if (ret == 0) { 			state->eof = 1;
c/archive_read_support_filter_compress.c view
@@ -133,7 +133,6 @@  static int	compress_bidder_bid(struct archive_read_filter_bidder *, struct archive_read_filter *); static int	compress_bidder_init(struct archive_read_filter *);-static int	compress_bidder_free(struct archive_read_filter_bidder *);  static ssize_t	compress_filter_read(struct archive_read_filter *, const void **); static int	compress_filter_close(struct archive_read_filter *);@@ -150,25 +149,19 @@ } #endif +static const struct archive_read_filter_bidder_vtable+compress_bidder_vtable = {+	.bid = compress_bidder_bid,+	.init = compress_bidder_init,+};+ int archive_read_support_filter_compress(struct archive *_a) { 	struct archive_read *a = (struct archive_read *)_a;-	struct archive_read_filter_bidder *bidder; -	archive_check_magic(_a, ARCHIVE_READ_MAGIC,-	    ARCHIVE_STATE_NEW, "archive_read_support_filter_compress");--	if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK)-		return (ARCHIVE_FATAL);--	bidder->data = NULL;-	bidder->name = "compress (.Z)";-	bidder->bid = compress_bidder_bid;-	bidder->init = compress_bidder_init;-	bidder->options = NULL;-	bidder->free = compress_bidder_free;-	return (ARCHIVE_OK);+	return __archive_read_register_bidder(a, NULL, "compress (.Z)",+			&compress_bidder_vtable); }  /*@@ -205,6 +198,12 @@ 	return (bits_checked); } +static const struct archive_read_filter_vtable+compress_reader_vtable = {+	.read = compress_filter_read,+	.close = compress_filter_close,+};+ /*  * Setup the callbacks.  */@@ -233,9 +232,7 @@ 	self->data = state; 	state->out_block_size = out_block_size; 	state->out_block = out_block;-	self->read = compress_filter_read;-	self->skip = NULL; /* not supported */-	self->close = compress_filter_close;+	self->vtable = &compress_reader_vtable;  	/* XXX MOVE THE FOLLOWING OUT OF INIT() XXX */ @@ -303,16 +300,6 @@  	*pblock = start; 	return (p - start);-}--/*- * Clean up the reader.- */-static int-compress_bidder_free(struct archive_read_filter_bidder *self)-{-	self->data = NULL;-	return (ARCHIVE_OK); }  /*
c/archive_read_support_filter_grzip.c view
@@ -54,30 +54,21 @@ static int	grzip_bidder_init(struct archive_read_filter *);  -static int-grzip_reader_free(struct archive_read_filter_bidder *self)-{-	(void)self; /* UNUSED */-	return (ARCHIVE_OK);-}+static const struct archive_read_filter_bidder_vtable+grzip_bidder_vtable = {+	.bid = grzip_bidder_bid,+	.init = grzip_bidder_init,+};  int archive_read_support_filter_grzip(struct archive *_a) { 	struct archive_read *a = (struct archive_read *)_a;-	struct archive_read_filter_bidder *reader; -	archive_check_magic(_a, ARCHIVE_READ_MAGIC,-	    ARCHIVE_STATE_NEW, "archive_read_support_filter_grzip");--	if (__archive_read_get_bidder(a, &reader) != ARCHIVE_OK)+	if (__archive_read_register_bidder(a, NULL, NULL,+				&grzip_bidder_vtable) != ARCHIVE_OK) 		return (ARCHIVE_FATAL); -	reader->data = NULL;-	reader->bid = grzip_bidder_bid;-	reader->init = grzip_bidder_init;-	reader->options = NULL;-	reader->free = grzip_reader_free; 	/* This filter always uses an external program. */ 	archive_set_error(_a, ARCHIVE_ERRNO_MISC, 	    "Using external grzip program for grzip decompression");
c/archive_read_support_filter_gzip.c view
@@ -94,24 +94,21 @@ } #endif +static const struct archive_read_filter_bidder_vtable+gzip_bidder_vtable = {+	.bid = gzip_bidder_bid,+	.init = gzip_bidder_init,+};+ int archive_read_support_filter_gzip(struct archive *_a) { 	struct archive_read *a = (struct archive_read *)_a;-	struct archive_read_filter_bidder *bidder; -	archive_check_magic(_a, ARCHIVE_READ_MAGIC,-	    ARCHIVE_STATE_NEW, "archive_read_support_filter_gzip");--	if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK)+	if (__archive_read_register_bidder(a, NULL, "gzip",+				&gzip_bidder_vtable) != ARCHIVE_OK) 		return (ARCHIVE_FATAL); -	bidder->data = NULL;-	bidder->name = "gzip";-	bidder->bid = gzip_bidder_bid;-	bidder->init = gzip_bidder_init;-	bidder->options = NULL;-	bidder->free = NULL; /* No data, so no cleanup necessary. */ 	/* Signal the extent of gzip support with the return value here. */ #if HAVE_ZLIB_H 	return (ARCHIVE_OK);@@ -291,6 +288,15 @@ 	return (ARCHIVE_OK); } +static const struct archive_read_filter_vtable+gzip_reader_vtable = {+	.read = gzip_filter_read,+	.close = gzip_filter_close,+#ifdef HAVE_ZLIB_H+	.read_header = gzip_read_header,+#endif+};+ /*  * Initialize the filter object.  */@@ -317,12 +323,7 @@ 	self->data = state; 	state->out_block_size = out_block_size; 	state->out_block = out_block;-	self->read = gzip_filter_read;-	self->skip = NULL; /* not supported */-	self->close = gzip_filter_close;-#ifdef HAVE_ZLIB_H-	self->read_header = gzip_read_header;-#endif+	self->vtable = &gzip_reader_vtable;  	state->in_stream = 0; /* We're not actually within a stream yet. */ 
c/archive_read_support_filter_lrzip.c view
@@ -53,31 +53,21 @@ static int	lrzip_bidder_init(struct archive_read_filter *);  -static int-lrzip_reader_free(struct archive_read_filter_bidder *self)-{-	(void)self; /* UNUSED */-	return (ARCHIVE_OK);-}+static const struct archive_read_filter_bidder_vtable+lrzip_bidder_vtable = {+	.bid = lrzip_bidder_bid,+	.init = lrzip_bidder_init,+};  int archive_read_support_filter_lrzip(struct archive *_a) { 	struct archive_read *a = (struct archive_read *)_a;-	struct archive_read_filter_bidder *reader; -	archive_check_magic(_a, ARCHIVE_READ_MAGIC,-	    ARCHIVE_STATE_NEW, "archive_read_support_filter_lrzip");--	if (__archive_read_get_bidder(a, &reader) != ARCHIVE_OK)+	if (__archive_read_register_bidder(a, NULL, "lrzip",+				&lrzip_bidder_vtable) != ARCHIVE_OK) 		return (ARCHIVE_FATAL); -	reader->data = NULL;-	reader->name = "lrzip";-	reader->bid = lrzip_bidder_bid;-	reader->init = lrzip_bidder_init;-	reader->options = NULL;-	reader->free = lrzip_reader_free; 	/* This filter always uses an external program. */ 	archive_set_error(_a, ARCHIVE_ERRNO_MISC, 	    "Using external lrzip program for lrzip decompression");
c/archive_read_support_filter_lz4.c view
@@ -99,7 +99,6 @@  */ static int	lz4_reader_bid(struct archive_read_filter_bidder *, struct archive_read_filter *); static int	lz4_reader_init(struct archive_read_filter *);-static int	lz4_reader_free(struct archive_read_filter_bidder *); #if defined(HAVE_LIBLZ4) static ssize_t  lz4_filter_read_default_stream(struct archive_read_filter *, 		    const void **);@@ -107,24 +106,21 @@ 		    const void **); #endif +static const struct archive_read_filter_bidder_vtable+lz4_bidder_vtable = {+	.bid = lz4_reader_bid,+	.init = lz4_reader_init,+};+ int archive_read_support_filter_lz4(struct archive *_a) { 	struct archive_read *a = (struct archive_read *)_a;-	struct archive_read_filter_bidder *reader; -	archive_check_magic(_a, ARCHIVE_READ_MAGIC,-	    ARCHIVE_STATE_NEW, "archive_read_support_filter_lz4");--	if (__archive_read_get_bidder(a, &reader) != ARCHIVE_OK)+	if (__archive_read_register_bidder(a, NULL, "lz4",+				&lz4_bidder_vtable) != ARCHIVE_OK) 		return (ARCHIVE_FATAL); -	reader->data = NULL;-	reader->name = "lz4";-	reader->bid = lz4_reader_bid;-	reader->init = lz4_reader_init;-	reader->options = NULL;-	reader->free = lz4_reader_free; #if defined(HAVE_LIBLZ4) 	return (ARCHIVE_OK); #else@@ -134,12 +130,6 @@ #endif } -static int-lz4_reader_free(struct archive_read_filter_bidder *self){-	(void)self; /* UNUSED */-	return (ARCHIVE_OK);-}- /*  * Test whether we can handle this data.  *@@ -218,6 +208,12 @@  #else +static const struct archive_read_filter_vtable+lz4_reader_vtable = {+	.read = lz4_filter_read,+	.close = lz4_filter_close,+};+ /*  * Setup the callbacks.  */@@ -238,9 +234,7 @@  	self->data = state; 	state->stage = SELECT_STREAM;-	self->read = lz4_filter_read;-	self->skip = NULL; /* not supported */-	self->close = lz4_filter_close;+	self->vtable = &lz4_reader_vtable;  	return (ARCHIVE_OK); }@@ -456,7 +450,9 @@ 	chsum = (chsum >> 8) & 0xff; 	chsum_verifier = read_buf[descriptor_bytes-1] & 0xff; 	if (chsum != chsum_verifier)+#ifndef DONT_FAIL_ON_CRC_ERROR 		goto malformed_error;+#endif  	__archive_read_filter_consume(self->upstream, descriptor_bytes); @@ -527,7 +523,9 @@ 		unsigned int chsum_block = 		    archive_le32dec(read_buf + 4 + compressed_size); 		if (chsum != chsum_block)+#ifndef DONT_FAIL_ON_CRC_ERROR 			goto malformed_error;+#endif 	}  @@ -586,7 +584,7 @@ 		    state->out_block + prefix64k, (int)compressed_size, 		    state->flags.block_maximum_size, 		    state->out_block,-		    prefix64k);+		    (int)prefix64k); #else 		uncompressed_size = LZ4_decompress_safe_withPrefix64k( 		    read_buf + 4,@@ -658,10 +656,12 @@ 			    state->xxh32_state); 			state->xxh32_state = NULL; 			if (checksum != checksum_stream) {+#ifndef DONT_FAIL_ON_CRC_ERROR 				archive_set_error(&self->archive->archive, 				    ARCHIVE_ERRNO_MISC, 				    "lz4 stream checksum error"); 				return (ARCHIVE_FATAL);+#endif 			} 		} else if (ret > 0) 			__archive_xxhash.XXH32_update(state->xxh32_state,
c/archive_read_support_filter_lzop.c view
@@ -101,23 +101,21 @@     struct archive_read_filter *); static int lzop_bidder_init(struct archive_read_filter *); +static const struct archive_read_filter_bidder_vtable+lzop_bidder_vtable = {+	.bid = lzop_bidder_bid,+	.init = lzop_bidder_init,+};+ int archive_read_support_filter_lzop(struct archive *_a) { 	struct archive_read *a = (struct archive_read *)_a;-	struct archive_read_filter_bidder *reader; -	archive_check_magic(_a, ARCHIVE_READ_MAGIC,-	    ARCHIVE_STATE_NEW, "archive_read_support_filter_lzop");--	if (__archive_read_get_bidder(a, &reader) != ARCHIVE_OK)+	if (__archive_read_register_bidder(a, NULL, NULL,+				&lzop_bidder_vtable) != ARCHIVE_OK) 		return (ARCHIVE_FATAL); -	reader->data = NULL;-	reader->bid = lzop_bidder_bid;-	reader->init = lzop_bidder_init;-	reader->options = NULL;-	reader->free = NULL; 	/* Signal the extent of lzop support with the return value here. */ #if defined(HAVE_LZO_LZOCONF_H) && defined(HAVE_LZO_LZO1X_H) 	return (ARCHIVE_OK);@@ -171,6 +169,13 @@ 	return (r); } #else++static const struct archive_read_filter_vtable+lzop_reader_vtable = {+	.read = lzop_filter_read,+	.close = lzop_filter_close+};+ /*  * Initialize the filter object.  */@@ -190,9 +195,7 @@ 	}  	self->data = state;-	self->read = lzop_filter_read;-	self->skip = NULL; /* not supported */-	self->close = lzop_filter_close;+	self->vtable = &lzop_reader_vtable;  	return (ARCHIVE_OK); }@@ -280,7 +283,9 @@ 	else 		checksum = adler32(adler32(0, NULL, 0), p, len); 	if (archive_be32dec(p + len) != checksum)+#ifndef DONT_FAIL_ON_CRC_ERROR 		goto corrupted;+#endif 	__archive_read_filter_consume(self->upstream, len + 4); 	if (flags & EXTRA_FIELD) { 		/* Skip extra field */
c/archive_read_support_filter_program.c view
@@ -98,7 +98,7 @@ static int	program_bidder_bid(struct archive_read_filter_bidder *, 		    struct archive_read_filter *upstream); static int	program_bidder_init(struct archive_read_filter *);-static int	program_bidder_free(struct archive_read_filter_bidder *);+static void	program_bidder_free(struct archive_read_filter_bidder *);  /*  * The actual filter needs to track input and output data.@@ -123,43 +123,21 @@ static int	program_filter_close(struct archive_read_filter *); static void	free_state(struct program_bidder *); -static int-set_bidder_signature(struct archive_read_filter_bidder *bidder,-    struct program_bidder *state, const void *signature, size_t signature_len)-{--	if (signature != NULL && signature_len > 0) {-		state->signature_len = signature_len;-		state->signature = malloc(signature_len);-		memcpy(state->signature, signature, signature_len);-	}--	/*-	 * Fill in the bidder object.-	 */-	bidder->data = state;-	bidder->bid = program_bidder_bid;-	bidder->init = program_bidder_init;-	bidder->options = NULL;-	bidder->free = program_bidder_free;-	return (ARCHIVE_OK);-}+static const struct archive_read_filter_bidder_vtable+program_bidder_vtable = {+	.bid = program_bidder_bid,+	.init = program_bidder_init,+	.free = program_bidder_free,+};  int archive_read_support_filter_program_signature(struct archive *_a,     const char *cmd, const void *signature, size_t signature_len) { 	struct archive_read *a = (struct archive_read *)_a;-	struct archive_read_filter_bidder *bidder; 	struct program_bidder *state;  	/*-	 * Get a bidder object from the read core.-	 */-	if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK)-		return (ARCHIVE_FATAL);--	/* 	 * Allocate our private state. 	 */ 	state = (struct program_bidder *)calloc(1, sizeof (*state));@@ -169,20 +147,31 @@ 	if (state->cmd == NULL) 		goto memerr; -	return set_bidder_signature(bidder, state, signature, signature_len);+	if (signature != NULL && signature_len > 0) {+		state->signature_len = signature_len;+		state->signature = malloc(signature_len);+		memcpy(state->signature, signature, signature_len);+	}++	if (__archive_read_register_bidder(a, state, NULL,+				&program_bidder_vtable) != ARCHIVE_OK) {+		free_state(state);+		return (ARCHIVE_FATAL);+	}+	return (ARCHIVE_OK);+ memerr: 	free_state(state); 	archive_set_error(_a, ENOMEM, "Can't allocate memory"); 	return (ARCHIVE_FATAL); } -static int+static void program_bidder_free(struct archive_read_filter_bidder *self) { 	struct program_bidder *state = (struct program_bidder *)self->data;  	free_state(state);-	return (ARCHIVE_OK); }  static void@@ -393,6 +382,12 @@ 	} } +static const struct archive_read_filter_vtable+program_reader_vtable = {+	.read = program_filter_read,+	.close = program_filter_close,+};+ int __archive_read_program(struct archive_read_filter *self, const char *cmd) {@@ -439,9 +434,7 @@ 	}  	self->data = state;-	self->read = program_filter_read;-	self->skip = NULL;-	self->close = program_filter_close;+	self->vtable = &program_reader_vtable;  	/* XXX Check that we can read at least one byte? */ 	return (ARCHIVE_OK);
c/archive_read_support_filter_rpm.c view
@@ -72,25 +72,19 @@ } #endif +static const struct archive_read_filter_bidder_vtable+rpm_bidder_vtable = {+	.bid = rpm_bidder_bid,+	.init = rpm_bidder_init,+};+ int archive_read_support_filter_rpm(struct archive *_a) { 	struct archive_read *a = (struct archive_read *)_a;-	struct archive_read_filter_bidder *bidder; -	archive_check_magic(_a, ARCHIVE_READ_MAGIC,-	    ARCHIVE_STATE_NEW, "archive_read_support_filter_rpm");--	if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK)-		return (ARCHIVE_FATAL);--	bidder->data = NULL;-	bidder->name = "rpm";-	bidder->bid = rpm_bidder_bid;-	bidder->init = rpm_bidder_init;-	bidder->options = NULL;-	bidder->free = NULL;-	return (ARCHIVE_OK);+	return __archive_read_register_bidder(a, NULL, "rpm",+			&rpm_bidder_vtable); }  static int@@ -133,6 +127,12 @@ 	return (bits_checked); } +static const struct archive_read_filter_vtable+rpm_reader_vtable = {+	.read = rpm_filter_read,+	.close = rpm_filter_close,+};+ static int rpm_bidder_init(struct archive_read_filter *self) {@@ -140,9 +140,6 @@  	self->code = ARCHIVE_FILTER_RPM; 	self->name = "rpm";-	self->read = rpm_filter_read;-	self->skip = NULL; /* not supported */-	self->close = rpm_filter_close;  	rpm = (struct rpm *)calloc(sizeof(*rpm), 1); 	if (rpm == NULL) {@@ -153,6 +150,7 @@  	self->data = rpm; 	rpm->state = ST_LEAD;+	self->vtable = &rpm_reader_vtable;  	return (ARCHIVE_OK); }
c/archive_read_support_filter_uu.c view
@@ -76,25 +76,19 @@ } #endif +static const struct archive_read_filter_bidder_vtable+uudecode_bidder_vtable = {+	.bid = uudecode_bidder_bid,+	.init = uudecode_bidder_init,+};+ int archive_read_support_filter_uu(struct archive *_a) { 	struct archive_read *a = (struct archive_read *)_a;-	struct archive_read_filter_bidder *bidder; -	archive_check_magic(_a, ARCHIVE_READ_MAGIC,-	    ARCHIVE_STATE_NEW, "archive_read_support_filter_uu");--	if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK)-		return (ARCHIVE_FATAL);--	bidder->data = NULL;-	bidder->name = "uu";-	bidder->bid = uudecode_bidder_bid;-	bidder->init = uudecode_bidder_init;-	bidder->options = NULL;-	bidder->free = NULL;-	return (ARCHIVE_OK);+	return __archive_read_register_bidder(a, NULL, "uu",+			&uudecode_bidder_vtable); }  static const unsigned char ascii[256] = {@@ -357,6 +351,12 @@ 	return (0); } +static const struct archive_read_filter_vtable+uudecode_reader_vtable = {+	.read = uudecode_filter_read,+	.close = uudecode_filter_close,+};+ static int uudecode_bidder_init(struct archive_read_filter *self) {@@ -366,9 +366,6 @@  	self->code = ARCHIVE_FILTER_UU; 	self->name = "uu";-	self->read = uudecode_filter_read;-	self->skip = NULL; /* not supported */-	self->close = uudecode_filter_close;  	uudecode = (struct uudecode *)calloc(sizeof(*uudecode), 1); 	out_buff = malloc(OUT_BUFF_SIZE);@@ -388,6 +385,7 @@ 	uudecode->in_allocated = IN_BUFF_SIZE; 	uudecode->out_buff = out_buff; 	uudecode->state = ST_FIND_HEAD;+	self->vtable = &uudecode_reader_vtable;  	return (ARCHIVE_OK); }
c/archive_read_support_filter_xz.c view
@@ -108,24 +108,21 @@ } #endif +static const struct archive_read_filter_bidder_vtable+xz_bidder_vtable = {+	.bid = xz_bidder_bid,+	.init = xz_bidder_init,+};+ int archive_read_support_filter_xz(struct archive *_a) { 	struct archive_read *a = (struct archive_read *)_a;-	struct archive_read_filter_bidder *bidder; -	archive_check_magic(_a, ARCHIVE_READ_MAGIC,-	    ARCHIVE_STATE_NEW, "archive_read_support_filter_xz");--	if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK)+	if (__archive_read_register_bidder(a, NULL, "xz",+				&xz_bidder_vtable) != ARCHIVE_OK) 		return (ARCHIVE_FATAL); -	bidder->data = NULL;-	bidder->name = "xz";-	bidder->bid = xz_bidder_bid;-	bidder->init = xz_bidder_init;-	bidder->options = NULL;-	bidder->free = NULL; #if HAVE_LZMA_H && HAVE_LIBLZMA 	return (ARCHIVE_OK); #else@@ -143,24 +140,21 @@ } #endif +static const struct archive_read_filter_bidder_vtable+lzma_bidder_vtable = {+	.bid = lzma_bidder_bid,+	.init = lzma_bidder_init,+};+ int archive_read_support_filter_lzma(struct archive *_a) { 	struct archive_read *a = (struct archive_read *)_a;-	struct archive_read_filter_bidder *bidder; -	archive_check_magic(_a, ARCHIVE_READ_MAGIC,-	    ARCHIVE_STATE_NEW, "archive_read_support_filter_lzma");--	if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK)+	if (__archive_read_register_bidder(a, NULL, "lzma",+				&lzma_bidder_vtable) != ARCHIVE_OK) 		return (ARCHIVE_FATAL); -	bidder->data = NULL;-	bidder->name = "lzma";-	bidder->bid = lzma_bidder_bid;-	bidder->init = lzma_bidder_init;-	bidder->options = NULL;-	bidder->free = NULL; #if HAVE_LZMA_H && HAVE_LIBLZMA 	return (ARCHIVE_OK); #else@@ -179,24 +173,21 @@ } #endif +static const struct archive_read_filter_bidder_vtable+lzip_bidder_vtable = {+	.bid = lzip_bidder_bid,+	.init = lzip_bidder_init,+};+ int archive_read_support_filter_lzip(struct archive *_a) { 	struct archive_read *a = (struct archive_read *)_a;-	struct archive_read_filter_bidder *bidder; -	archive_check_magic(_a, ARCHIVE_READ_MAGIC,-	    ARCHIVE_STATE_NEW, "archive_read_support_filter_lzip");--	if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK)+	if (__archive_read_register_bidder(a, NULL, "lzip",+				&lzip_bidder_vtable) != ARCHIVE_OK) 		return (ARCHIVE_FATAL); -	bidder->data = NULL;-	bidder->name = "lzip";-	bidder->bid = lzip_bidder_bid;-	bidder->init = lzip_bidder_init;-	bidder->options = NULL;-	bidder->free = NULL; #if HAVE_LZMA_H && HAVE_LIBLZMA 	return (ARCHIVE_OK); #else@@ -293,8 +284,8 @@ 	/* Second through fifth bytes are dictionary size, stored in 	 * little-endian order. The minimum dictionary size is 	 * 1 << 12(4KiB) which the lzma of LZMA SDK uses with option-	 * -d12 and the maximum dictionary size is 1 << 27(128MiB)-	 * which the one uses with option -d27.+	 * -d12 and the maximum dictionary size is 1 << 29(512MiB)+	 * which the one uses with option -d29. 	 * NOTE: A comment of LZMA SDK source code says this dictionary 	 * range is from 1 << 12 to 1 << 30. */ 	dicsize = archive_le32dec(buffer+1);@@ -377,7 +368,7 @@  	/* Dictionary size. */ 	log2dic = buffer[5] & 0x1f;-	if (log2dic < 12 || log2dic > 27)+	if (log2dic < 12 || log2dic > 29) 		return (0); 	bits_checked += 8; @@ -470,6 +461,12 @@ 	} } +static const struct archive_read_filter_vtable+xz_lzma_reader_vtable = {+	.read = xz_filter_read,+	.close = xz_filter_close,+};+ /*  * Setup the callbacks.  */@@ -494,9 +491,7 @@ 	self->data = state; 	state->out_block_size = out_block_size; 	state->out_block = out_block;-	self->read = xz_filter_read;-	self->skip = NULL; /* not supported */-	self->close = xz_filter_close;+	self->vtable = &xz_lzma_reader_vtable;  	state->stream.avail_in = 0; @@ -562,7 +557,7 @@  	/* Get dictionary size. */ 	log2dic = h[5] & 0x1f;-	if (log2dic < 12 || log2dic > 27)+	if (log2dic < 12 || log2dic > 29) 		return (ARCHIVE_FATAL); 	dicsize = 1U << log2dic; 	if (log2dic > 12)@@ -617,9 +612,11 @@ 	/* Check the crc32 value of the uncompressed data of the current 	 * member */ 	if (state->crc32 != archive_le32dec(f)) {+#ifndef DONT_FAIL_ON_CRC_ERROR 		archive_set_error(&self->archive->archive, ARCHIVE_ERRNO_MISC, 		    "Lzip: CRC32 error"); 		return (ARCHIVE_FAILED);+#endif 	}  	/* Check the uncompressed size of the current member */
c/archive_read_support_filter_zstd.c view
@@ -79,24 +79,21 @@ 		    struct archive_read_filter *); static int	zstd_bidder_init(struct archive_read_filter *); +static const struct archive_read_filter_bidder_vtable+zstd_bidder_vtable = {+	.bid = zstd_bidder_bid,+	.init = zstd_bidder_init,+};+ int archive_read_support_filter_zstd(struct archive *_a) { 	struct archive_read *a = (struct archive_read *)_a;-	struct archive_read_filter_bidder *bidder; -	archive_check_magic(_a, ARCHIVE_READ_MAGIC,-	    ARCHIVE_STATE_NEW, "archive_read_support_filter_zstd");--	if (__archive_read_get_bidder(a, &bidder) != ARCHIVE_OK)+	if (__archive_read_register_bidder(a, NULL, "zstd",+				&zstd_bidder_vtable) != ARCHIVE_OK) 		return (ARCHIVE_FATAL); -	bidder->data = NULL;-	bidder->name = "zstd";-	bidder->bid = zstd_bidder_bid;-	bidder->init = zstd_bidder_init;-	bidder->options = NULL;-	bidder->free = NULL; #if HAVE_ZSTD_H && HAVE_LIBZSTD 	return (ARCHIVE_OK); #else@@ -118,9 +115,9 @@ 	unsigned prefix;  	/* Zstd frame magic values */-	const unsigned zstd_magic = 0xFD2FB528U;-	const unsigned zstd_magic_skippable_start = 0x184D2A50U;-	const unsigned zstd_magic_skippable_mask = 0xFFFFFFF0;+	unsigned zstd_magic = 0xFD2FB528U;+	unsigned zstd_magic_skippable_start = 0x184D2A50U;+	unsigned zstd_magic_skippable_mask = 0xFFFFFFF0;  	(void) self; /* UNUSED */ @@ -160,6 +157,12 @@  #else +static const struct archive_read_filter_vtable+zstd_reader_vtable = {+	.read = zstd_filter_read,+	.close = zstd_filter_close,+};+ /*  * Initialize the filter object  */@@ -167,7 +170,7 @@ zstd_bidder_init(struct archive_read_filter *self) { 	struct private_data *state;-	const size_t out_block_size = ZSTD_DStreamOutSize();+	size_t out_block_size = ZSTD_DStreamOutSize(); 	void *out_block; 	ZSTD_DStream *dstream; @@ -192,9 +195,7 @@ 	state->out_block_size = out_block_size; 	state->out_block = out_block; 	state->dstream = dstream;-	self->read = zstd_filter_read;-	self->skip = NULL; /* not supported */-	self->close = zstd_filter_close;+	self->vtable = &zstd_reader_vtable;  	state->eof = 0; 	state->in_frame = 0;@@ -210,6 +211,7 @@ 	ssize_t avail_in; 	ZSTD_outBuffer out; 	ZSTD_inBuffer in;+	size_t ret;  	state = (struct private_data *)self->data; @@ -218,7 +220,7 @@ 	/* Try to fill the output buffer. */ 	while (out.pos < out.size && !state->eof) { 		if (!state->in_frame) {-			const size_t ret = ZSTD_initDStream(state->dstream);+			ret = ZSTD_initDStream(state->dstream); 			if (ZSTD_isError(ret)) { 				archive_set_error(&self->archive->archive, 				    ARCHIVE_ERRNO_MISC,@@ -248,8 +250,7 @@ 		in.pos = 0;  		{-			const size_t ret =-			    ZSTD_decompressStream(state->dstream, &out, &in);+			ret = ZSTD_decompressStream(state->dstream, &out, &in);  			if (ZSTD_isError(ret)) { 				archive_set_error(&self->archive->archive,
c/archive_read_support_format_7zip.c view
@@ -41,6 +41,9 @@ #ifdef HAVE_ZLIB_H #include <zlib.h> #endif+#ifdef HAVE_ZSTD_H+#include <zstd.h>+#endif  #include "archive.h" #include "archive_entry.h"@@ -80,8 +83,11 @@ #define _7Z_IA64	0x03030401 #define _7Z_ARM		0x03030501 #define _7Z_ARMTHUMB	0x03030701+#define _7Z_ARM64	0xa #define _7Z_SPARC	0x03030805 +#define _7Z_ZSTD	0x4F71101 /* Copied from https://github.com/mcmilk/7-Zip-zstd.git */+ /*  * 7-Zip header property IDs.  */@@ -278,6 +284,11 @@ 	z_stream		 stream; 	int			 stream_valid; #endif+	/* Decoding Zstandard data. */+#if HAVE_ZSTD_H+	ZSTD_DStream		 *zstd_dstream;+	int		         zstdstream_valid;+#endif 	/* Decoding PPMd data. */ 	int			 ppmd7_stat; 	CPpmd7			 ppmd7_context;@@ -287,6 +298,7 @@ 		const unsigned char	*next_in; 		int64_t			 avail_in; 		int64_t			 total_in;+		int64_t			 stream_in; 		unsigned char		*next_out; 		int64_t			 avail_out; 		int64_t			 total_out;@@ -396,6 +408,9 @@ 		    int); static void	x86_Init(struct _7zip *); static size_t	x86_Convert(struct _7zip *, uint8_t *, size_t);+static void	arm_Init(struct _7zip *);+static size_t	arm_Convert(struct _7zip *, uint8_t *, size_t);+static size_t	arm64_Convert(struct _7zip *, uint8_t *, size_t); static ssize_t		Bcj2_Decode(struct _7zip *, uint8_t *, size_t);  @@ -775,7 +790,7 @@ 	}  	/* Set up a more descriptive format name. */-	sprintf(zip->format_name, "7-Zip");+	snprintf(zip->format_name, sizeof(zip->format_name), "7-Zip"); 	a->archive.archive_format_name = zip->format_name;  	return (ret);@@ -986,15 +1001,30 @@ 	struct _7zip *zip = (struct _7zip *)(a->format->data); 	Byte b; -	if (zip->ppstream.avail_in == 0) {-		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,-		    "Truncated RAR file data");-		zip->ppstream.overconsumed = 1;-		return (0);+	if (zip->ppstream.avail_in <= 0) {+		/*+		 * Ppmd7_DecodeSymbol might require reading multiple bytes+		 * and we are on boundary;+		 * last resort to read using __archive_read_ahead.+		 */+		ssize_t bytes_avail = 0;+		const uint8_t* data = __archive_read_ahead(a,+		    zip->ppstream.stream_in+1, &bytes_avail);+		if(bytes_avail < zip->ppstream.stream_in+1) {+			archive_set_error(&a->archive,+			    ARCHIVE_ERRNO_FILE_FORMAT,+			    "Truncated 7z file data");+			zip->ppstream.overconsumed = 1;+			return (0);+		}+		zip->ppstream.next_in++;+		b = data[zip->ppstream.stream_in];+	} else {+		b = *zip->ppstream.next_in++; 	}-	b = *zip->ppstream.next_in++; 	zip->ppstream.avail_in--; 	zip->ppstream.total_in++;+	zip->ppstream.stream_in++; 	return (b); } @@ -1011,10 +1041,13 @@ 	case _7Z_COPY: 	case _7Z_BZ2: 	case _7Z_DEFLATE:+	case _7Z_ZSTD: 	case _7Z_PPMD: 		if (coder2 != NULL) { 			if (coder2->codec != _7Z_X86 &&-			    coder2->codec != _7Z_X86_BCJ2) {+			    coder2->codec != _7Z_X86_BCJ2 &&+			    coder2->codec != _7Z_ARM &&+			    coder2->codec != _7Z_ARM64) { 				archive_set_error(&a->archive, 				    ARCHIVE_ERRNO_MISC, 				    "Unsupported filter %lx for %lx",@@ -1025,6 +1058,8 @@ 			zip->bcj_state = 0; 			if (coder2->codec == _7Z_X86) 				x86_Init(zip);+			else if (coder2->codec == _7Z_ARM)+				arm_Init(zip); 		} 		break; 	default:@@ -1121,6 +1156,12 @@ 				filters[fi].id = LZMA_FILTER_ARMTHUMB; 				fi++; 				break;+#ifdef LZMA_FILTER_ARM64+			case _7Z_ARM64:+				filters[fi].id = LZMA_FILTER_ARM64;+				fi++;+				break;+#endif 			case _7Z_SPARC: 				filters[fi].id = LZMA_FILTER_SPARC; 				fi++;@@ -1206,6 +1247,22 @@ 		    "BZ2 codec is unsupported"); 		return (ARCHIVE_FAILED); #endif+	case _7Z_ZSTD:+	{+#if defined(HAVE_ZSTD_H)+		if (zip->zstdstream_valid) {+			ZSTD_freeDStream(zip->zstd_dstream);+			zip->zstdstream_valid = 0;+		}+		zip->zstd_dstream = ZSTD_createDStream();+		zip->zstdstream_valid = 1;+		break;+#else+		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,+			"ZSTD codec is unsupported");+		return (ARCHIVE_FAILED);+#endif+	} 	case _7Z_DEFLATE: #ifdef HAVE_ZLIB_H 		if (zip->stream_valid)@@ -1420,9 +1477,9 @@ #if defined(HAVE_BZLIB_H) && defined(BZ_CONFIG_ERROR) 	case _7Z_BZ2: 		zip->bzstream.next_in = (char *)(uintptr_t)t_next_in;-		zip->bzstream.avail_in = t_avail_in;+		zip->bzstream.avail_in = (uint32_t)t_avail_in; 		zip->bzstream.next_out = (char *)(uintptr_t)t_next_out;-		zip->bzstream.avail_out = t_avail_out;+		zip->bzstream.avail_out = (uint32_t)t_avail_out; 		r = BZ2_bzDecompress(&(zip->bzstream)); 		switch (r) { 		case BZ_STREAM_END: /* Found end of stream. */@@ -1472,6 +1529,22 @@ 		t_avail_out = zip->stream.avail_out; 		break; #endif+#ifdef HAVE_ZSTD_H+	case _7Z_ZSTD:+	{+		ZSTD_inBuffer input = { t_next_in, t_avail_in, 0 }; // src, size, pos+		ZSTD_outBuffer output = { t_next_out, t_avail_out, 0 }; // dst, size, pos++		size_t const zret = ZSTD_decompressStream(zip->zstd_dstream, &output, &input);+		if (ZSTD_isError(zret)) {+			archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "Zstd decompression failed: %s", ZSTD_getErrorName(zret));+			return ARCHIVE_FAILED;+		}+		t_avail_in -= input.pos;+		t_avail_out -= output.pos;+		break;+	}+#endif 	case _7Z_PPMD: 	{ 		uint64_t flush_bytes;@@ -1485,6 +1558,7 @@ 		} 		zip->ppstream.next_in = t_next_in; 		zip->ppstream.avail_in = t_avail_in;+		zip->ppstream.stream_in = 0; 		zip->ppstream.next_out = t_next_out; 		zip->ppstream.avail_out = t_avail_out; 		if (zip->ppmd7_stat == 0) {@@ -1555,16 +1629,23 @@ 	/* 	 * Decord BCJ. 	 */-	if (zip->codec != _7Z_LZMA2 && zip->codec2 == _7Z_X86) {-		size_t l = x86_Convert(zip, buff, *outbytes);-		zip->odd_bcj_size = *outbytes - l;-		if (zip->odd_bcj_size > 0 && zip->odd_bcj_size <= 4 &&-		    o_avail_in && ret != ARCHIVE_EOF) {-			memcpy(zip->odd_bcj, ((unsigned char *)buff) + l,-			    zip->odd_bcj_size);-			*outbytes = l;-		} else-			zip->odd_bcj_size = 0;+	if (zip->codec != _7Z_LZMA2) {+		if (zip->codec2 == _7Z_X86) {+			size_t l = x86_Convert(zip, buff, *outbytes);++			zip->odd_bcj_size = *outbytes - l;+			if (zip->odd_bcj_size > 0 && zip->odd_bcj_size <= 4 &&+		    	o_avail_in && ret != ARCHIVE_EOF) {+				memcpy(zip->odd_bcj, ((unsigned char *)buff) + l,+			    	zip->odd_bcj_size);+				*outbytes = l;+			} else+				zip->odd_bcj_size = 0;+		} else if (zip->codec2 == _7Z_ARM) {+			*outbytes = arm_Convert(zip, buff, *outbytes);+		} else if (zip->codec2 == _7Z_ARM64) {+			*outbytes = arm64_Convert(zip, buff, *outbytes);+		} 	}  	/*@@ -2840,8 +2921,10 @@ 	/* CRC check. */ 	if (crc32(0, (const unsigned char *)p + 12, 20) 	    != archive_le32dec(p + 8)) {+#ifdef DONT_FAIL_ON_CRC_ERROR 		archive_set_error(&a->archive, -1, "Header CRC error"); 		return (ARCHIVE_FATAL);+#endif 	}  	next_header_offset = archive_le64dec(p + 12);@@ -2891,8 +2974,10 @@ 		/* Check the EncodedHeader CRC.*/ 		if (r == 0 && zip->header_crc32 != next_header_crc) { 			archive_set_error(&a->archive, -1,+#ifndef DONT_FAIL_ON_CRC_ERROR 			    "Damaged 7-Zip archive"); 			r = -1;+#endif 		} 		if (r == 0) { 			if (zip->si.ci.folders[0].digest_defined)@@ -2943,9 +3028,11 @@  		/* Check the Header CRC.*/ 		if (check_header_crc && zip->header_crc32 != next_header_crc) {+#ifndef DONT_FAIL_ON_CRC_ERROR 			archive_set_error(&a->archive, -1, 			    "Malformed 7-Zip archive"); 			return (ARCHIVE_FATAL);+#endif 		} 		break; 	default:@@ -3702,6 +3789,116 @@ 	zip->bcj_prevMask = prevMask; 	zip->bcj_ip += (uint32_t)bufferPos; 	return (bufferPos);+}++static void+arm_Init(struct _7zip *zip)+{+	zip->bcj_ip = 8;+}++static size_t+arm_Convert(struct _7zip *zip, uint8_t *buf, size_t size)+{+	// This function was adapted from+	// static size_t bcj_arm(struct xz_dec_bcj *s, uint8_t *buf, size_t size)+	// in https://git.tukaani.org/xz-embedded.git++	/*+	 * Branch/Call/Jump (BCJ) filter decoders+	 *+	 * Authors: Lasse Collin <lasse.collin@tukaani.org>+	 *          Igor Pavlov <https://7-zip.org/>+	 *+	 * This file has been put into the public domain.+	 * You can do whatever you want with this file.+	 */++	size_t i;+	uint32_t addr;++	for (i = 0; i + 4 <= size; i += 4) {+		if (buf[i + 3] == 0xEB) {+			// Calculate the transformed addr.+			addr = (uint32_t)buf[i] | ((uint32_t)buf[i + 1] << 8)+				| ((uint32_t)buf[i + 2] << 16);+			addr <<= 2;+			addr -= zip->bcj_ip + (uint32_t)i;+			addr >>= 2;++			// Store the transformed addr in buf.+			buf[i] = (uint8_t)addr;+			buf[i + 1] = (uint8_t)(addr >> 8);+			buf[i + 2] = (uint8_t)(addr >> 16);+		}+	}++	zip->bcj_ip += (uint32_t)i;++	return i;+}++static size_t+arm64_Convert(struct _7zip *zip, uint8_t *buf, size_t size)+{+	// This function was adapted from+	// static size_t bcj_arm64(struct xz_dec_bcj *s, uint8_t *buf, size_t size)+	// in https://git.tukaani.org/xz-embedded.git++	/*+	 * Branch/Call/Jump (BCJ) filter decoders+	 *+	 * Authors: Lasse Collin <lasse.collin@tukaani.org>+	 *          Igor Pavlov <https://7-zip.org/>+	 *+	 * This file has been put into the public domain.+	 * You can do whatever you want with this file.+	 */++	size_t i;+	uint32_t instr;+	uint32_t addr;++	for (i = 0; i + 4 <= size; i += 4) {+		instr = (uint32_t)buf[i]+			| ((uint32_t)buf[i+1] << 8)+			| ((uint32_t)buf[i+2] << 16)+			| ((uint32_t)buf[i+3] << 24);++		if ((instr >> 26) == 0x25) {+			/* BL instruction */+			addr = instr - ((zip->bcj_ip + (uint32_t)i) >> 2);+			instr = 0x94000000 | (addr & 0x03FFFFFF);++			buf[i]   = (uint8_t)instr;+			buf[i+1] = (uint8_t)(instr >> 8);+			buf[i+2] = (uint8_t)(instr >> 16);+			buf[i+3] = (uint8_t)(instr >> 24);+		} else if ((instr & 0x9F000000) == 0x90000000) {+			/* ADRP instruction */+			addr = ((instr >> 29) & 3) | ((instr >> 3) & 0x1FFFFC);++			/* Only convert values in the range +/-512 MiB. */+			if ((addr + 0x020000) & 0x1C0000)+				continue;++			addr -= (zip->bcj_ip + (uint32_t)i) >> 12;++			instr &= 0x9000001F;+			instr |= (addr & 3) << 29;+			instr |= (addr & 0x03FFFC) << 3;+			instr |= (0U - (addr & 0x020000)) & 0xE00000;++			buf[i]   = (uint8_t)instr;+			buf[i+1] = (uint8_t)(instr >> 8);+			buf[i+2] = (uint8_t)(instr >> 16);+			buf[i+3] = (uint8_t)(instr >> 24);+		}+	}++	zip->bcj_ip += (uint32_t)i;++	return i; }  /*
c/archive_read_support_format_cab.c view
@@ -996,7 +996,7 @@ 		cab->end_of_entry_cleanup = cab->end_of_entry = 1;  	/* Set up a more descriptive format name. */-	sprintf(cab->format_name, "CAB %d.%d (%s)",+	snprintf(cab->format_name, sizeof(cab->format_name), "CAB %d.%d (%s)", 	    hd->major, hd->minor, cab->entry_cffolder->compname); 	a->archive.archive_format_name = cab->format_name; @@ -1134,7 +1134,7 @@ 	} 	if (sumbytes) { 		int odd = sumbytes & 3;-		if (sumbytes - odd > 0)+		if ((int)(sumbytes - odd) > 0) 			cfdata->sum_calculated = cab_checksum_cfdata_4( 			    p, sumbytes - odd, cfdata->sum_calculated); 		if (odd)@@ -1171,12 +1171,14 @@ 	cfdata->sum_calculated = cab_checksum_cfdata( 	    cfdata->memimage + CFDATA_cbData, l, cfdata->sum_calculated); 	if (cfdata->sum_calculated != cfdata->sum) {+#ifndef DONT_FAIL_ON_CRC_ERROR 		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, 		    "Checksum error CFDATA[%d] %" PRIx32 ":%" PRIx32 " in %d bytes", 		    cab->entry_cffolder->cfdata_index -1, 		    cfdata->sum, cfdata->sum_calculated, 		    cfdata->compressed_size); 		return (ARCHIVE_FAILED);+#endif 	} 	return (ARCHIVE_OK); }@@ -2292,10 +2294,10 @@ 		 		   (br->cache_buffer << 48) | 				    ((uint64_t)strm->next_in[1]) << 40 | 				    ((uint64_t)strm->next_in[0]) << 32 |-				    ((uint32_t)strm->next_in[3]) << 24 |-				    ((uint32_t)strm->next_in[2]) << 16 |-				    ((uint32_t)strm->next_in[5]) << 8 |-				     (uint32_t)strm->next_in[4];+				    ((uint64_t)strm->next_in[3]) << 24 |+				    ((uint64_t)strm->next_in[2]) << 16 |+				    ((uint64_t)strm->next_in[5]) << 8 |+				     (uint64_t)strm->next_in[4]; 				strm->next_in += 6; 				strm->avail_in -= 6; 				br->cache_avail += 6 * 8;
c/archive_read_support_format_cpio.c view
@@ -441,7 +441,7 @@  	/* Compare name to "TRAILER!!!" to test for end-of-archive. */ 	if (namelength == 11 && strncmp((const char *)h, "TRAILER!!!",-	    11) == 0) {+	    10) == 0) { 		/* TODO: Store file location of start of block. */ 		archive_clear_error(&a->archive); 		return (ARCHIVE_EOF);@@ -985,14 +985,14 @@ static int64_t le4(const unsigned char *p) {-	return ((p[0] << 16) + (((int64_t)p[1]) << 24) + (p[2] << 0) + (p[3] << 8));+	return ((p[0] << 16) | (((int64_t)p[1]) << 24) | (p[2] << 0) | (p[3] << 8)); }   static int64_t be4(const unsigned char *p) {-	return ((((int64_t)p[0]) << 24) + (p[1] << 16) + (p[2] << 8) + (p[3]));+	return ((((int64_t)p[0]) << 24) | (p[1] << 16) | (p[2] << 8) | (p[3])); }  /*
c/archive_read_support_format_iso9660.c view
@@ -1007,7 +1007,8 @@ 		p = b; 		b += iso9660->logical_block_size; 		step -= iso9660->logical_block_size;-		for (; *p != 0 && p < b && p + *p <= b; p += *p) {+		for (; *p != 0 && p + DR_name_offset < b && p + *p <= b;+			p += *p) { 			struct file_info *child;  			/* N.B.: these special directory identifiers@@ -1756,7 +1757,7 @@ 	size_t name_len; 	const unsigned char *rr_start, *rr_end; 	const unsigned char *p;-	size_t dr_len;+	size_t dr_len = 0; 	uint64_t fsize, offset; 	int32_t location; 	int flags;@@ -1900,7 +1901,7 @@ 	 * NUMBER of RRIP "PX" extension. 	 * Note: Old mkisofs did not record that FILE SERIAL NUMBER 	 * in ISO images.-	 * Note2: xorriso set 0 to the location of a symlink file. +	 * Note2: xorriso set 0 to the location of a symlink file. 	 */ 	if (file->size == 0 && location >= 0) { 		/* If file->size is zero, its location points wrong place,@@ -1954,7 +1955,7 @@ 			 * made by makefs is not zero and its location is 			 * the same as those of next regular file. That is 			 * the same as hard like file and it causes unexpected-			 * error. +			 * error. 			 */ 			if (file->size > 0 && 			    (file->mode & AE_IFMT) == AE_IFLNK) {@@ -2746,7 +2747,7 @@ 			 * If directory entries all which are descendant of 			 * rr_moved are still remaining, expose their. 			 */-			if (iso9660->re_files.first != NULL && +			if (iso9660->re_files.first != NULL && 			    iso9660->rr_moved != NULL && 			    iso9660->rr_moved->rr_moved_has_re_only) 				/* Expose "rr_moved" entry. */@@ -3179,11 +3180,11 @@ static time_t time_from_tm(struct tm *t) {-#if HAVE_TIMEGM+#if HAVE__MKGMTIME+        return _mkgmtime(t);+#elif HAVE_TIMEGM         /* Use platform timegm() if available. */         return (timegm(t));-#elif HAVE__MKGMTIME64-        return (_mkgmtime64(t)); #else         /* Else use direct calculation using POSIX assumptions. */         /* First, fix up tm_yday based on the year/month/day. */
c/archive_read_support_format_lha.c view
@@ -739,7 +739,7 @@ 	if (lha->directory || lha->compsize == 0) 		lha->end_of_entry = 1; -	sprintf(lha->format_name, "lha -%c%c%c-",+	snprintf(lha->format_name, sizeof(lha->format_name), "lha -%c%c%c-", 	    lha->method[0], lha->method[1], lha->method[2]); 	a->archive.archive_format_name = lha->format_name; @@ -1039,9 +1039,11 @@ 	}  	if (header_crc != lha->header_crc) {+#ifndef DONT_FAIL_ON_CRC_ERROR 		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, 		    "LHa header CRC error"); 		return (ARCHIVE_FATAL);+#endif 	} 	return (err); }@@ -1107,9 +1109,11 @@ 		return (err);  	if (header_crc != lha->header_crc) {+#ifndef DONT_FAIL_ON_CRC_ERROR 		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, 		    "LHa header CRC error"); 		return (ARCHIVE_FATAL);+#endif 	} 	return (err); invalid:@@ -1814,13 +1818,16 @@ 		/* This if statement expects compiler optimization will 		 * remove the statement which will not be executed. */ #undef bswap16+#ifndef __has_builtin+#define __has_builtin(x) 0+#endif #if defined(_MSC_VER) && _MSC_VER >= 1400  /* Visual Studio */ #  define bswap16(x) _byteswap_ushort(x) #elif defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 8) || __GNUC__ > 4) /* GCC 4.8 and later has __builtin_bswap16() */ #  define bswap16(x) __builtin_bswap16(x)-#elif defined(__clang__)-/* All clang versions have __builtin_bswap16() */+#elif defined(__clang__) && __has_builtin(__builtin_bswap16)+/* Newer clang versions have __builtin_bswap16() */ #  define bswap16(x) __builtin_bswap16(x) #else #  define bswap16(x) ((((x) >> 8) & 0xff) | ((x) << 8))@@ -2005,10 +2012,10 @@ 				    ((uint64_t)strm->next_in[0]) << 48 | 				    ((uint64_t)strm->next_in[1]) << 40 | 				    ((uint64_t)strm->next_in[2]) << 32 |-				    ((uint32_t)strm->next_in[3]) << 24 |-				    ((uint32_t)strm->next_in[4]) << 16 |-				    ((uint32_t)strm->next_in[5]) << 8 |-				     (uint32_t)strm->next_in[6];+				    ((uint64_t)strm->next_in[3]) << 24 |+				    ((uint64_t)strm->next_in[4]) << 16 |+				    ((uint64_t)strm->next_in[5]) << 8 |+				     (uint64_t)strm->next_in[6]; 				strm->next_in += 7; 				strm->avail_in -= 7; 				br->cache_avail += 7 * 8;@@ -2018,10 +2025,10 @@ 		 		   (br->cache_buffer << 48) | 				    ((uint64_t)strm->next_in[0]) << 40 | 				    ((uint64_t)strm->next_in[1]) << 32 |-				    ((uint32_t)strm->next_in[2]) << 24 |-				    ((uint32_t)strm->next_in[3]) << 16 |-				    ((uint32_t)strm->next_in[4]) << 8 |-				     (uint32_t)strm->next_in[5];+				    ((uint64_t)strm->next_in[2]) << 24 |+				    ((uint64_t)strm->next_in[3]) << 16 |+				    ((uint64_t)strm->next_in[4]) << 8 |+				     (uint64_t)strm->next_in[5]; 				strm->next_in += 6; 				strm->avail_in -= 6; 				br->cache_avail += 6 * 8;
c/archive_read_support_format_mtree.c view
@@ -692,7 +692,7 @@ { 	const char *p; 	ssize_t avail, ravail;-	ssize_t detected_bytes = 0, len, nl;+	ssize_t len, nl; 	int entry_cnt = 0, multiline = 0; 	int form_D = 0;/* The archive is generated by `NetBSD mtree -D' 			* (In this source we call it `form D') . */@@ -728,8 +728,6 @@ 			 * character of previous line was '\' character. */ 			if (bid_keyword_list(p, len, 0, 0) <= 0) 				break;-			if (multiline == 1)-				detected_bytes += len; 			if (p[len-nl-1] != '\\') { 				if (multiline == 1 && 				    ++entry_cnt >= MAX_BID_ENTRY)@@ -745,7 +743,6 @@  			keywords = bid_entry(p, len, nl, &last_is_path); 			if (keywords >= 0) {-				detected_bytes += len; 				if (form_D == 0) { 					if (last_is_path) 						form_D = 1;@@ -997,9 +994,11 @@ 			struct mtree_entry *alt; 			alt = (struct mtree_entry *)__archive_rb_tree_find_node( 			    &mtree->rbtree, entry->name);-			while (alt->next_dup)-				alt = alt->next_dup;-			alt->next_dup = entry;+			if (alt != NULL) {+				while (alt->next_dup)+					alt = alt->next_dup;+				alt->next_dup = entry;+			} 		} 	} @@ -1074,7 +1073,7 @@ 			continue; 		/* Non-printable characters are not allowed */ 		for (s = p;s < p + len - 1; s++) {-			if (!isprint((unsigned char)*s)) {+			if (!isprint((unsigned char)*s) && *s != '\t') { 				r = ARCHIVE_FATAL; 				break; 			}@@ -1253,9 +1252,17 @@ 				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 == -1 &&-				(errno != ENOENT ||-				 archive_strlen(&mtree->contents_name) > 0)) {+			if (mtree->fd == -1 && (+#if defined(_WIN32) && !defined(__CYGWIN__)+        /*+         * On Windows, attempting to open a file with an+         * invalid name result in EINVAL (Error 22)+         */+				(errno != ENOENT && errno != EINVAL)+#else+				errno != ENOENT+#endif+        || archive_strlen(&mtree->contents_name) > 0)) { 				archive_set_error(&a->archive, errno, 						"Can't open %s", path); 				r = ARCHIVE_WARN;@@ -1273,7 +1280,13 @@ 				mtree->fd = -1; 				st = NULL; 			}-		} else if (lstat(path, st) == -1) {+		}+#ifdef HAVE_LSTAT+		else if (lstat(path, st) == -1)+#else+		else if (la_stat(path, st) == -1)+#endif+		{ 			st = NULL; 		} @@ -1629,11 +1642,11 @@ 		    || strcmp(key, "contents") == 0) { 			parse_escapes(val, NULL); 			archive_strcpy(&mtree->contents_name, val);-			break;+			return (ARCHIVE_OK); 		} 		if (strcmp(key, "cksum") == 0)-			break;-		__LA_FALLTHROUGH;+			return (ARCHIVE_OK);+		break; 	case 'd': 		if (strcmp(key, "device") == 0) { 			/* stat(2) st_rdev field, e.g. the major/minor IDs@@ -1647,65 +1660,64 @@ 				archive_entry_set_rdev(entry, dev); 			return r; 		}-		__LA_FALLTHROUGH;+		break; 	case 'f': 		if (strcmp(key, "flags") == 0) { 			*parsed_kws |= MTREE_HAS_FFLAGS; 			archive_entry_copy_fflags_text(entry, val);-			break;+			return (ARCHIVE_OK); 		}-		__LA_FALLTHROUGH;+		break; 	case 'g': 		if (strcmp(key, "gid") == 0) { 			*parsed_kws |= MTREE_HAS_GID; 			archive_entry_set_gid(entry, mtree_atol(&val, 10));-			break;+			return (ARCHIVE_OK); 		} 		if (strcmp(key, "gname") == 0) { 			*parsed_kws |= MTREE_HAS_GNAME; 			archive_entry_copy_gname(entry, val);-			break;+			return (ARCHIVE_OK); 		}-		__LA_FALLTHROUGH;+		break; 	case 'i': 		if (strcmp(key, "inode") == 0) { 			archive_entry_set_ino(entry, mtree_atol(&val, 10));-			break;+			return (ARCHIVE_OK); 		}-		__LA_FALLTHROUGH;+		break; 	case 'l': 		if (strcmp(key, "link") == 0) {+			parse_escapes(val, NULL); 			archive_entry_copy_symlink(entry, val);-			break;+			return (ARCHIVE_OK); 		}-		__LA_FALLTHROUGH;+		break; 	case 'm': 		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;-				archive_entry_set_perm(entry,-				    (mode_t)mtree_atol(&val, 8));-			} else {+			if (val[0] < '0' || val[0] > '7') { 				archive_set_error(&a->archive, 				    ARCHIVE_ERRNO_FILE_FORMAT, 				    "Symbolic or non-octal mode \"%s\" unsupported", val);-				return ARCHIVE_WARN;+				return (ARCHIVE_WARN); 			}-			break;+			*parsed_kws |= MTREE_HAS_PERM;+			archive_entry_set_perm(entry, (mode_t)mtree_atol(&val, 8));+			return (ARCHIVE_OK); 		}-		__LA_FALLTHROUGH;+		break; 	case 'n': 		if (strcmp(key, "nlink") == 0) { 			*parsed_kws |= MTREE_HAS_NLINK; 			archive_entry_set_nlink(entry, 				(unsigned int)mtree_atol(&val, 10));-			break;+			return (ARCHIVE_OK); 		}-		__LA_FALLTHROUGH;+		break; 	case 'r': 		if (strcmp(key, "resdevice") == 0) { 			/* stat(2) st_dev field, e.g. the device ID where the@@ -1723,7 +1735,7 @@ 			return parse_digest(a, entry, val, 			    ARCHIVE_ENTRY_DIGEST_RMD160); 		}-		__LA_FALLTHROUGH;+		break; 	case 's': 		if (strcmp(key, "sha1") == 0 || 		    strcmp(key, "sha1digest") == 0) {@@ -1747,9 +1759,9 @@ 		} 		if (strcmp(key, "size") == 0) { 			archive_entry_set_size(entry, mtree_atol(&val, 10));-			break;+			return (ARCHIVE_OK); 		}-		__LA_FALLTHROUGH;+		break; 	case 't': 		if (strcmp(key, "tags") == 0) { 			/*@@ -1757,7 +1769,7 @@ 			 * Ignore the tags for now, but the interface 			 * should be extended to allow inclusion/exclusion. 			 */-			break;+			return (ARCHIVE_OK); 		} 		if (strcmp(key, "time") == 0) { 			int64_t m;@@ -1783,79 +1795,85 @@ 			else if (m < my_time_t_min) 				m = my_time_t_min; 			archive_entry_set_mtime(entry, (time_t)m, ns);-			break;+			return (ARCHIVE_OK); 		} 		if (strcmp(key, "type") == 0) { 			switch (val[0]) { 			case 'b': 				if (strcmp(val, "block") == 0) {-					archive_entry_set_filetype(entry, AE_IFBLK);-					break;+					*parsed_kws |= MTREE_HAS_TYPE;+					archive_entry_set_filetype(entry,+						AE_IFBLK);+					return (ARCHIVE_OK); 				}-				__LA_FALLTHROUGH;+				break; 			case 'c': 				if (strcmp(val, "char") == 0) {+					*parsed_kws |= MTREE_HAS_TYPE; 					archive_entry_set_filetype(entry, 						AE_IFCHR);-					break;+					return (ARCHIVE_OK); 				}-				__LA_FALLTHROUGH;+				break; 			case 'd': 				if (strcmp(val, "dir") == 0) {+					*parsed_kws |= MTREE_HAS_TYPE; 					archive_entry_set_filetype(entry, 						AE_IFDIR);-					break;+					return (ARCHIVE_OK); 				}-				__LA_FALLTHROUGH;+				break; 			case 'f': 				if (strcmp(val, "fifo") == 0) {+					*parsed_kws |= MTREE_HAS_TYPE; 					archive_entry_set_filetype(entry, 						AE_IFIFO);-					break;+					return (ARCHIVE_OK); 				} 				if (strcmp(val, "file") == 0) {+					*parsed_kws |= MTREE_HAS_TYPE; 					archive_entry_set_filetype(entry, 						AE_IFREG);-					break;+					return (ARCHIVE_OK); 				}-				__LA_FALLTHROUGH;+				break; 			case 'l': 				if (strcmp(val, "link") == 0) {+					*parsed_kws |= MTREE_HAS_TYPE; 					archive_entry_set_filetype(entry, 						AE_IFLNK);-					break;+					return (ARCHIVE_OK); 				}-				__LA_FALLTHROUGH;+				break; 			default:-				archive_set_error(&a->archive,-				    ARCHIVE_ERRNO_FILE_FORMAT,-				    "Unrecognized file type \"%s\"; "-				    "assuming \"file\"", val);-				archive_entry_set_filetype(entry, AE_IFREG);-				return (ARCHIVE_WARN);+				break; 			}-			*parsed_kws |= MTREE_HAS_TYPE;-			break;+			archive_set_error(&a->archive,+			    ARCHIVE_ERRNO_FILE_FORMAT,+			    "Unrecognized file type \"%s\"; "+			    "assuming \"file\"", val);+			archive_entry_set_filetype(entry, AE_IFREG);+			return (ARCHIVE_WARN); 		}-		__LA_FALLTHROUGH;+		break; 	case 'u': 		if (strcmp(key, "uid") == 0) { 			*parsed_kws |= MTREE_HAS_UID; 			archive_entry_set_uid(entry, mtree_atol(&val, 10));-			break;+			return (ARCHIVE_OK); 		} 		if (strcmp(key, "uname") == 0) { 			*parsed_kws |= MTREE_HAS_UNAME; 			archive_entry_copy_uname(entry, val);-			break;+			return (ARCHIVE_OK); 		}-		__LA_FALLTHROUGH;+		break; 	default:-		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,-		    "Unrecognized key %s=%s", key, val);-		return (ARCHIVE_WARN);+		break; 	}-	return (ARCHIVE_OK);+	archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,+	    "Unrecognized key %s=%s", key, val);+	return (ARCHIVE_WARN); }  static int
c/archive_read_support_format_rar.c view
@@ -135,6 +135,16 @@ #define MAX_SYMBOL_LENGTH 0xF #define MAX_SYMBOLS       20 +/* Virtual Machine Properties */+#define VM_MEMORY_SIZE 0x40000+#define VM_MEMORY_MASK (VM_MEMORY_SIZE - 1)+#define PROGRAM_WORK_SIZE 0x3C000+#define PROGRAM_GLOBAL_SIZE 0x2000+#define PROGRAM_SYSTEM_GLOBAL_ADDRESS PROGRAM_WORK_SIZE+#define PROGRAM_SYSTEM_GLOBAL_SIZE 0x40+#define PROGRAM_USER_GLOBAL_ADDRESS (PROGRAM_SYSTEM_GLOBAL_ADDRESS + PROGRAM_SYSTEM_GLOBAL_SIZE)+#define PROGRAM_USER_GLOBAL_SIZE (PROGRAM_GLOBAL_SIZE - PROGRAM_SYSTEM_GLOBAL_SIZE)+ /*  * Considering L1,L2 cache miss and a calling of write system-call,  * the best size of the output buffer(uncompressed buffer) is 128K.@@ -213,6 +223,69 @@   int64_t end_offset; }; +struct rar_program_code+{+  uint8_t *staticdata;+  uint32_t staticdatalen;+  uint8_t *globalbackup;+  uint32_t globalbackuplen;+  uint64_t fingerprint;+  uint32_t usagecount;+  uint32_t oldfilterlength;+  struct rar_program_code *next;+};++struct rar_filter+{+  struct rar_program_code *prog;+  uint32_t initialregisters[8];+  uint8_t *globaldata;+  uint32_t globaldatalen;+  size_t blockstartpos;+  uint32_t blocklength;+  uint32_t filteredblockaddress;+  uint32_t filteredblocklength;+  struct rar_filter *next;+};++struct memory_bit_reader+{+  const uint8_t *bytes;+  size_t length;+  size_t offset;+  uint64_t bits;+  int available;+  int at_eof;+};++struct rar_virtual_machine+{+  uint32_t registers[8];+  uint8_t memory[VM_MEMORY_SIZE + sizeof(uint32_t)];+};++struct rar_filters+{+  struct rar_virtual_machine *vm;+  struct rar_program_code *progs;+  struct rar_filter *stack;+  int64_t filterstart;+  uint32_t lastfilternum;+  int64_t lastend;+  uint8_t *bytes;+  size_t bytes_ready;+};++struct audio_state+{+  int8_t weight[5];+  int16_t delta[4];+  int8_t lastdelta;+  int error[11];+  int count;+  uint8_t lastbyte;+};+ struct rar {   /* Entries from main RAR header */@@ -273,15 +346,16 @@   struct huffman_code lengthcode;   unsigned char lengthtable[HUFFMAN_TABLE_SIZE];   struct lzss lzss;-  char output_last_match;   unsigned int lastlength;   unsigned int lastoffset;   unsigned int oldoffset[4];   unsigned int lastlowoffset;   unsigned int numlowoffsetrepeats;-  int64_t filterstart;   char start_new_table; +  /* Filters */+  struct rar_filters filters;+   /* PPMd Variant H members */   char ppmd_valid;   char ppmd_eod;@@ -343,23 +417,43 @@ 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 *, size_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 *); static int read_next_symbol(struct archive_read *, struct huffman_code *); static int create_code(struct archive_read *, struct huffman_code *,-                        unsigned char *, int, char);+                       unsigned char *, int, char); static int add_value(struct archive_read *, struct huffman_code *, int, int,                      int); static int new_node(struct huffman_code *); static int make_table(struct archive_read *, struct huffman_code *); static int make_table_recurse(struct archive_read *, struct huffman_code *, int,                               struct huffman_table_entry *, int, int);-static int64_t expand(struct archive_read *, int64_t);-static int copy_from_lzss_window(struct archive_read *, const void **,-                                   int64_t, int);+static int expand(struct archive_read *, int64_t *);+static int copy_from_lzss_window_to_unp(struct archive_read *, const void **,+                                        int64_t, int); static const void *rar_read_ahead(struct archive_read *, size_t, ssize_t *);+static int parse_filter(struct archive_read *, const uint8_t *, uint16_t,+                        uint8_t);+static int run_filters(struct archive_read *);+static void clear_filters(struct rar_filters *);+static struct rar_filter *create_filter(struct rar_program_code *,+                                        const uint8_t *, uint32_t,+                                        uint32_t[8], size_t, uint32_t);+static void delete_filter(struct rar_filter *filter);+static struct rar_program_code *compile_program(const uint8_t *, size_t);+static void delete_program_code(struct rar_program_code *prog);+static uint32_t membr_next_rarvm_number(struct memory_bit_reader *br);+static inline uint32_t membr_bits(struct memory_bit_reader *br, int bits);+static int membr_fill(struct memory_bit_reader *br, int bits);+static int read_filter(struct archive_read *, int64_t *);+static int rar_decode_byte(struct archive_read*, uint8_t *);+static int execute_filter(struct archive_read*, struct rar_filter *,+                          struct rar_virtual_machine *, size_t);+static int copy_from_lzss_window(struct archive_read *, void *, int64_t, int);+static inline void vm_write_32(struct rar_virtual_machine*, size_t, uint32_t);+static inline uint32_t vm_read_32(struct rar_virtual_machine*, size_t);  /*  * Bit stream reader.@@ -913,9 +1007,11 @@        crc32_val = crc32(0, (const unsigned char *)p + 2, (unsigned)skip - 2);       if ((crc32_val & 0xffff) != archive_le16dec(p)) {+#ifndef DONT_FAIL_ON_CRC_ERROR         archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,           "Header CRC error");         return (ARCHIVE_FATAL);+#endif       }       __archive_read_consume(a, skip);       break;@@ -966,14 +1062,16 @@ 		      return (ARCHIVE_FATAL); 	      } 	      p = h;-	      crc32_val = crc32(crc32_val, (const unsigned char *)p, to_read);+	      crc32_val = crc32(crc32_val, (const unsigned char *)p, (unsigned int)to_read); 	      __archive_read_consume(a, to_read); 	      skip -= to_read;       }       if ((crc32_val & 0xffff) != crc32_expected) {+#ifndef DONT_FAIL_ON_CRC_ERROR 	      archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, 		  "Header CRC error"); 	      return (ARCHIVE_FATAL);+#endif       }       if (head_type == ENDARC_HEAD) 	      return (ARCHIVE_EOF);@@ -1244,6 +1342,7 @@    rar = (struct rar *)(a->format->data);   free_codes(a);+  clear_filters(&rar->filters);   free(rar->filename);   free(rar->filename_save);   free(rar->dbo);@@ -1337,9 +1436,11 @@   /* File Header CRC check. */   crc32_val = crc32(crc32_val, h, (unsigned)(header_size - 7));   if ((crc32_val & 0xffff) != archive_le16dec(rar_header.crc)) {+#ifndef DONT_FAIL_ON_CRC_ERROR     archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,       "Header CRC error");     return (ARCHIVE_FATAL);+#endif   }   /* If no CRC error, Go on parsing File Header. */   p = h;@@ -1662,6 +1763,7 @@   memset(rar->lengthtable, 0, sizeof(rar->lengthtable));   __archive_ppmd7_functions.Ppmd7_Free(&rar->ppmd7_context);   rar->ppmd_valid = rar->ppmd_eod = 0;+  rar->filters.filterstart = INT64_MAX;    /* Don't set any archive entries for non-file header types */   if (head_type == NEWSUB_HEAD)@@ -1728,13 +1830,9 @@   struct tm *tm;   time_t t;   long nsec;-#if defined(HAVE_LOCALTIME_R) || defined(HAVE__LOCALTIME64_S)+#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S)   struct tm tmbuf; #endif-#if defined(HAVE__LOCALTIME64_S)-  errno_t terr;-  __time64_t tmptime;-#endif    if (p + 2 > endp)     return (-1);@@ -1766,15 +1864,10 @@         rem = (((unsigned)(unsigned char)*p) << 16) | (rem >> 8);         p++;       }-#if defined(HAVE_LOCALTIME_R)+#if defined(HAVE_LOCALTIME_S)+      tm = localtime_s(&tmbuf, &t) ? NULL : &tmbuf;+#elif defined(HAVE_LOCALTIME_R)       tm = localtime_r(&t, &tmbuf);-#elif defined(HAVE__LOCALTIME64_S)-      tmptime = t;-      terr = _localtime64_s(&tmbuf, &tmptime);-      if (terr)-        tm = NULL;-      else-        tm = &tmbuf; #else       tm = localtime(&t); #endif@@ -1856,9 +1949,11 @@     *size = 0;     *offset = rar->offset;     if (rar->file_crc != rar->crc_calculated) {+#ifndef DONT_FAIL_ON_CRC_ERROR       archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,                         "File CRC error");       return (ARCHIVE_FATAL);+#endif     }     rar->entry_eof = 1;     return (ARCHIVE_EOF);@@ -1886,13 +1981,13 @@  static int read_data_compressed(struct archive_read *a, const void **buff, size_t *size,-               int64_t *offset, size_t looper)+                     int64_t *offset, size_t looper) {   if (looper++ > MAX_COMPRESS_DEPTH)     return (ARCHIVE_FATAL);    struct rar *rar;-  int64_t start, end, actualend;+  int64_t start, end;   size_t bs;   int ret = (ARCHIVE_OK), sym, code, lzss_offset, length, i; @@ -1901,6 +1996,33 @@   do {     if (!rar->valid)       return (ARCHIVE_FATAL);++    if (rar->filters.bytes_ready > 0)+    {+      /* Flush unp_buffer first */+      if (rar->unp_offset > 0)+      {+        *buff = rar->unp_buffer;+        *size = rar->unp_offset;+        rar->unp_offset = 0;+        *offset = rar->offset_outgoing;+        rar->offset_outgoing += *size;+      }+      else+      {+        *buff = rar->filters.bytes;+        *size = rar->filters.bytes_ready;++        rar->offset += *size;+        *offset = rar->offset_outgoing;+        rar->offset_outgoing += *size;++        rar->filters.bytes_ready -= *size;+        rar->filters.bytes += *size;+      }+      goto ending_block;+    }+     if (rar->ppmd_eod ||        (rar->dictionary_size && rar->offset >= rar->unp_size))     {@@ -1922,9 +2044,11 @@       *size = 0;       *offset = rar->offset;       if (rar->file_crc != rar->crc_calculated) {+#ifndef DONT_FAIL_ON_CRC_ERROR         archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,                           "File CRC error");         return (ARCHIVE_FATAL);+#endif       }       rar->entry_eof = 1;       return (ARCHIVE_EOF);@@ -1936,7 +2060,7 @@         bs = rar->unp_buffer_size - rar->unp_offset;       else         bs = (size_t)rar->bytes_uncopied;-      ret = copy_from_lzss_window(a, buff, rar->offset, (int)bs);+      ret = copy_from_lzss_window_to_unp(a, buff, rar->offset, (int)bs);       if (ret != ARCHIVE_OK)         return (ret);       rar->offset += bs;@@ -1954,6 +2078,13 @@       continue;     } +    if (rar->filters.lastend == rar->filters.filterstart)+    {+      if (!run_filters(a))+        return (ARCHIVE_FATAL);+      continue;+    }+     if (!rar->br.next_in &&       (ret = rar_br_preparation(a, &(rar->br))) < ARCHIVE_WARN)       return (ret);@@ -2045,13 +2176,17 @@     {       start = rar->offset;       end = start + rar->dictionary_size;-      rar->filterstart = INT64_MAX;+      if (rar->filters.filterstart < end) {+        end = rar->filters.filterstart;+      } -      if ((actualend = expand(a, end)) < 0)-        return ((int)actualend);+      ret = expand(a, &end);+      if (ret != ARCHIVE_OK)+	      return (ret); -      rar->bytes_uncopied = actualend - start;-      if (rar->bytes_uncopied == 0) {+      rar->bytes_uncopied = end - start;+      rar->filters.lastend = end;+      if (rar->filters.lastend != rar->filters.filterstart && rar->bytes_uncopied == 0) {           /* Broken RAR files cause this case.           * NOTE: If this case were possible on a normal RAR file           * we would find out where it was actually bad and@@ -2065,7 +2200,7 @@       bs = rar->unp_buffer_size - rar->unp_offset;     else       bs = (size_t)rar->bytes_uncopied;-    ret = copy_from_lzss_window(a, buff, rar->offset, (int)bs);+    ret = copy_from_lzss_window_to_unp(a, buff, rar->offset, (int)bs);     if (ret != ARCHIVE_OK)       return (ret);     rar->offset += bs;@@ -2080,6 +2215,7 @@   *size = rar->unp_buffer_size;   *offset = rar->offset_outgoing;   rar->offset_outgoing += *size;+ending_block:   /* Calculate File CRC. */   rar->crc_calculated = crc32(rar->crc_calculated, *buff, (unsigned)*size);   return ret;@@ -2691,8 +2827,8 @@   return ret; } -static int64_t-expand(struct archive_read *a, int64_t end)+static int+expand(struct archive_read *a, int64_t *end) {   static const unsigned char lengthbases[] =     {   0,   1,   2,   3,   4,   5,   6,@@ -2739,25 +2875,22 @@   struct rar *rar = (struct rar *)(a->format->data);   struct rar_br *br = &(rar->br); -  if (rar->filterstart < end)-    end = rar->filterstart;+  if (rar->filters.filterstart < *end)+    *end = rar->filters.filterstart;    while (1)   {-    if (rar->output_last_match &&-      lzss_position(&rar->lzss) + rar->lastlength <= end)-    {-      lzss_emit_match(rar, rar->lastoffset, rar->lastlength);-      rar->output_last_match = 0;+    if(lzss_position(&rar->lzss) >= *end) {+      return (ARCHIVE_OK);     } -    if(rar->is_ppmd_block || rar->output_last_match ||-      lzss_position(&rar->lzss) >= end)-      return lzss_position(&rar->lzss);+    if(rar->is_ppmd_block) {+      *end = lzss_position(&rar->lzss);+      return (ARCHIVE_OK);+    }      if ((symbol = read_next_symbol(a, &rar->maincode)) < 0)       return (ARCHIVE_FATAL);-    rar->output_last_match = 0;      if (symbol < 256)     {@@ -2778,7 +2911,8 @@           goto truncated_data;         rar->start_new_table = rar_br_bits(br, 1);         rar_br_consume(br, 1);-        return lzss_position(&rar->lzss);+        *end = lzss_position(&rar->lzss);+        return (ARCHIVE_OK);       }       else       {@@ -2789,9 +2923,9 @@     }     else if(symbol==257)     {-      archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,-                        "Parsing filters is unsupported.");-      return (ARCHIVE_FAILED);+      if (!read_filter(a, end))+          return (ARCHIVE_FATAL);+      continue;     }     else if(symbol==258)     {@@ -2864,7 +2998,7 @@               goto truncated_data;             offs += rar_br_bits(br, offsetbits[offssymbol] - 4) << 4;             rar_br_consume(br, offsetbits[offssymbol] - 4);-	  }+          }            if(rar->numlowoffsetrepeats > 0)           {@@ -2908,7 +3042,8 @@      rar->lastoffset = offs;     rar->lastlength = len;-    rar->output_last_match = 1;++    lzss_emit_match(rar, rar->lastoffset, rar->lastlength);   } truncated_data:   archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,@@ -2922,12 +3057,35 @@ }  static int-copy_from_lzss_window(struct archive_read *a, const void **buffer,-                        int64_t startpos, int length)+copy_from_lzss_window(struct archive_read *a, void *buffer,+                      int64_t startpos, int length) {   int windowoffs, firstpart;   struct rar *rar = (struct rar *)(a->format->data); +  windowoffs = lzss_offset_for_position(&rar->lzss, startpos);+  firstpart = lzss_size(&rar->lzss) - windowoffs;+  if (firstpart < 0) {+    archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,+                      "Bad RAR file data");+    return (ARCHIVE_FATAL);+  }+  if (firstpart < length) {+    memcpy(buffer, &rar->lzss.window[windowoffs], firstpart);+    memcpy(buffer, &rar->lzss.window[0], length - firstpart);+  } else {+    memcpy(buffer, &rar->lzss.window[windowoffs], length);+  }+  return (ARCHIVE_OK);+}++static int+copy_from_lzss_window_to_unp(struct archive_read *a, const void **buffer,+                             int64_t startpos, int length)+{+  int windowoffs, firstpart;+  struct rar *rar = (struct rar *)(a->format->data);+   if (!rar->unp_buffer)   {     if ((rar->unp_buffer = malloc(rar->unp_buffer_size)) == NULL)@@ -3002,4 +3160,629 @@     }   }   return h;+}++static int+parse_filter(struct archive_read *a, const uint8_t *bytes, uint16_t length, uint8_t flags)+{+  struct rar *rar = (struct rar *)(a->format->data);+  struct rar_filters *filters = &rar->filters;++  struct memory_bit_reader br = { 0 };+  struct rar_program_code *prog;+  struct rar_filter *filter, **nextfilter;++  uint32_t numprogs, num, blocklength, globaldatalen;+  uint8_t *globaldata;+  size_t blockstartpos;+  uint32_t registers[8] = { 0 };+  uint32_t i;++  br.bytes = bytes;+  br.length = length;++  numprogs = 0;+  for (prog = filters->progs; prog; prog = prog->next)+    numprogs++;++  if ((flags & 0x80))+  {+    num = membr_next_rarvm_number(&br);+    if (num == 0)+    {+      delete_filter(filters->stack);+      filters->stack = NULL;+      delete_program_code(filters->progs);+      filters->progs = NULL;+    }+    else+      num--;+    if (num > numprogs) {+      return 0;+    }+    filters->lastfilternum = num;+  }+  else+    num = filters->lastfilternum;++  prog = filters->progs;+  for (i = 0; i < num; i++)+    prog = prog->next;+  if (prog)+    prog->usagecount++;++  blockstartpos = membr_next_rarvm_number(&br) + (size_t)lzss_position(&rar->lzss);+  if ((flags & 0x40))+    blockstartpos += 258;+  if ((flags & 0x20))+    blocklength = membr_next_rarvm_number(&br);+  else+    blocklength = prog ? prog->oldfilterlength : 0;++  registers[3] = PROGRAM_SYSTEM_GLOBAL_ADDRESS;+  registers[4] = blocklength;+  registers[5] = prog ? prog->usagecount : 0;+  registers[7] = VM_MEMORY_SIZE;++  if ((flags & 0x10))+  {+    uint8_t mask = (uint8_t)membr_bits(&br, 7);+    for (i = 0; i < 7; i++)+      if ((mask & (1 << i)))+        registers[i] = membr_next_rarvm_number(&br);+  }++  if (!prog)+  {+    uint32_t len = membr_next_rarvm_number(&br);+    uint8_t *bytecode;+    struct rar_program_code **next;++    if (len == 0 || len > 0x10000)+      return 0;+    bytecode = malloc(len);+    if (!bytecode)+      return 0;+    for (i = 0; i < len; i++)+      bytecode[i] = (uint8_t)membr_bits(&br, 8);+    prog = compile_program(bytecode, len);+    if (!prog) {+      free(bytecode);+      return 0;+    }+    free(bytecode);+    next = &filters->progs;+    while (*next)+      next = &(*next)->next;+    *next = prog;+  }+  prog->oldfilterlength = blocklength;++  globaldata = NULL;+  globaldatalen = 0;+  if ((flags & 0x08))+  {+    globaldatalen = membr_next_rarvm_number(&br);+    if (globaldatalen > PROGRAM_USER_GLOBAL_SIZE)+      return 0;+    globaldata = malloc(globaldatalen + PROGRAM_SYSTEM_GLOBAL_SIZE);+    if (!globaldata)+      return 0;+    for (i = 0; i < globaldatalen; i++)+      globaldata[i + PROGRAM_SYSTEM_GLOBAL_SIZE] = (uint8_t)membr_bits(&br, 8);+  }++  if (br.at_eof)+  {+      free(globaldata);+      return 0;+  }++  filter = create_filter(prog, globaldata, globaldatalen, registers, blockstartpos, blocklength);+  free(globaldata);+  if (!filter)+    return 0;++  for (i = 0; i < 7; i++)+    archive_le32enc(&filter->globaldata[i * 4], registers[i]);+  archive_le32enc(&filter->globaldata[0x1C], blocklength);+  archive_le32enc(&filter->globaldata[0x20], 0);+  archive_le32enc(&filter->globaldata[0x2C], prog->usagecount);++  nextfilter = &filters->stack;+  while (*nextfilter)+    nextfilter = &(*nextfilter)->next;+  *nextfilter = filter;++  if (!filters->stack->next)+    filters->filterstart = blockstartpos;++  return 1;+}++static struct rar_filter *+create_filter(struct rar_program_code *prog, const uint8_t *globaldata, uint32_t globaldatalen, uint32_t registers[8], size_t startpos, uint32_t length)+{+  struct rar_filter *filter;++  filter = calloc(1, sizeof(*filter));+  if (!filter)+    return NULL;+  filter->prog = prog;+  filter->globaldatalen = globaldatalen > PROGRAM_SYSTEM_GLOBAL_SIZE ? globaldatalen : PROGRAM_SYSTEM_GLOBAL_SIZE;+  filter->globaldata = calloc(1, filter->globaldatalen);+  if (!filter->globaldata)+    return NULL;+  if (globaldata)+    memcpy(filter->globaldata, globaldata, globaldatalen);+  if (registers)+    memcpy(filter->initialregisters, registers, sizeof(filter->initialregisters));+  filter->blockstartpos = startpos;+  filter->blocklength = length;++  return filter;+}++static int+run_filters(struct archive_read *a)+{+  struct rar *rar = (struct rar *)(a->format->data);+  struct rar_filters *filters = &rar->filters;+  struct rar_filter *filter = filters->stack;+  struct rar_filter *f;+  size_t start, end;+  int64_t tend;+  uint32_t lastfilteraddress;+  uint32_t lastfilterlength;+  int ret;++  if (filters == NULL || filter == NULL)+    return (0);++  start = filters->filterstart;+  end = start + filter->blocklength;++  filters->filterstart = INT64_MAX;+  tend = (int64_t)end;+  ret = expand(a, &tend);+  if (ret != ARCHIVE_OK)+    return 0;++  /* Check if filter stack was modified in expand() */+  ret = ARCHIVE_FATAL;+  f = filters->stack;+  while (f)+  {+    if (f == filter)+    {+      ret = ARCHIVE_OK;+      break;+    }+    f = f->next;+  }+  if (ret != ARCHIVE_OK)+    return 0;++  if (tend < 0)+    return 0;+  end = (size_t)tend;+  if (end != start + filter->blocklength)+    return 0;++  if (!filters->vm)+  {+    filters->vm = calloc(1, sizeof(*filters->vm));+    if (!filters->vm)+      return 0;+  }++  ret = copy_from_lzss_window(a, filters->vm->memory, start, filter->blocklength);+  if (ret != ARCHIVE_OK)+    return 0;+  if (!execute_filter(a, filter, filters->vm, rar->offset))+    return 0;++  lastfilteraddress = filter->filteredblockaddress;+  lastfilterlength = filter->filteredblocklength;+  filters->stack = filter->next;+  filter->next = NULL;+  delete_filter(filter);++  while ((filter = filters->stack) != NULL && (int64_t)filter->blockstartpos == filters->filterstart && filter->blocklength == lastfilterlength)+  {+    memmove(&filters->vm->memory[0], &filters->vm->memory[lastfilteraddress], lastfilterlength);+    if (!execute_filter(a, filter, filters->vm, rar->offset))+      return 0;++    lastfilteraddress = filter->filteredblockaddress;+    lastfilterlength = filter->filteredblocklength;+    filters->stack = filter->next;+    filter->next = NULL;+    delete_filter(filter);+  }++  if (filters->stack)+  {+    if (filters->stack->blockstartpos < end)+      return 0;+    filters->filterstart = filters->stack->blockstartpos;+  }++  filters->lastend = end;+  filters->bytes = &filters->vm->memory[lastfilteraddress];+  filters->bytes_ready = lastfilterlength;++  return 1;+}++static struct rar_program_code *+compile_program(const uint8_t *bytes, size_t length)+{+  struct memory_bit_reader br = { 0 };+  struct rar_program_code *prog;+  // uint32_t instrcount = 0;+  uint8_t xor;+  size_t i;++  xor = 0;+  for (i = 1; i < length; i++)+    xor ^= bytes[i];+  if (!length || xor != bytes[0])+    return NULL;++  br.bytes = bytes;+  br.length = length;+  br.offset = 1;++  prog = calloc(1, sizeof(*prog));+  if (!prog)+    return NULL;+  prog->fingerprint = crc32(0, bytes, (unsigned int)length) | ((uint64_t)length << 32);++  if (membr_bits(&br, 1))+  {+    prog->staticdatalen = membr_next_rarvm_number(&br) + 1;+    prog->staticdata = malloc(prog->staticdatalen);+    if (!prog->staticdata)+    {+      delete_program_code(prog);+      return NULL;+    }+    for (i = 0; i < prog->staticdatalen; i++)+      prog->staticdata[i] = (uint8_t)membr_bits(&br, 8);+  }++  return prog;+}++static void+delete_filter(struct rar_filter *filter)+{+  while (filter)+  {+    struct rar_filter *next = filter->next;+    free(filter->globaldata);+    free(filter);+    filter = next;+  }+}++static void+clear_filters(struct rar_filters *filters)+{+  delete_filter(filters->stack);+  delete_program_code(filters->progs);+  free(filters->vm);+}++static void+delete_program_code(struct rar_program_code *prog)+{+  while (prog)+  {+    struct rar_program_code *next = prog->next;+    free(prog->staticdata);+    free(prog->globalbackup);+    free(prog);+    prog = next;+  }+}++static uint32_t+membr_next_rarvm_number(struct memory_bit_reader *br)+{+  uint32_t val;+  switch (membr_bits(br, 2))+  {+    case 0:+      return membr_bits(br, 4);+    case 1:+      val = membr_bits(br, 8);+      if (val >= 16)+        return val;+      return 0xFFFFFF00 | (val << 4) | membr_bits(br, 4);+    case 2:+      return membr_bits(br, 16);+    default:+      return membr_bits(br, 32);+  }+}++static inline uint32_t+membr_bits(struct memory_bit_reader *br, int bits)+{+  if (bits > br->available && (br->at_eof || !membr_fill(br, bits)))+    return 0;+  return (uint32_t)((br->bits >> (br->available -= bits)) & (((uint64_t)1 << bits) - 1));+}++static int+membr_fill(struct memory_bit_reader *br, int bits)+{+  while (br->available < bits && br->offset < br->length)+  {+    br->bits = (br->bits << 8) | br->bytes[br->offset++];+    br->available += 8;+  }+  if (bits > br->available)+  {+    br->at_eof = 1;+    return 0;+  }+  return 1;+}++static int+read_filter(struct archive_read *a, int64_t *end)+{+  struct rar *rar = (struct rar *)(a->format->data);+  uint8_t flags, val, *code;+  uint16_t length, i;++  if (!rar_decode_byte(a, &flags))+    return 0;+  length = (flags & 0x07) + 1;+  if (length == 7)+  {+    if (!rar_decode_byte(a, &val))+      return 0;+    length = val + 7;+  }+  else if (length == 8)+  {+    if (!rar_decode_byte(a, &val))+      return 0;+    length = val << 8;+    if (!rar_decode_byte(a, &val))+      return 0;+    length |= val;+  }++  code = malloc(length);+  if (!code)+    return 0;+  for (i = 0; i < length; i++)+  {+    if (!rar_decode_byte(a, &code[i]))+    {+      free(code);+      return 0;+    }+  }+  if (!parse_filter(a, code, length, flags))+  {+    free(code);+    return 0;+  }+  free(code);++  if (rar->filters.filterstart < *end)+    *end = rar->filters.filterstart;++  return 1;+}++static int+execute_filter_delta(struct rar_filter *filter, struct rar_virtual_machine *vm)+{+  uint32_t length = filter->initialregisters[4];+  uint32_t numchannels = filter->initialregisters[0];+  uint8_t *src, *dst;+  uint32_t i, idx;++  if (length > PROGRAM_WORK_SIZE / 2)+    return 0;++  src = &vm->memory[0];+  dst = &vm->memory[length];+  for (i = 0; i < numchannels; i++)+  {+    uint8_t lastbyte = 0;+    for (idx = i; idx < length; idx += numchannels)+      lastbyte = dst[idx] = lastbyte - *src++;+  }++  filter->filteredblockaddress = length;+  filter->filteredblocklength = length;++  return 1;+}++static int+execute_filter_e8(struct rar_filter *filter, struct rar_virtual_machine *vm, size_t pos, int e9also)+{+  uint32_t length = filter->initialregisters[4];+  uint32_t filesize = 0x1000000;+  uint32_t i;++  if (length > PROGRAM_WORK_SIZE || length < 4)+    return 0;++  for (i = 0; i <= length - 5; i++)+  {+    if (vm->memory[i] == 0xE8 || (e9also && vm->memory[i] == 0xE9))+    {+      uint32_t currpos = (uint32_t)pos + i + 1;+      int32_t address = (int32_t)vm_read_32(vm, i + 1);+      if (address < 0 && currpos >= (uint32_t)-address)+        vm_write_32(vm, i + 1, address + filesize);+      else if (address >= 0 && (uint32_t)address < filesize)+        vm_write_32(vm, i + 1, address - currpos);+      i += 4;+    }+  }++  filter->filteredblockaddress = 0;+  filter->filteredblocklength = length;++  return 1;+}++static int+execute_filter_rgb(struct rar_filter *filter, struct rar_virtual_machine *vm)+{+  uint32_t stride = filter->initialregisters[0];+  uint32_t byteoffset = filter->initialregisters[1];+  uint32_t blocklength = filter->initialregisters[4];+  uint8_t *src, *dst;+  uint32_t i, j;++  if (blocklength > PROGRAM_WORK_SIZE / 2 || stride > blocklength)+    return 0;++  src = &vm->memory[0];+  dst = &vm->memory[blocklength];+  for (i = 0; i < 3; i++) {+    uint8_t byte = 0;+    uint8_t *prev = dst + i - stride;+    for (j = i; j < blocklength; j += 3)+    {+      if (prev >= dst)+      {+        uint32_t delta1 = abs(prev[3] - prev[0]);+        uint32_t delta2 = abs(byte - prev[0]);+        uint32_t delta3 = abs(prev[3] - prev[0] + byte - prev[0]);+        if (delta1 > delta2 || delta1 > delta3)+          byte = delta2 <= delta3 ? prev[3] : prev[0];+      }+      byte -= *src++;+      dst[j] = byte;+      prev += 3;+    }+  }+  for (i = byteoffset; i < blocklength - 2; i += 3)+  {+    dst[i] += dst[i + 1];+    dst[i + 2] += dst[i + 1];+  }++  filter->filteredblockaddress = blocklength;+  filter->filteredblocklength = blocklength;++  return 1;+}++static int+execute_filter_audio(struct rar_filter *filter, struct rar_virtual_machine *vm)+{+  uint32_t length = filter->initialregisters[4];+  uint32_t numchannels = filter->initialregisters[0];+  uint8_t *src, *dst;+  uint32_t i, j;++  if (length > PROGRAM_WORK_SIZE / 2)+    return 0;++  src = &vm->memory[0];+  dst = &vm->memory[length];+  for (i = 0; i < numchannels; i++)+  {+    struct audio_state state;+    memset(&state, 0, sizeof(state));+    for (j = i; j < length; j += numchannels)+    {+      int8_t delta = (int8_t)*src++;+      uint8_t predbyte, byte;+      int prederror;+      state.delta[2] = state.delta[1];+      state.delta[1] = state.lastdelta - state.delta[0];+      state.delta[0] = state.lastdelta;+      predbyte = ((8 * state.lastbyte + state.weight[0] * state.delta[0] + state.weight[1] * state.delta[1] + state.weight[2] * state.delta[2]) >> 3) & 0xFF;+      byte = (predbyte - delta) & 0xFF;+      prederror = delta << 3;+      state.error[0] += abs(prederror);+      state.error[1] += abs(prederror - state.delta[0]); state.error[2] += abs(prederror + state.delta[0]);+      state.error[3] += abs(prederror - state.delta[1]); state.error[4] += abs(prederror + state.delta[1]);+      state.error[5] += abs(prederror - state.delta[2]); state.error[6] += abs(prederror + state.delta[2]);+      state.lastdelta = (int8_t)(byte - state.lastbyte);+      dst[j] = state.lastbyte = byte;+      if (!(state.count++ & 0x1F))+      {+        uint8_t k, idx = 0;+        for (k = 1; k < 7; k++)+        {+          if (state.error[k] < state.error[idx])+            idx = k;+        }+        memset(state.error, 0, sizeof(state.error));+        switch (idx)+        {+          case 1: if (state.weight[0] >= -16) state.weight[0]--; break;+          case 2: if (state.weight[0] < 16) state.weight[0]++; break;+          case 3: if (state.weight[1] >= -16) state.weight[1]--; break;+          case 4: if (state.weight[1] < 16) state.weight[1]++; break;+          case 5: if (state.weight[2] >= -16) state.weight[2]--; break;+          case 6: if (state.weight[2] < 16) state.weight[2]++; break;+        }+      }+    }+  }++  filter->filteredblockaddress = length;+  filter->filteredblocklength = length;++  return 1;+}+++static int+execute_filter(struct archive_read *a, struct rar_filter *filter, struct rar_virtual_machine *vm, size_t pos)+{+  if (filter->prog->fingerprint == 0x1D0E06077D)+    return execute_filter_delta(filter, vm);+  if (filter->prog->fingerprint == 0x35AD576887)+    return execute_filter_e8(filter, vm, pos, 0);+  if (filter->prog->fingerprint == 0x393CD7E57E)+    return execute_filter_e8(filter, vm, pos, 1);+  if (filter->prog->fingerprint == 0x951C2C5DC8)+    return execute_filter_rgb(filter, vm);+  if (filter->prog->fingerprint == 0xD8BC85E701)+    return execute_filter_audio(filter, vm);++  archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "No support for RAR VM program filter");+  return 0;+}++static int+rar_decode_byte(struct archive_read *a, uint8_t *byte)+{+  struct rar *rar = (struct rar *)(a->format->data);+  struct rar_br *br = &(rar->br);+  if (!rar_br_read_ahead(a, br, 8))+    return 0;+  *byte = (uint8_t)rar_br_bits(br, 8);+  rar_br_consume(br, 8);+  return 1;+}++static inline void+vm_write_32(struct rar_virtual_machine* vm, size_t offset, uint32_t u32)+{+  archive_le32enc(vm->memory + offset, u32);+}++static inline uint32_t+vm_read_32(struct rar_virtual_machine* vm, size_t offset)+{+  return archive_le32dec(vm->memory + offset); }
c/archive_read_support_format_rar5.c view
@@ -632,7 +632,7 @@ 			/* 0xEB = ARM's BL (branch + link) instruction. */ 			offset = read_filter_data(rar, 			    (rar->cstate.solid_offset + flt->block_start + i) &-			     rar->cstate.window_mask) & 0x00ffffff;+			     (uint32_t)rar->cstate.window_mask) & 0x00ffffff;  			offset -= (uint32_t) ((i + flt->block_start) / 4); 			offset = (offset & 0x00ffffff) | 0xeb000000;@@ -1117,6 +1117,44 @@ 	return -1; } +static int bid_sfx(struct archive_read *a)+{+	const char *p;++	if ((p = __archive_read_ahead(a, 7, NULL)) == NULL)+		return -1;++	if ((p[0] == 'M' && p[1] == 'Z') || memcmp(p, "\x7F\x45LF", 4) == 0) {+		/* This is a PE file */+		char signature[sizeof(rar5_signature_xor)];+		ssize_t offset = 0x10000;+		ssize_t window = 4096;+		ssize_t bytes_avail;++		rar5_signature(signature);++		while (offset + window <= (1024 * 512)) {+			const char *buff = __archive_read_ahead(a, offset + window, &bytes_avail);+			if (buff == NULL) {+				/* Remaining bytes are less than window. */+				window >>= 1;+				if (window < 0x40)+					return 0;+				continue;+			}+			p = buff + offset;+			while (p + 8 < buff + bytes_avail) {+				if (memcmp(p, signature, sizeof(signature)) == 0)+					return 30;+				p += 0x10;+			}+			offset = p - buff;+		}+	}++	return 0;+}+ static int rar5_bid(struct archive_read* a, int best_bid) { 	int my_bid; @@ -1127,6 +1165,10 @@ 	if(my_bid > -1) { 		return my_bid; 	}+	my_bid = bid_sfx(a);+	if (my_bid > -1) {+		return my_bid;+	}  	return -1; }@@ -2306,6 +2348,62 @@ 		return ret; } +static int try_skip_sfx(struct archive_read *a)+{+	const char *p;++	if ((p = __archive_read_ahead(a, 7, NULL)) == NULL)+		return ARCHIVE_EOF;++	if ((p[0] == 'M' && p[1] == 'Z') || memcmp(p, "\x7F\x45LF", 4) == 0)+	{+		char signature[sizeof(rar5_signature_xor)];+		const void *h;+		const char *q;+		size_t skip, total = 0;+		ssize_t bytes, window = 4096;++		rar5_signature(signature);++		while (total + window <= (1024 * 512)) {+			h = __archive_read_ahead(a, window, &bytes);+			if (h == NULL) {+				/* Remaining bytes are less than window. */+				window >>= 1;+				if (window < 0x40)+					goto fatal;+				continue;+			}+			if (bytes < 0x40)+				goto fatal;+			p = h;+			q = p + bytes;++			/*+			 * Scan ahead until we find something that looks+			 * like the RAR header.+			 */+			while (p + 8 < q) {+				if (memcmp(p, signature, sizeof(signature)) == 0) {+					skip = p - (const char *)h;+					__archive_read_consume(a, skip);+					return (ARCHIVE_OK);+				}+				p += 0x10;+			}+			skip = p - (const char *)h;+			__archive_read_consume(a, skip);+			total += skip;+		}+	}++	return ARCHIVE_OK;+fatal:+	archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,+			"Couldn't find out RAR header");+	return (ARCHIVE_FATAL);+}+ static int rar5_read_header(struct archive_read *a,     struct archive_entry *entry) {@@ -2314,6 +2412,8 @@  	if(rar->header_initialized == 0) { 		init_header(a);+		if ((ret = try_skip_sfx(a)) < ARCHIVE_WARN)+			return ret; 		rar->header_initialized = 1; 	} @@ -2375,7 +2475,7 @@ 		 * `stored_crc32` info filled in. */ 		if(rar->file.stored_crc32 > 0) { 			rar->file.calculated_crc32 =-				crc32(rar->file.calculated_crc32, p, to_read);+				crc32(rar->file.calculated_crc32, p, (unsigned int)to_read); 		}  		/* Check if the file uses an optional BLAKE2sp checksum@@ -2721,11 +2821,13 @@ 	    ^ (uint8_t) (*block_size >> 16);  	if(calculated_cksum != hdr->block_cksum) {+#ifndef DONT_FAIL_ON_CRC_ERROR 		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, 		    "Block checksum error: got 0x%x, expected 0x%x", 		    hdr->block_cksum, calculated_cksum);  		return ARCHIVE_FATAL;+#endif 	}  	return ARCHIVE_OK;@@ -3811,6 +3913,13 @@ 			case GOOD: 				/* fallthrough */ 			case BEST:+				/* No data is returned here. But because a sparse-file aware+				 * caller (like archive_read_data_into_fd) may treat zero-size+				 * as a sparse file block, we need to update the offset+				 * accordingly. At this point the decoder doesn't have any+				 * pending uncompressed data blocks, so the current position in+				 * the output file should be last_write_ptr. */+				if (offset) *offset = rar->cstate.last_write_ptr; 				return uncompress_file(a); 			default: 				archive_set_error(&a->archive,
c/archive_read_support_format_tar.c view
@@ -407,14 +407,13 @@ 	/* 	 * Check format of mode/uid/gid/mtime/size/rdevmajor/rdevminor fields. 	 */-	if (bid > 0 && (-	    validate_number_field(header->mode, sizeof(header->mode)) == 0+	if (validate_number_field(header->mode, sizeof(header->mode)) == 0 	    || validate_number_field(header->uid, sizeof(header->uid)) == 0 	    || validate_number_field(header->gid, sizeof(header->gid)) == 0 	    || validate_number_field(header->mtime, sizeof(header->mtime)) == 0 	    || validate_number_field(header->size, sizeof(header->size)) == 0 	    || validate_number_field(header->rdevmajor, sizeof(header->rdevmajor)) == 0-	    || validate_number_field(header->rdevminor, sizeof(header->rdevminor)) == 0)) {+	    || validate_number_field(header->rdevminor, sizeof(header->rdevminor)) == 0) { 		bid = 0; 	} @@ -573,11 +572,15 @@ 			l = wcslen(wp); 			if (l > 0 && wp[l - 1] == L'/') { 				archive_entry_set_filetype(entry, AE_IFDIR);+				tar->entry_bytes_remaining = 0;+				tar->entry_padding = 0; 			} 		} else if ((p = archive_entry_pathname(entry)) != NULL) { 			l = strlen(p); 			if (l > 0 && p[l - 1] == '/') { 				archive_entry_set_filetype(entry, AE_IFDIR);+				tar->entry_bytes_remaining = 0;+				tar->entry_padding = 0; 			} 		} 	}@@ -1396,6 +1399,7 @@     struct archive_entry *entry, const void *h, size_t *unconsumed) { 	int64_t size;+	size_t msize; 	const void *data; 	const char *p, *name; 	const wchar_t *wp, *wname;@@ -1434,6 +1438,11 @@   	/* Read the body as a Mac OS metadata blob. */ 	size = archive_entry_size(entry);+	msize = (size_t)size;+	if (size < 0 || (uintmax_t)msize != (uintmax_t)size) {+		*unconsumed = 0;+		return (ARCHIVE_FATAL);+	}  	/* 	 * TODO: Look beyond the body here to peek at the next header.@@ -1447,13 +1456,13 @@ 	 * Q: Is the above idea really possible?  Even 	 * when there are GNU or pax extension entries? 	 */-	data = __archive_read_ahead(a, (size_t)size, NULL);+	data = __archive_read_ahead(a, msize, NULL); 	if (data == NULL) { 		*unconsumed = 0; 		return (ARCHIVE_FATAL); 	}-	archive_entry_copy_mac_metadata(entry, data, (size_t)size);-	*unconsumed = (size_t)((size + 511) & ~ 511);+	archive_entry_copy_mac_metadata(entry, data, msize);+	*unconsumed = (msize + 511) & ~ 511; 	tar_flush_unconsumed(a, unconsumed); 	return (tar_read_header(a, tar, entry, unconsumed)); }@@ -2098,6 +2107,21 @@ 			/* "size" is the size of the data in the entry. */ 			tar->entry_bytes_remaining 			    = tar_atol10(value, strlen(value));+			if (tar->entry_bytes_remaining < 0) {+				tar->entry_bytes_remaining = 0;+				archive_set_error(&a->archive,+				    ARCHIVE_ERRNO_MISC,+				    "Tar size attribute is negative");+				return (ARCHIVE_FATAL);+			}+			if (tar->entry_bytes_remaining == INT64_MAX) {+				/* Note: tar_atol returns INT64_MAX on overflow */+				tar->entry_bytes_remaining = 0;+				archive_set_error(&a->archive,+				    ARCHIVE_ERRNO_MISC,+				    "Tar size attribute overflow");+				return (ARCHIVE_FATAL);+			} 			/* 			 * The "size" pax header keyword always overrides the 			 * "size" field in the tar header.
c/archive_read_support_format_warc.c view
@@ -530,11 +530,11 @@ static time_t time_from_tm(struct tm *t) {-#if HAVE_TIMEGM+#if HAVE__MKGMTIME+        return _mkgmtime(t);+#elif HAVE_TIMEGM         /* Use platform timegm() if available. */         return (timegm(t));-#elif HAVE__MKGMTIME64-        return (_mkgmtime64(t)); #else         /* Else use direct calculation using POSIX assumptions. */         /* First, fix up tm_yday based on the year/month/day. */
c/archive_read_support_format_xar.c view
@@ -624,7 +624,9 @@ 		__archive_read_consume(a, xar->toc_chksum_size); 		xar->offset += xar->toc_chksum_size; 		if (r != ARCHIVE_OK)+#ifndef DONT_FAIL_ON_CRC_ERROR 			return (ARCHIVE_FATAL);+#endif 	}  	/*@@ -827,10 +829,12 @@ 		    xattr->a_sum.val, xattr->a_sum.len, 		    xattr->e_sum.val, xattr->e_sum.len); 		if (r != ARCHIVE_OK) {+#ifndef DONT_FAIL_ON_CRC_ERROR 			archive_set_error(&(a->archive), ARCHIVE_ERRNO_MISC, 			    "Xattr checksum error"); 			r = ARCHIVE_WARN; 			break;+#endif 		} 		if (xattr->name.s == NULL) { 			archive_set_error(&(a->archive), ARCHIVE_ERRNO_MISC,@@ -1123,7 +1127,7 @@ 			x |= p[1] - '0'; 		else 			return (-1);-		+ 		*b++ = x; 		bsize--; 		p += 2;@@ -1135,11 +1139,11 @@ static time_t time_from_tm(struct tm *t) {-#if HAVE_TIMEGM+#if HAVE__MKGMTIME+        return _mkgmtime(t);+#elif HAVE_TIMEGM         /* Use platform timegm() if available. */         return (timegm(t));-#elif HAVE__MKGMTIME64-        return (_mkgmtime64(t)); #else         /* Else use direct calculation using POSIX assumptions. */         /* First, fix up tm_yday based on the year/month/day. */
c/archive_read_support_format_zip.c view
@@ -58,6 +58,9 @@ #ifdef HAVE_LZMA_H #include <lzma.h> #endif+#ifdef HAVE_ZSTD_H+#include <zstd.h>+#endif  #include "archive.h" #include "archive_digest_private.h"@@ -191,6 +194,11 @@ 	char            bzstream_valid; #endif +#if HAVE_ZSTD_H && HAVE_LIBZSTD+	ZSTD_DStream	*zstdstream;+	char            zstdstream_valid;+#endif+ 	IByteIn			zipx_ppmd_stream; 	ssize_t			zipx_ppmd_read_compressed; 	CPpmd8			ppmd8;@@ -435,6 +443,7 @@ 	{17, "reserved"}, /* Reserved by PKWARE */ 	{18, "ibm-terse-new"}, /* File is compressed using IBM TERSE (new) */ 	{19, "ibm-lz777"},/* IBM LZ77 z Architecture (PFS) */+	{93, "zstd"},     /*  Zstandard (zstd) Compression */ 	{95, "xz"},       /* XZ compressed data */ 	{96, "jpeg"},     /* JPEG compressed data */ 	{97, "wav-pack"}, /* WavPack compressed data */@@ -1144,7 +1153,8 @@ 			    (intmax_t)zip_entry->compressed_size); 			ret = ARCHIVE_WARN; 		}-		if (zip_entry->uncompressed_size == 0) {+		if (zip_entry->uncompressed_size == 0 ||+			zip_entry->uncompressed_size == 0xffffffff) { 			zip_entry->uncompressed_size 			    = zip_entry_central_dir.uncompressed_size; 		} else if (zip_entry->uncompressed_size@@ -1186,7 +1196,7 @@ 		{ 			// symlink target string appeared to be compressed 			int status = ARCHIVE_FATAL;-			const void *uncompressed_buffer;+			const void *uncompressed_buffer = NULL;  			switch (zip->entry->compression) 			{@@ -1657,7 +1667,7 @@ 	 */  	/* Read magic1,magic2,lzma_params from the ZIPX stream. */-	if((p = __archive_read_ahead(a, 9, NULL)) == NULL) {+	if(zip->entry_bytes_remaining < 9 || (p = __archive_read_ahead(a, 9, NULL)) == NULL) { 		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, 		    "Truncated lzma data"); 		return (ARCHIVE_FATAL);@@ -2176,11 +2186,11 @@  	/* Setup buffer boundaries. */ 	zip->bzstream.next_in = (char*)(uintptr_t) compressed_buff;-	zip->bzstream.avail_in = in_bytes;+	zip->bzstream.avail_in = (uint32_t)in_bytes; 	zip->bzstream.total_in_hi32 = 0; 	zip->bzstream.total_in_lo32 = 0; 	zip->bzstream.next_out = (char*) zip->uncompressed_buffer;-	zip->bzstream.avail_out = zip->uncompressed_buffer_size;+	zip->bzstream.avail_out = (uint32_t)zip->uncompressed_buffer_size; 	zip->bzstream.total_out_hi32 = 0; 	zip->bzstream.total_out_lo32 = 0; @@ -2217,7 +2227,7 @@ 	to_consume = zip->bzstream.total_in_lo32; 	__archive_read_consume(a, to_consume); -	total_out = ((uint64_t) zip->bzstream.total_out_hi32 << 32) ++	total_out = ((uint64_t) zip->bzstream.total_out_hi32 << 32) | 	    zip->bzstream.total_out_lo32;  	zip->entry_bytes_remaining -= to_consume;@@ -2238,6 +2248,140 @@  #endif +#if HAVE_ZSTD_H && HAVE_LIBZSTD+static int+zipx_zstd_init(struct archive_read *a, struct zip *zip)+{+	size_t r;++	/* Deallocate already existing Zstd decompression context if it+	 * exists. */+	if(zip->zstdstream_valid) {+		ZSTD_freeDStream(zip->zstdstream);+		zip->zstdstream_valid = 0;+	}++	/* Allocate a new Zstd decompression context. */+	zip->zstdstream = ZSTD_createDStream();++	r = ZSTD_initDStream(zip->zstdstream);+	if (ZSTD_isError(r)) {+		 archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,+			"Error initializing zstd decompressor: %s",+			ZSTD_getErrorName(r));++		return ARCHIVE_FAILED;+	}++	/* Mark the zstdstream field to be released in cleanup phase. */+	zip->zstdstream_valid = 1;++	/* (Re)allocate the buffer that will contain decompressed bytes. */+	free(zip->uncompressed_buffer);++	zip->uncompressed_buffer_size = ZSTD_DStreamOutSize();+	zip->uncompressed_buffer =+	    (uint8_t*) malloc(zip->uncompressed_buffer_size);+	if (zip->uncompressed_buffer == NULL) {+		archive_set_error(&a->archive, ENOMEM,+			"No memory for Zstd decompression");++		return ARCHIVE_FATAL;+	}++	/* Initialization done. */+	zip->decompress_init = 1;+	return ARCHIVE_OK;+}++static int+zip_read_data_zipx_zstd(struct archive_read *a, const void **buff,+    size_t *size, int64_t *offset)+{+	struct zip *zip = (struct zip *)(a->format->data);+	ssize_t bytes_avail = 0, in_bytes, to_consume;+	const void *compressed_buff;+	int r;+	size_t ret;+	uint64_t total_out;+	ZSTD_outBuffer out;+	ZSTD_inBuffer in;++	(void) offset; /* UNUSED */++	/* Initialize decompression context if we're here for the first time. */+	if(!zip->decompress_init) {+		r = zipx_zstd_init(a, zip);+		if(r != ARCHIVE_OK)+			return r;+	}++	/* Fetch more compressed bytes */+	compressed_buff = __archive_read_ahead(a, 1, &bytes_avail);+	if(bytes_avail < 0) {+		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,+		    "Truncated zstd file body");+		return (ARCHIVE_FATAL);+	}++	in_bytes = zipmin(zip->entry_bytes_remaining, bytes_avail);+	if(in_bytes < 1) {+		/* zstd doesn't complain when caller feeds avail_in == 0.+		 * It will actually return success in this case, which is+		 * undesirable. This is why we need to make this check+		 * manually. */+		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,+		    "Truncated zstd file body");+		return (ARCHIVE_FATAL);+	}++	/* Setup buffer boundaries */+	in.src = compressed_buff;+	in.size = in_bytes;+	in.pos = 0;+	out = (ZSTD_outBuffer) { zip->uncompressed_buffer, zip->uncompressed_buffer_size, 0 };++	/* Perform the decompression. */+	ret = ZSTD_decompressStream(zip->zstdstream, &out, &in);+	if (ZSTD_isError(ret)) {+		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,+			"Error during zstd decompression: %s",+			ZSTD_getErrorName(ret));+		return (ARCHIVE_FATAL);+	}++	/* Check end of the stream. */+	if (ret == 0) {+		if ((in.pos == in.size) && (out.pos < out.size)) {+			zip->end_of_entry = 1;+			ZSTD_freeDStream(zip->zstdstream);+			zip->zstdstream_valid = 0;+		}+	}++	/* Update the pointers so decompressor can continue decoding. */+	to_consume = in.pos;+	__archive_read_consume(a, to_consume);++	total_out = out.pos;++	zip->entry_bytes_remaining -= to_consume;+	zip->entry_compressed_bytes_read += to_consume;+	zip->entry_uncompressed_bytes_read += total_out;++	/* Give libarchive its due. */+	*size = total_out;+	*buff = zip->uncompressed_buffer;++	/* Seek for optional marker, like in other entries. */+	r = consume_optional_marker(a, zip);+	if(r != ARCHIVE_OK)+		return r;++	return ARCHIVE_OK;+}+#endif+ #ifdef HAVE_ZLIB_H static int zip_deflate_init(struct archive_read *a, struct zip *zip)@@ -2858,6 +3002,11 @@ 		r = zip_read_data_zipx_xz(a, buff, size, offset); 		break; #endif+#if HAVE_ZSTD_H && HAVE_LIBZSTD+	case 93: /* ZIPx Zstd compression. */+		r = zip_read_data_zipx_zstd(a, buff, size, offset);+		break;+#endif 	/* PPMd support is built-in, so we don't need any #if guards. */ 	case 98: /* ZIPx PPMd compression. */ 		r = zip_read_data_zipx_ppmd(a, buff, size, offset);@@ -2945,6 +3094,12 @@ #ifdef HAVE_BZLIB_H 	if (zip->bzstream_valid) { 		BZ2_bzDecompressEnd(&zip->bzstream);+	}+#endif++#if HAVE_ZSTD_H && HAVE_LIBZSTD+	if (zip->zstdstream_valid) {+		ZSTD_freeDStream(zip->zstdstream); 	} #endif 
c/archive_string.c view
@@ -745,7 +745,7 @@ 				dp = &defchar_used; 			count = WideCharToMultiByte(to_cp, 0, ws, wslen, 			    as->s + as->length,-			    (int)as->buffer_length - as->length - 1, NULL, dp);+			    (int)as->buffer_length - (int)as->length - 1, NULL, dp); 			if (count == 0 && 			    GetLastError() == ERROR_INSUFFICIENT_BUFFER) { 				/* Expand the MBS buffer and retry. */@@ -1324,6 +1324,10 @@ }  #if defined(_WIN32) && !defined(__CYGWIN__)+# if defined(WINAPI_FAMILY_PARTITION) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)+#  define GetOEMCP() CP_OEMCP+# endif+ static unsigned my_atoi(const char *p) {@@ -3988,10 +3992,10 @@ 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 */+	int ret = 0; #if defined(_WIN32) && !defined(__CYGWIN__)+	int r;+ 	/* 	 * Internationalization programming on Windows must use Wide 	 * characters because Windows platform cannot make locale UTF-8.
c/archive_util.c view
@@ -42,9 +42,20 @@ #ifdef HAVE_STRING_H #include <string.h> #endif-#if defined(HAVE_WINCRYPT_H) && !defined(__CYGWIN__)+#if defined(_WIN32) && !defined(__CYGWIN__)+#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA+/* don't use bcrypt when XP needs to be supported */+#include <bcrypt.h>++/* Common in other bcrypt implementations, but missing from VS2008. */+#ifndef BCRYPT_SUCCESS+#define BCRYPT_SUCCESS(r) ((NTSTATUS)(r) == STATUS_SUCCESS)+#endif++#elif defined(HAVE_WINCRYPT_H) #include <wincrypt.h> #endif+#endif #ifdef HAVE_ZLIB_H #include <zlib.h> #endif@@ -233,14 +244,16 @@ 		L'm', L'n', L'o', L'p', L'q', L'r', L's', L't', 		L'u', L'v', L'w', L'x', L'y', L'z' 	};-	HCRYPTPROV hProv; 	struct archive_wstring temp_name; 	wchar_t *ws; 	DWORD attr; 	wchar_t *xp, *ep; 	int fd;--	hProv = (HCRYPTPROV)NULL;+#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA+	BCRYPT_ALG_HANDLE hAlg = NULL;+#else+	HCRYPTPROV hProv = (HCRYPTPROV)NULL;+#endif 	fd = -1; 	ws = NULL; @@ -314,23 +327,42 @@ 			abort(); 	} +#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA+	if (!BCRYPT_SUCCESS(BCryptOpenAlgorithmProvider(&hAlg, BCRYPT_RNG_ALGORITHM,+		NULL, 0))) {+		la_dosmaperr(GetLastError());+		goto exit_tmpfile;+	}+#else 	if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 		CRYPT_VERIFYCONTEXT)) { 		la_dosmaperr(GetLastError()); 		goto exit_tmpfile; 	}+#endif  	for (;;) { 		wchar_t *p; 		HANDLE h;+# if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+		CREATEFILE2_EXTENDED_PARAMETERS createExParams;+#endif  		/* Generate a random file name through CryptGenRandom(). */ 		p = xp;+#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA+		if (!BCRYPT_SUCCESS(BCryptGenRandom(hAlg, (PUCHAR)p,+		    (DWORD)(ep - p)*sizeof(wchar_t), 0))) {+			la_dosmaperr(GetLastError());+			goto exit_tmpfile;+		}+#else 		if (!CryptGenRandom(hProv, (DWORD)(ep - p)*sizeof(wchar_t), 		    (BYTE*)p)) { 			la_dosmaperr(GetLastError()); 			goto exit_tmpfile; 		}+#endif 		for (; p < ep; p++) 			*p = num[((DWORD)*p) % (sizeof(num)/sizeof(num[0]))]; @@ -347,6 +379,17 @@ 			/* mkstemp */ 			attr = FILE_ATTRIBUTE_NORMAL; 		}+# if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+		ZeroMemory(&createExParams, sizeof(createExParams));+		createExParams.dwSize = sizeof(createExParams);+		createExParams.dwFileAttributes = attr & 0xFFFF;+		createExParams.dwFileFlags = attr & 0xFFF00000;+		h = CreateFile2(ws,+		    GENERIC_READ | GENERIC_WRITE | DELETE,+		    0,/* Not share */+			CREATE_NEW,+			&createExParams);+#else 		h = CreateFileW(ws, 		    GENERIC_READ | GENERIC_WRITE | DELETE, 		    0,/* Not share */@@ -354,6 +397,7 @@ 		    CREATE_NEW,/* Create a new file only */ 		    attr, 		    NULL);+#endif 		if (h == INVALID_HANDLE_VALUE) { 			/* The same file already exists. retry with 			 * a new filename. */@@ -372,8 +416,13 @@ 			break;/* success! */ 	} exit_tmpfile:+#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA+	if (hAlg != NULL)+		BCryptCloseAlgorithmProvider(hAlg, 0);+#else 	if (hProv != (HCRYPTPROV)NULL) 		CryptReleaseContext(hProv, 0);+#endif 	free(ws); 	if (template == temp_name.s) 		archive_wstring_free(&temp_name);
c/archive_windows.c view
@@ -234,7 +234,11 @@ { 	wchar_t *wpath; 	HANDLE handle;+# if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+	CREATEFILE2_EXTENDED_PARAMETERS createExParams;+#endif +#if !defined(WINAPI_FAMILY_PARTITION) || WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP) 	handle = CreateFileA(path, dwDesiredAccess, dwShareMode, 	    lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, 	    hTemplateFile);@@ -242,12 +246,25 @@ 		return (handle); 	if (GetLastError() != ERROR_PATH_NOT_FOUND) 		return (handle);+#endif 	wpath = __la_win_permissive_name(path); 	if (wpath == NULL)-		return (handle);+		return INVALID_HANDLE_VALUE;+# if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+	ZeroMemory(&createExParams, sizeof(createExParams));+	createExParams.dwSize = sizeof(createExParams);+	createExParams.dwFileAttributes = dwFlagsAndAttributes & 0xFFFF;+	createExParams.dwFileFlags = dwFlagsAndAttributes & 0xFFF00000;+	createExParams.dwSecurityQosFlags = dwFlagsAndAttributes & 0x000F00000;+	createExParams.lpSecurityAttributes = lpSecurityAttributes;+	createExParams.hTemplateFile = hTemplateFile;+	handle = CreateFile2(wpath, dwDesiredAccess, dwShareMode,+	    dwCreationDisposition, &createExParams);+#else /* !WINAPI_PARTITION_DESKTOP */ 	handle = CreateFileW(wpath, dwDesiredAccess, dwShareMode, 	    lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, 	    hTemplateFile);+#endif /* !WINAPI_PARTITION_DESKTOP */ 	free(wpath); 	return (handle); }@@ -305,7 +322,10 @@ 		 * "Permission denied" error. 		 */ 		attr = GetFileAttributesA(path);-		if (attr == (DWORD)-1 && GetLastError() == ERROR_PATH_NOT_FOUND) {+#if !defined(WINAPI_FAMILY_PARTITION) || WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP)+		if (attr == (DWORD)-1 && GetLastError() == ERROR_PATH_NOT_FOUND)+#endif+		{ 			ws = __la_win_permissive_name(path); 			if (ws == NULL) { 				errno = EINVAL;@@ -320,7 +340,7 @@ 		} 		if (attr & FILE_ATTRIBUTE_DIRECTORY) { 			HANDLE handle;-+#if !defined(WINAPI_FAMILY_PARTITION) || WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP) 			if (ws != NULL) 				handle = CreateFileW(ws, 0, 0, NULL, 				    OPEN_EXISTING,@@ -333,6 +353,15 @@ 				    FILE_FLAG_BACKUP_SEMANTICS | 				    FILE_ATTRIBUTE_READONLY, 					NULL);+#else /* !WINAPI_PARTITION_DESKTOP */+			CREATEFILE2_EXTENDED_PARAMETERS createExParams;+			ZeroMemory(&createExParams, sizeof(createExParams));+			createExParams.dwSize = sizeof(createExParams);+			createExParams.dwFileAttributes = FILE_ATTRIBUTE_READONLY;+			createExParams.dwFileFlags = FILE_FLAG_BACKUP_SEMANTICS;+			handle = CreateFile2(ws, 0, 0,+				OPEN_EXISTING, &createExParams);+#endif /* !WINAPI_PARTITION_DESKTOP */ 			free(ws); 			if (handle == INVALID_HANDLE_VALUE) { 				la_dosmaperr(GetLastError());
c/archive_write.c view
@@ -60,8 +60,6 @@ #include "archive_private.h" #include "archive_write_private.h" -static struct archive_vtable *archive_write_vtable(void);- static int	_archive_filter_code(struct archive *, int); static const char *_archive_filter_name(struct archive *, int); static int64_t	_archive_filter_bytes(struct archive *, int);@@ -79,26 +77,18 @@ 	char *next; }; -static struct archive_vtable *-archive_write_vtable(void)-{-	static struct archive_vtable av;-	static int inited = 0;--	if (!inited) {-		av.archive_close = _archive_write_close;-		av.archive_filter_bytes = _archive_filter_bytes;-		av.archive_filter_code = _archive_filter_code;-		av.archive_filter_name = _archive_filter_name;-		av.archive_filter_count = _archive_write_filter_count;-		av.archive_free = _archive_write_free;-		av.archive_write_header = _archive_write_header;-		av.archive_write_finish_entry = _archive_write_finish_entry;-		av.archive_write_data = _archive_write_data;-		inited = 1;-	}-	return (&av);-}+static const struct archive_vtable+archive_write_vtable = {+	.archive_close = _archive_write_close,+	.archive_filter_bytes = _archive_filter_bytes,+	.archive_filter_code = _archive_filter_code,+	.archive_filter_name = _archive_filter_name,+	.archive_filter_count = _archive_write_filter_count,+	.archive_free = _archive_write_free,+	.archive_write_header = _archive_write_header,+	.archive_write_finish_entry = _archive_write_finish_entry,+	.archive_write_data = _archive_write_data,+};  /*  * Allocate, initialize and return an archive object.@@ -114,7 +104,7 @@ 		return (NULL); 	a->archive.magic = ARCHIVE_WRITE_MAGIC; 	a->archive.state = ARCHIVE_STATE_NEW;-	a->archive.vtable = archive_write_vtable();+	a->archive.vtable = &archive_write_vtable; 	/* 	 * The value 10240 here matches the traditional tar default, 	 * but is otherwise arbitrary.@@ -211,6 +201,10 @@ 	struct archive_write_filter *f;  	f = calloc(1, sizeof(*f));++	if (f == NULL)+		return (NULL);+ 	f->archive = _a; 	f->state = ARCHIVE_WRITE_FILTER_STATE_NEW; 	if (a->filter_first == NULL)@@ -316,6 +310,25 @@ 	return (__archive_write_filter(a->filter_first, buff, length)); } +static int+__archive_write_filters_flush(struct archive_write *a)+{+	struct archive_write_filter *f;+	int ret, ret1;++	ret = ARCHIVE_OK;+	for (f = a->filter_first; f != NULL; f = f->next_filter) {+		if (f->flush != NULL && f->bytes_written > 0) {+			ret1 = (f->flush)(f);+			if (ret1 < ret)+				ret = ret1;+			if (ret1 < ARCHIVE_WARN)+				f->state = ARCHIVE_WRITE_FILTER_STATE_FATAL;+		}+	}+	return (ret);+}+ int __archive_write_nulls(struct archive_write *a, size_t length) {@@ -558,6 +571,10 @@ 	a->client_data = client_data;  	client_filter = __archive_write_allocate_filter(_a);++	if (client_filter == NULL)+		return (ARCHIVE_FATAL);+ 	client_filter->open = archive_write_client_open; 	client_filter->write = archive_write_client_write; 	client_filter->close = archive_write_client_close;@@ -741,6 +758,18 @@ 		    "Can't add archive to itself"); 		return (ARCHIVE_FAILED); 	}++	/* Flush filters at boundary. */+	r2 = __archive_write_filters_flush(a);+	if (r2 == ARCHIVE_FAILED) {+		return (ARCHIVE_FAILED);+	}+	if (r2 == ARCHIVE_FATAL) {+		a->archive.state = ARCHIVE_STATE_FATAL;+		return (ARCHIVE_FATAL);+	}+	if (r2 < ret)+		ret = r2;  	/* Format and write header. */ 	r2 = ((a->format_write_header)(a, entry));
c/archive_write_add_filter_bzip2.c view
@@ -190,7 +190,7 @@  	memset(&data->stream, 0, sizeof(data->stream)); 	data->stream.next_out = data->compressed;-	data->stream.avail_out = data->compressed_buffer_size;+	data->stream.avail_out = (uint32_t)data->compressed_buffer_size; 	f->write = archive_compressor_bzip2_write;  	/* Initialize compression library */@@ -244,7 +244,7 @@  	/* Compress input data to output buffer */ 	SET_NEXT_IN(data, buff);-	data->stream.avail_in = length;+	data->stream.avail_in = (uint32_t)length; 	if (drive_compressor(f, data, 0)) 		return (ARCHIVE_FATAL); 	return (ARCHIVE_OK);@@ -313,7 +313,7 @@ 				return (ARCHIVE_FATAL); 			} 			data->stream.next_out = data->compressed;-			data->stream.avail_out = data->compressed_buffer_size;+			data->stream.avail_out = (uint32_t)data->compressed_buffer_size; 		}  		/* If there's nothing to do, we're done. */
c/archive_write_add_filter_compress.c view
@@ -352,7 +352,7 @@ 	while (length--) { 		c = *bp++; 		state->in_count++;-		state->cur_fcode = (c << 16) + state->cur_code;+		state->cur_fcode = (c << 16) | state->cur_code; 		i = ((c << HSHIFT) ^ state->cur_code);	/* Xor hashing. */  		if (state->hashtab[i] == state->cur_fcode) {
c/archive_write_add_filter_lz4.c view
@@ -518,10 +518,10 @@ 	} else { 		/* The buffer is not compressed. The compressed size was 		 * bigger than its uncompressed size. */-		archive_le32enc(data->out, length | 0x80000000);+		archive_le32enc(data->out, (uint32_t)(length | 0x80000000)); 		data->out += 4; 		memcpy(data->out, p, length);-		outsize = length;+		outsize = (uint32_t)length; 	} 	data->out += outsize; 	if (data->block_checksum) {@@ -603,10 +603,10 @@ 	} else { 		/* The buffer is not compressed. The compressed size was 		 * bigger than its uncompressed size. */-		archive_le32enc(data->out, length | 0x80000000);+		archive_le32enc(data->out, (uint32_t)(length | 0x80000000)); 		data->out += 4; 		memcpy(data->out, p, length);-		outsize = length;+		outsize = (uint32_t)length; 	} 	data->out += outsize; 	if (data->block_checksum) {
c/archive_write_add_filter_xz.c view
@@ -251,13 +251,13 @@ 		int ds, log2dic, wedges;  		/* Calculate a coded dictionary size */-		if (dict_size < (1 << 12) || dict_size > (1 << 27)) {+		if (dict_size < (1 << 12) || dict_size > (1 << 29)) { 			archive_set_error(f->archive, ARCHIVE_ERRNO_MISC, 			    "Unacceptable dictionary size for lzip: %d", 			    dict_size); 			return (ARCHIVE_FATAL); 		}-		for (log2dic = 27; log2dic >= 12; log2dic--) {+		for (log2dic = 29; log2dic >= 12; log2dic--) { 			if (dict_size & (1 << log2dic)) 				break; 		}
c/archive_write_add_filter_zstd.c view
@@ -31,6 +31,9 @@ #ifdef HAVE_ERRNO_H #include <errno.h> #endif+#ifdef HAVE_STDINT_H+#include <stdint.h>+#endif #ifdef HAVE_STDLIB_H #include <stdlib.h> #endif@@ -50,9 +53,21 @@  struct private_data { 	int		 compression_level;-#if HAVE_ZSTD_H && HAVE_LIBZSTD+	int		 threads;+#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR+	enum {+		running,+		finishing,+		resetting,+	} state;+	int		 frame_per_file;+	size_t		 min_frame_size;+	size_t		 max_frame_size;+	size_t		 cur_frame;+	size_t		 cur_frame_in;+	size_t		 cur_frame_out;+	size_t		 total_in; 	ZSTD_CStream	*cstream;-	int64_t		 total_in; 	ZSTD_outBuffer	 out; #else 	struct archive_write_program_data *pdata;@@ -74,9 +89,10 @@ static int archive_compressor_zstd_open(struct archive_write_filter *); static int archive_compressor_zstd_write(struct archive_write_filter *, 		    const void *, size_t);+static int archive_compressor_zstd_flush(struct archive_write_filter *); static int archive_compressor_zstd_close(struct archive_write_filter *); static int archive_compressor_zstd_free(struct archive_write_filter *);-#if HAVE_ZSTD_H && HAVE_LIBZSTD+#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR static int drive_compressor(struct archive_write_filter *, 		    struct private_data *, int, const void *, size_t); #endif@@ -102,12 +118,19 @@ 	f->data = data; 	f->open = &archive_compressor_zstd_open; 	f->options = &archive_compressor_zstd_options;+	f->flush = &archive_compressor_zstd_flush; 	f->close = &archive_compressor_zstd_close; 	f->free = &archive_compressor_zstd_free; 	f->code = ARCHIVE_FILTER_ZSTD; 	f->name = "zstd"; 	data->compression_level = CLEVEL_DEFAULT;-#if HAVE_ZSTD_H && HAVE_LIBZSTD+	data->threads = 0;+#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR+	data->frame_per_file = 0;+	data->min_frame_size = 0;+	data->max_frame_size = SIZE_MAX;+	data->cur_frame_in = 0;+	data->cur_frame_out = 0; 	data->cstream = ZSTD_createCStream(); 	if (data->cstream == NULL) { 		free(data);@@ -134,7 +157,7 @@ archive_compressor_zstd_free(struct archive_write_filter *f) { 	struct private_data *data = (struct private_data *)f->data;-#if HAVE_ZSTD_H && HAVE_LIBZSTD+#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR 	ZSTD_freeCStream(data->cstream); 	free(data->out.dst); #else@@ -145,29 +168,18 @@ 	return (ARCHIVE_OK); } -static int string_is_numeric (const char* value)+static int string_to_number(const char *string, intmax_t *numberp) {-       size_t len = strlen(value);-       size_t i;--       if (len == 0) {-               return (ARCHIVE_WARN);-       }-       else if (len == 1 && !(value[0] >= '0' && value[0] <= '9')) {-               return (ARCHIVE_WARN);-       }-       else if (!(value[0] >= '0' && value[0] <= '9') &&-                value[0] != '-' && value[0] != '+') {-               return (ARCHIVE_WARN);-       }--       for (i = 1; i < len; i++) {-               if (!(value[i] >= '0' && value[i] <= '9')) {-                       return (ARCHIVE_WARN);-               }-       }+	char *end; -       return (ARCHIVE_OK);+	if (string == NULL || *string == '\0')+		return (ARCHIVE_WARN);+	*numberp = strtoimax(string, &end, 10);+	if (end == string || *end != '\0' || errno == EOVERFLOW) {+		*numberp = 0;+		return (ARCHIVE_WARN);+	}+	return (ARCHIVE_OK); }  /*@@ -180,14 +192,14 @@ 	struct private_data *data = (struct private_data *)f->data;  	if (strcmp(key, "compression-level") == 0) {-		int level = atoi(value);+		intmax_t level;+		if (string_to_number(value, &level) != ARCHIVE_OK) {+			return (ARCHIVE_WARN);+		} 		/* If we don't have the library, hard-code the max level */ 		int minimum = CLEVEL_MIN; 		int maximum = CLEVEL_MAX;-		if (string_is_numeric(value) != ARCHIVE_OK) {-			return (ARCHIVE_WARN);-		}-#if HAVE_ZSTD_H && HAVE_LIBZSTD+#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR 		maximum = ZSTD_maxCLevel(); #if ZSTD_VERSION_NUMBER >= MINVER_MINCLEVEL 		if (ZSTD_versionNumber() >= MINVER_MINCLEVEL) {@@ -202,8 +214,43 @@ 		if (level < minimum || level > maximum) { 			return (ARCHIVE_WARN); 		}-		data->compression_level = level;+		data->compression_level = (int)level; 		return (ARCHIVE_OK);+	} else if (strcmp(key, "threads") == 0) {+		intmax_t threads;+		if (string_to_number(value, &threads) != ARCHIVE_OK) {+			return (ARCHIVE_WARN);+		}+		if (threads < 0) {+			return (ARCHIVE_WARN);+		}+		data->threads = (int)threads;+		return (ARCHIVE_OK);+#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR+	} else if (strcmp(key, "frame-per-file") == 0) {+		data->frame_per_file = 1;+		return (ARCHIVE_OK);+	} else if (strcmp(key, "min-frame-size") == 0) {+		intmax_t min_frame_size;+		if (string_to_number(value, &min_frame_size) != ARCHIVE_OK) {+			return (ARCHIVE_WARN);+		}+		if (min_frame_size < 0) {+			return (ARCHIVE_WARN);+		}+		data->min_frame_size = min_frame_size;+		return (ARCHIVE_OK);+	} else if (strcmp(key, "max-frame-size") == 0) {+		intmax_t max_frame_size;+		if (string_to_number(value, &max_frame_size) != ARCHIVE_OK) {+			return (ARCHIVE_WARN);+		}+		if (max_frame_size < 1024) {+			return (ARCHIVE_WARN);+		}+		data->max_frame_size = max_frame_size;+		return (ARCHIVE_OK);+#endif 	}  	/* Note: The "warn" return is just to inform the options@@ -212,7 +259,7 @@ 	return (ARCHIVE_WARN); } -#if HAVE_ZSTD_H && HAVE_LIBZSTD+#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR /*  * Setup callback.  */@@ -252,6 +299,8 @@ 		return (ARCHIVE_FATAL); 	} +	ZSTD_CCtx_setParameter(data->cstream, ZSTD_c_nbWorkers, data->threads);+ 	return (ARCHIVE_OK); } @@ -263,15 +312,22 @@     size_t length) { 	struct private_data *data = (struct private_data *)f->data;-	int ret; -	/* Update statistics */-	data->total_in += length;+	return (drive_compressor(f, data, 0, buff, length));+} -	if ((ret = drive_compressor(f, data, 0, buff, length)) != ARCHIVE_OK)-		return (ret);+/*+ * Flush the compressed stream.+ */+static int+archive_compressor_zstd_flush(struct archive_write_filter *f)+{+	struct private_data *data = (struct private_data *)f->data; -	return (ARCHIVE_OK);+	if (data->frame_per_file && data->state == running &&+	    data->cur_frame_out > data->min_frame_size)+		data->state = finishing;+	return (drive_compressor(f, data, 1, NULL, 0)); }  /*@@ -282,60 +338,75 @@ { 	struct private_data *data = (struct private_data *)f->data; -	/* Finish zstd frame */-	return drive_compressor(f, data, 1, NULL, 0);+	if (data->state == running)+		data->state = finishing;+	return (drive_compressor(f, data, 1, NULL, 0)); }  /*  * Utility function to push input data through compressor,  * writing full output blocks as necessary.- *- * Note that this handles both the regular write case (finishing ==- * false) and the end-of-archive case (finishing == true).  */ static int drive_compressor(struct archive_write_filter *f,-    struct private_data *data, int finishing, const void *src, size_t length)+    struct private_data *data, int flush, const void *src, size_t length) {-	ZSTD_inBuffer in = (ZSTD_inBuffer) { src, length, 0 };+	ZSTD_inBuffer in = { .src = src, .size = length, .pos = 0 };+	size_t ipos, opos, zstdret = 0;+	int ret;  	for (;;) {-		if (data->out.pos == data->out.size) {-			const int ret = __archive_write_filter(f->next_filter,-			    data->out.dst, data->out.size);+		ipos = in.pos;+		opos = data->out.pos;+		switch (data->state) {+		case running:+			if (in.pos == in.size)+				return (ARCHIVE_OK);+			zstdret = ZSTD_compressStream(data->cstream,+			    &data->out, &in);+			if (ZSTD_isError(zstdret))+				goto zstd_fatal;+			break;+		case finishing:+			zstdret = ZSTD_endStream(data->cstream, &data->out);+			if (ZSTD_isError(zstdret))+				goto zstd_fatal;+			if (zstdret == 0)+				data->state = resetting;+			break;+		case resetting:+			ZSTD_CCtx_reset(data->cstream, ZSTD_reset_session_only);+			data->cur_frame++;+			data->cur_frame_in = 0;+			data->cur_frame_out = 0;+			data->state = running;+			break;+		}+		data->total_in += in.pos - ipos;+		data->cur_frame_in += in.pos - ipos;+		data->cur_frame_out += data->out.pos - opos;+		if (data->state == running &&+		    data->cur_frame_in >= data->max_frame_size) {+			data->state = finishing;+		}+		if (data->out.pos == data->out.size ||+		    (flush && data->out.pos > 0)) {+			ret = __archive_write_filter(f->next_filter,+			    data->out.dst, data->out.pos); 			if (ret != ARCHIVE_OK)-				return (ARCHIVE_FATAL);+				goto fatal; 			data->out.pos = 0; 		}--		/* If there's nothing to do, we're done. */-		if (!finishing && in.pos == in.size)-			return (ARCHIVE_OK);--		{-			const size_t zstdret = !finishing ?-			    ZSTD_compressStream(data->cstream, &data->out, &in)-			    : ZSTD_endStream(data->cstream, &data->out);--			if (ZSTD_isError(zstdret)) {-				archive_set_error(f->archive,-				    ARCHIVE_ERRNO_MISC,-				    "Zstd compression failed: %s",-				    ZSTD_getErrorName(zstdret));-				return (ARCHIVE_FATAL);-			}--			/* If we're finishing, 0 means nothing left to flush */-			if (finishing && zstdret == 0) {-				const int ret = __archive_write_filter(f->next_filter,-				    data->out.dst, data->out.pos);-				return (ret);-			}-		} 	}+zstd_fatal:+	archive_set_error(f->archive, ARCHIVE_ERRNO_MISC,+	    "Zstd compression failed: %s",+	    ZSTD_getErrorName(zstdret));+fatal:+	return (ARCHIVE_FATAL); } -#else /* HAVE_ZSTD_H && HAVE_LIBZSTD */+#else /* HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR */  static int archive_compressor_zstd_open(struct archive_write_filter *f)@@ -349,23 +420,19 @@ 	archive_strcpy(&as, "zstd --no-check");  	if (data->compression_level < CLEVEL_STD_MIN) {-		struct archive_string as2;-		archive_string_init(&as2);-		archive_string_sprintf(&as2, " --fast=%d", -data->compression_level);-		archive_string_concat(&as, &as2);-		archive_string_free(&as2);+		archive_string_sprintf(&as, " --fast=%d", -data->compression_level); 	} else {-		struct archive_string as2;-		archive_string_init(&as2);-		archive_string_sprintf(&as2, " -%d", data->compression_level);-		archive_string_concat(&as, &as2);-		archive_string_free(&as2);+		archive_string_sprintf(&as, " -%d", data->compression_level); 	}  	if (data->compression_level > CLEVEL_STD_MAX) { 		archive_strcat(&as, " --ultra"); 	} +	if (data->threads != 0) {+		archive_string_sprintf(&as, " --threads=%d", data->threads);+	}+ 	f->write = archive_compressor_zstd_write; 	r = __archive_write_program_open(f, data->pdata, as.s); 	archive_string_free(&as);@@ -382,6 +449,14 @@ }  static int+archive_compressor_zstd_flush(struct archive_write_filter *f)+{+	(void)f; /* UNUSED */++	return (ARCHIVE_OK);+}++static int archive_compressor_zstd_close(struct archive_write_filter *f) { 	struct private_data *data = (struct private_data *)f->data;@@ -389,4 +464,4 @@ 	return __archive_write_program_close(f, data->pdata); } -#endif /* HAVE_ZSTD_H && HAVE_LIBZSTD */+#endif /* HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR */
c/archive_write_disk_posix.c view
@@ -397,8 +397,7 @@ static struct fixup_entry *sort_dir_list(struct fixup_entry *p); static ssize_t	write_data_block(struct archive_write_disk *, 		    const char *, size_t);--static struct archive_vtable *archive_write_disk_vtable(void);+static void close_file_descriptor(struct archive_write_disk *);  static int	_archive_write_disk_close(struct archive *); static int	_archive_write_disk_free(struct archive *);@@ -516,7 +515,12 @@ 	 * XXX At this point, symlinks should not be hit, otherwise 	 * XXX a race occurred.  Do we want to check explicitly for that? 	 */-	if (lstat(a->name, &a->st) == 0) {+#ifdef HAVE_LSTAT+	if (lstat(a->name, &a->st) == 0)+#else+	if (la_stat(a->name, &a->st) == 0)+#endif+	{ 		a->pst = &a->st; 		return (ARCHIVE_OK); 	}@@ -524,25 +528,16 @@ 	return (ARCHIVE_WARN); } -static struct archive_vtable *-archive_write_disk_vtable(void)-{-	static struct archive_vtable av;-	static int inited = 0;--	if (!inited) {-		av.archive_close = _archive_write_disk_close;-		av.archive_filter_bytes = _archive_write_disk_filter_bytes;-		av.archive_free = _archive_write_disk_free;-		av.archive_write_header = _archive_write_disk_header;-		av.archive_write_finish_entry-		    = _archive_write_disk_finish_entry;-		av.archive_write_data = _archive_write_disk_data;-		av.archive_write_data_block = _archive_write_disk_data_block;-		inited = 1;-	}-	return (&av);-}+static const struct archive_vtable+archive_write_disk_vtable = {+	.archive_close = _archive_write_disk_close,+	.archive_filter_bytes = _archive_write_disk_filter_bytes,+	.archive_free = _archive_write_disk_free,+	.archive_write_header = _archive_write_disk_header,+	.archive_write_finish_entry = _archive_write_disk_finish_entry,+	.archive_write_data = _archive_write_disk_data,+	.archive_write_data_block = _archive_write_disk_data_block,+};  static int64_t _archive_write_disk_filter_bytes(struct archive *_a, int n)@@ -1616,12 +1611,12 @@ 			    "Seek failed"); 			return (ARCHIVE_FATAL); 		} else if (a->offset > a->fd_offset) {-			int64_t skip = a->offset - a->fd_offset;+			uint64_t skip = a->offset - a->fd_offset; 			char nullblock[1024];  			memset(nullblock, 0, sizeof(nullblock)); 			while (skip > 0) {-				if (skip > (int64_t)sizeof(nullblock))+				if (skip > sizeof(nullblock)) 					bytes_written = hfs_write_decmpfs_block( 					    a, nullblock, sizeof(nullblock)); 				else@@ -1736,8 +1731,10 @@ 			else 				r = hfs_write_data_block( 				    a, null_d, a->file_remaining_bytes);-			if (r < 0)+			if (r < 0) {+				close_file_descriptor(a); 				return ((int)r);+			} 		} #endif 	} else {@@ -1746,6 +1743,7 @@ 		    a->filesize == 0) { 			archive_set_error(&a->archive, errno, 			    "File size could not be restored");+			close_file_descriptor(a); 			return (ARCHIVE_FAILED); 		} #endif@@ -1755,8 +1753,10 @@ 		 * to see what happened. 		 */ 		a->pst = NULL;-		if ((ret = lazy_stat(a)) != ARCHIVE_OK)-			return (ret);+        if ((ret = lazy_stat(a)) != ARCHIVE_OK) {+            close_file_descriptor(a);+            return (ret);+        } 		/* We can use lseek()/write() to extend the file if 		 * ftruncate didn't work or isn't available. */ 		if (a->st.st_size < a->filesize) {@@ -1764,11 +1764,13 @@ 			if (lseek(a->fd, a->filesize - 1, SEEK_SET) < 0) { 				archive_set_error(&a->archive, errno, 				    "Seek failed");+				close_file_descriptor(a); 				return (ARCHIVE_FATAL); 			} 			if (write(a->fd, &nul, 1) < 0) { 				archive_set_error(&a->archive, errno, 				    "Write to restore size failed");+				close_file_descriptor(a); 				return (ARCHIVE_FATAL); 			} 			a->pst = NULL;@@ -1996,7 +1998,7 @@ 	a->archive.magic = ARCHIVE_WRITE_DISK_MAGIC; 	/* We're ready to write a header immediately. */ 	a->archive.state = ARCHIVE_STATE_HEADER;-	a->archive.vtable = archive_write_disk_vtable();+	a->archive.vtable = &archive_write_disk_vtable; 	a->start_time = time(NULL); 	/* Query and restore the umask. */ 	umask(a->user_umask = umask(0));@@ -2007,6 +2009,8 @@ 		free(a); 		return (NULL); 	}+	a->path_safe.s[0] = 0;+ #ifdef HAVE_ZLIB_H 	a->decmpfs_compression_level = 5; #endif@@ -2163,7 +2167,11 @@ 		 * then don't follow it. 		 */ 		if (r != 0 || !S_ISDIR(a->mode))+#ifdef HAVE_LSTAT 			r = lstat(a->name, &a->st);+#else+			r = la_stat(a->name, &a->st);+#endif 		if (r != 0) { 			archive_set_error(&a->archive, errno, 			    "Can't stat existing object");@@ -2559,7 +2567,12 @@ 					goto skip_fixup_entry; 				} else #endif-				if (lstat(p->name, &st) != 0 ||+				if (+#ifdef HAVE_LSTAT+					lstat(p->name, &st) != 0 ||+#else+					la_stat(p->name, &st) != 0 ||+#endif 				    la_verify_filetype(st.st_mode, 				    p->filetype) == 0) { 					goto skip_fixup_entry;@@ -2574,7 +2587,12 @@ 				goto skip_fixup_entry; 			} else #endif-			if (lstat(p->name, &st) != 0 ||+			if (+#ifdef HAVE_LSTAT+				lstat(p->name, &st) != 0 ||+#else+				la_stat(p->name, &st) != 0 ||+#endif 			    la_verify_filetype(st.st_mode, 			    p->filetype) == 0) { 				goto skip_fixup_entry;@@ -2794,8 +2812,8 @@     !(defined(HAVE_OPENAT) && defined(HAVE_FSTATAT) && defined(HAVE_UNLINKAT)) 	/* Platform doesn't have lstat, so we can't look for symlinks. */ 	(void)path; /* UNUSED */-	(void)error_number; /* UNUSED */-	(void)error_string; /* UNUSED */+	(void)a_eno; /* UNUSED */+	(void)a_estr; /* UNUSED */ 	(void)flags; /* UNUSED */ 	(void)checking_linkname; /* UNUSED */ 	return (ARCHIVE_OK);@@ -2804,7 +2822,7 @@ 	char *tail; 	char *head; 	int last;-	char c;+	char c = '\0'; 	int r; 	struct stat st; 	int chdir_fd;@@ -2868,8 +2886,10 @@ 		/* Check that we haven't hit a symlink. */ #if defined(HAVE_OPENAT) && defined(HAVE_FSTATAT) && defined(HAVE_UNLINKAT) 		r = fstatat(chdir_fd, head, &st, AT_SYMLINK_NOFOLLOW);-#else+#elif defined(HAVE_LSTAT) 		r = lstat(head, &st);+#else+		r = la_stat(head, &st); #endif 		if (r != 0) { 			tail[0] = c;@@ -3567,7 +3587,9 @@ 	(void)fd; /* UNUSED */ 	(void)mode; /* UNUSED */ 	(void)name; /* UNUSED */+	(void)atime; /* UNUSED */ 	(void)atime_nsec; /* UNUSED */+	(void)mtime; /* UNUSED */ 	(void)mtime_nsec; /* UNUSED */ 	return (ARCHIVE_WARN); #endif@@ -4400,7 +4422,12 @@ 	 */ 	archive_strncpy(&datafork, pathname, p - pathname); 	archive_strcat(&datafork, p + 2);-	if (lstat(datafork.s, &st) == -1 ||+	if (+#ifdef HAVE_LSTAT+		lstat(datafork.s, &st) == -1 ||+#else+		la_stat(datafork.s, &st) == -1 ||+#endif 	    (st.st_mode & AE_IFMT) != AE_IFREG) 		goto skip_appledouble; @@ -4715,6 +4742,18 @@ 	return (ARCHIVE_OK); } #endif++/*+ * Close the file descriptor if one is open.+ */+static void close_file_descriptor(struct archive_write_disk* a)+{+	if (a->fd >= 0) {+		close(a->fd);+		a->fd = -1;+	}+}+  #endif /* !_WIN32 || __CYGWIN__ */ 
c/archive_write_disk_windows.c view
@@ -213,7 +213,7 @@ static int	create_filesystem_object(struct archive_write_disk *); static struct fixup_entry *current_fixup(struct archive_write_disk *, 		    const wchar_t *pathname);-static int	cleanup_pathname(struct archive_write_disk *);+static int	cleanup_pathname(struct archive_write_disk *, wchar_t *); static int	create_dir(struct archive_write_disk *, wchar_t *); static int	create_parent_dir(struct archive_write_disk *, wchar_t *); static int	la_chmod(const wchar_t *, mode_t);@@ -238,8 +238,6 @@ static ssize_t	write_data_block(struct archive_write_disk *, 		    const char *, size_t); -static struct archive_vtable *archive_write_disk_vtable(void);- static int	_archive_write_disk_close(struct archive *); static int	_archive_write_disk_free(struct archive *); static int	_archive_write_disk_header(struct archive *,@@ -256,9 +254,9 @@  * which is high-16-bits of nFileIndexHigh. */ #define bhfi_ino(bhfi)	\ 	((((int64_t)((bhfi)->nFileIndexHigh & 0x0000FFFFUL)) << 32) \-    + (bhfi)->nFileIndexLow)+    | (bhfi)->nFileIndexLow) #define bhfi_size(bhfi)	\-    ((((int64_t)(bhfi)->nFileSizeHigh) << 32) + (bhfi)->nFileSizeLow)+    ((((int64_t)(bhfi)->nFileSizeHigh) << 32) | (bhfi)->nFileSizeLow)  static int file_information(struct archive_write_disk *a, wchar_t *path,@@ -268,6 +266,9 @@ 	int r; 	DWORD flag = FILE_FLAG_BACKUP_SEMANTICS; 	WIN32_FIND_DATAW	findData;+# if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+	CREATEFILE2_EXTENDED_PARAMETERS createExParams;+#endif  	if (sim_lstat || mode != NULL) { 		h = FindFirstFileW(path, &findData);@@ -292,14 +293,27 @@ 		(findData.dwReserved0 == IO_REPARSE_TAG_SYMLINK))) 		flag |= FILE_FLAG_OPEN_REPARSE_POINT; +# if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+	ZeroMemory(&createExParams, sizeof(createExParams));+	createExParams.dwSize = sizeof(createExParams);+	createExParams.dwFileFlags = flag;+	h = CreateFile2(a->name, 0, 0,+		OPEN_EXISTING, &createExParams);+#else 	h = CreateFileW(a->name, 0, 0, NULL, 	    OPEN_EXISTING, flag, NULL);+#endif 	if (h == INVALID_HANDLE_VALUE && 	    GetLastError() == ERROR_INVALID_NAME) { 		wchar_t *full; 		full = __la_win_permissive_name_w(path);+# if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+		h = CreateFile2(full, 0, 0,+			OPEN_EXISTING, &createExParams);+#else 		h = CreateFileW(full, 0, 0, NULL, 		    OPEN_EXISTING, flag, NULL);+#endif 		free(full); 	} 	if (h == INVALID_HANDLE_VALUE) {@@ -561,6 +575,7 @@ 	return (fd); } +#if _WIN32_WINNT < _WIN32_WINNT_VISTA static void * la_GetFunctionKernel32(const char *name) {@@ -576,18 +591,24 @@ 	} 	return (void *)GetProcAddress(lib, name); }+#endif  static int la_CreateHardLinkW(wchar_t *linkname, wchar_t *target) {-	static BOOLEAN (WINAPI *f)(LPWSTR, LPWSTR, LPSECURITY_ATTRIBUTES);-	static int set;+	static BOOL (WINAPI *f)(LPCWSTR, LPCWSTR, LPSECURITY_ATTRIBUTES); 	BOOL ret; +#if _WIN32_WINNT < _WIN32_WINNT_XP+	static int set;+/* CreateHardLinkW is available since XP and always loaded */ 	if (!set) { 		set = 1; 		f = la_GetFunctionKernel32("CreateHardLinkW"); 	}+#else+	f = CreateHardLinkW;+#endif 	if (!f) { 		errno = ENOTSUP; 		return (0);@@ -626,18 +647,27 @@ la_CreateSymbolicLinkW(const wchar_t *linkname, const wchar_t *target,     int linktype) { 	static BOOLEAN (WINAPI *f)(LPCWSTR, LPCWSTR, DWORD);-	static int set; 	wchar_t *ttarget, *p;-	int len;+	size_t len; 	DWORD attrs = 0; 	DWORD flags = 0; 	DWORD newflags = 0; 	BOOL ret = 0; +#if _WIN32_WINNT < _WIN32_WINNT_VISTA+/* CreateSymbolicLinkW is available since Vista and always loaded */+	static int set; 	if (!set) { 		set = 1; 		f = la_GetFunctionKernel32("CreateSymbolicLinkW"); 	}+#else+# if !defined(WINAPI_FAMILY_PARTITION) || WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)+	f = CreateSymbolicLinkW;+# else+	f = NULL;+# endif+#endif 	if (!f) 		return (0); @@ -759,25 +789,16 @@ 	return (ARCHIVE_WARN); } -static struct archive_vtable *-archive_write_disk_vtable(void)-{-	static struct archive_vtable av;-	static int inited = 0;--	if (!inited) {-		av.archive_close = _archive_write_disk_close;-		av.archive_filter_bytes = _archive_write_disk_filter_bytes;-		av.archive_free = _archive_write_disk_free;-		av.archive_write_header = _archive_write_disk_header;-		av.archive_write_finish_entry-		    = _archive_write_disk_finish_entry;-		av.archive_write_data = _archive_write_disk_data;-		av.archive_write_data_block = _archive_write_disk_data_block;-		inited = 1;-	}-	return (&av);-}+static const struct archive_vtable+archive_write_disk_vtable = {+	.archive_close = _archive_write_disk_close,+	.archive_filter_bytes = _archive_write_disk_filter_bytes,+	.archive_free = _archive_write_disk_free,+	.archive_write_header = _archive_write_disk_header,+	.archive_write_finish_entry = _archive_write_disk_finish_entry,+	.archive_write_data = _archive_write_disk_data,+	.archive_write_data_block = _archive_write_disk_data_block,+};  static int64_t _archive_write_disk_filter_bytes(struct archive *_a, int n)@@ -854,7 +875,7 @@ 	 * dir restores; the dir restore logic otherwise gets messed 	 * up by nonsense like "dir/.". 	 */-	ret = cleanup_pathname(a);+	ret = cleanup_pathname(a, a->name); 	if (ret != ARCHIVE_OK) 		return (ret); @@ -1196,6 +1217,8 @@ 		if (la_ftruncate(a->fh, a->filesize) == -1) { 			archive_set_error(&a->archive, errno, 			    "File size could not be restored");+			CloseHandle(a->fh);+			a->fh = INVALID_HANDLE_VALUE; 			return (ARCHIVE_FAILED); 		} 	}@@ -1373,7 +1396,7 @@ 	a->archive.magic = ARCHIVE_WRITE_DISK_MAGIC; 	/* We're ready to write a header immediately. */ 	a->archive.state = ARCHIVE_STATE_HEADER;-	a->archive.vtable = archive_write_disk_vtable();+	a->archive.vtable = &archive_write_disk_vtable; 	a->start_time = time(NULL); 	/* Query and restore the umask. */ 	umask(a->user_umask = umask(0));@@ -1381,6 +1404,7 @@ 		free(a); 		return (NULL); 	}+	a->path_safe.s[0] = 0; 	return (&a->archive); } @@ -1666,14 +1690,30 @@ 	mode_t final_mode, mode; 	int r; 	DWORD attrs = 0;+# if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+		CREATEFILE2_EXTENDED_PARAMETERS createExParams;+#endif  	/* We identify hard/symlinks according to the link names. */ 	/* Since link(2) and symlink(2) don't handle modes, we're done here. */ 	linkname = archive_entry_hardlink_w(a->entry); 	if (linkname != NULL) {-		wchar_t *linkfull, *namefull;--		linkfull = __la_win_permissive_name_w(linkname);+		wchar_t *linksanitized, *linkfull, *namefull;+		size_t l = (wcslen(linkname) + 1) * sizeof(wchar_t);+		linksanitized = malloc(l);+		if (linksanitized == NULL) {+			archive_set_error(&a->archive, ENOMEM,+			    "Can't allocate memory for hardlink target");+			return (-1);+		}+		memcpy(linksanitized, linkname, l);+		r = cleanup_pathname(a, linksanitized);+		if (r != ARCHIVE_OK) {+			free(linksanitized);+			return (r);+		}+		linkfull = __la_win_permissive_name_w(linksanitized);+		free(linksanitized); 		namefull = __la_win_permissive_name_w(a->name); 		if (linkfull == NULL || namefull == NULL) { 			errno = EINVAL;@@ -1716,8 +1756,16 @@ 			a->todo = 0; 			a->deferred = 0; 		} else if (r == 0 && a->filesize > 0) {+# if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+			ZeroMemory(&createExParams, sizeof(createExParams));+			createExParams.dwSize = sizeof(createExParams);+			createExParams.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;+			a->fh = CreateFile2(namefull, GENERIC_WRITE, 0,+			    TRUNCATE_EXISTING, &createExParams);+#else 			a->fh = CreateFileW(namefull, GENERIC_WRITE, 0, NULL, 			    TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);+#endif 			if (a->fh == INVALID_HANDLE_VALUE) { 				la_dosmaperr(GetLastError()); 				r = errno;@@ -1780,14 +1828,27 @@ 		a->tmpname = NULL; 		fullname = a->name; 		/* O_WRONLY | O_CREAT | O_EXCL */+# if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+		ZeroMemory(&createExParams, sizeof(createExParams));+		createExParams.dwSize = sizeof(createExParams);+		createExParams.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;+		a->fh = CreateFile2(fullname, GENERIC_WRITE, 0,+		    CREATE_NEW, &createExParams);+#else 		a->fh = CreateFileW(fullname, GENERIC_WRITE, 0, NULL, 		    CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);+#endif 		if (a->fh == INVALID_HANDLE_VALUE && 		    GetLastError() == ERROR_INVALID_NAME && 		    fullname == a->name) { 			fullname = __la_win_permissive_name_w(a->name);+# if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+			a->fh = CreateFile2(fullname, GENERIC_WRITE, 0,+			    CREATE_NEW, &createExParams);+#else 			a->fh = CreateFileW(fullname, GENERIC_WRITE, 0, NULL, 			    CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);+#endif 		} 		if (a->fh == INVALID_HANDLE_VALUE) { 			if (GetLastError() == ERROR_ACCESS_DENIED) {@@ -2152,6 +2213,8 @@ 				return (ARCHIVE_FAILED); 			} 		}+		if (!c)+			break; 		pn[0] = c; 		pn++; 	}@@ -2184,12 +2247,12 @@  * set) any '..' in the path.  */ static int-cleanup_pathname(struct archive_write_disk *a)+cleanup_pathname(struct archive_write_disk *a, wchar_t *name) { 	wchar_t *dest, *src, *p, *top; 	wchar_t separator = L'\0'; -	p = a->name;+	p = name; 	if (*p == L'\0') { 		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, 		    "Invalid empty pathname");@@ -2201,7 +2264,7 @@ 		if (*p == L'/') 			*p = L'\\'; 	}-	p = a->name;+	p = name;  	/* Skip leading "\\.\" or "\\?\" or "\\?\UNC\" or 	 * "\\?\Volume{GUID}\"@@ -2256,6 +2319,9 @@ 			return (ARCHIVE_FAILED); 		} else 			p += 4;+    /* Network drive path like "\\<server-name>\<share-name>\file" */+    } else if (p[0] == L'\\' && p[1] == L'\\') {+        p += 2; 	}  	/* Skip leading drive letter from archives created@@ -2543,14 +2609,25 @@ 		hw = NULL; 	} else { 		wchar_t *ws;+# if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+		CREATEFILE2_EXTENDED_PARAMETERS createExParams;+#endif  		if (S_ISLNK(mode)) 			return (ARCHIVE_OK); 		ws = __la_win_permissive_name_w(name); 		if (ws == NULL) 			goto settimes_failed;+# if _WIN32_WINNT >= 0x0602 /* _WIN32_WINNT_WIN8 */+		ZeroMemory(&createExParams, sizeof(createExParams));+		createExParams.dwSize = sizeof(createExParams);+		createExParams.dwFileFlags = FILE_FLAG_BACKUP_SEMANTICS;+		hw = CreateFile2(ws, FILE_WRITE_ATTRIBUTES, 0,+		    OPEN_EXISTING, &createExParams);+#else 		hw = CreateFileW(ws, FILE_WRITE_ATTRIBUTES, 		    0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);+#endif 		free(ws); 		if (hw == INVALID_HANDLE_VALUE) 			goto settimes_failed;
c/archive_write_private.h view
@@ -53,6 +53,7 @@ 	    const char *key, const char *value); 	int	(*open)(struct archive_write_filter *); 	int	(*write)(struct archive_write_filter *, const void *, size_t);+	int	(*flush)(struct archive_write_filter *); 	int	(*close)(struct archive_write_filter *); 	int	(*free)(struct archive_write_filter *); 	void	 *data;
c/archive_write_set_format_7zip.c view
@@ -165,7 +165,7 @@ 	mode_t			 mode; 	uint32_t		 crc32; -	signed int		 dir:1;+	unsigned		 dir:1; };  struct _7zip {@@ -1809,11 +1809,11 @@ 	 * of ugly hackery to convert a const * pointer to 	 * a non-const pointer. */ 	strm->next_in = (char *)(uintptr_t)(const void *)lastrm->next_in;-	strm->avail_in = lastrm->avail_in;+	strm->avail_in = (uint32_t)lastrm->avail_in; 	strm->total_in_lo32 = (uint32_t)(lastrm->total_in & 0xffffffff); 	strm->total_in_hi32 = (uint32_t)(lastrm->total_in >> 32); 	strm->next_out = (char *)lastrm->next_out;-	strm->avail_out = lastrm->avail_out;+	strm->avail_out = (uint32_t)lastrm->avail_out; 	strm->total_out_lo32 = (uint32_t)(lastrm->total_out & 0xffffffff); 	strm->total_out_hi32 = (uint32_t)(lastrm->total_out >> 32); 	if (BZ2_bzCompressInit(strm, level, 0, 30) != BZ_OK) {@@ -1842,11 +1842,11 @@ 	 * of ugly hackery to convert a const * pointer to 	 * a non-const pointer. */ 	strm->next_in = (char *)(uintptr_t)(const void *)lastrm->next_in;-	strm->avail_in = lastrm->avail_in;+	strm->avail_in = (uint32_t)lastrm->avail_in; 	strm->total_in_lo32 = (uint32_t)(lastrm->total_in & 0xffffffff); 	strm->total_in_hi32 = (uint32_t)(lastrm->total_in >> 32); 	strm->next_out = (char *)lastrm->next_out;-	strm->avail_out = lastrm->avail_out;+	strm->avail_out = (uint32_t)lastrm->avail_out; 	strm->total_out_lo32 = (uint32_t)(lastrm->total_out & 0xffffffff); 	strm->total_out_hi32 = (uint32_t)(lastrm->total_out >> 32); 	r = BZ2_bzCompress(strm,
c/archive_write_set_format_cpio.c view
@@ -1,3 +1,4 @@+#include "archive_platform.h" #include "archive.h"  /*
c/archive_write_set_format_cpio_binary.c view
@@ -124,7 +124,7 @@  * ...but it feels a little better to do it like this:  */ -static uint16_t swap16(uint16_t in) {+static uint16_t la_swap16(uint16_t in) { 	union { 		uint16_t s[2]; 		uint8_t c[4];@@ -141,7 +141,7 @@ 	/* NOTREACHED */ } -static uint32_t swap32(uint32_t in) {+static uint32_t la_swap32(uint32_t in) { 	union { 		uint32_t l; 		uint16_t s[2];@@ -156,8 +156,8 @@ 		U.s[1] = t; 	} else if (U.c[3]) {	/* Big-endian */ 		U.l = in;-		U.s[0] = swap16(U.s[0]);-		U.s[1] = swap16(U.s[1]);+		U.s[0] = la_swap16(U.s[0]);+		U.s[1] = la_swap16(U.s[1]); 	} else {		/* PDP-endian */ 		U.l = in; 	}@@ -426,8 +426,8 @@ 	/* Include trailing null */ 	pathlength = (int)len + 1; -	h.h_magic = swap16(070707);-	h.h_dev = swap16(archive_entry_dev(entry));+	h.h_magic = la_swap16(070707);+	h.h_dev = la_swap16(archive_entry_dev(entry));  	ino = synthesize_ino_value(cpio, entry); 	if (ino < 0) {@@ -441,7 +441,7 @@ 		ret_final = ARCHIVE_FATAL; 		goto exit_write_header; 	}-	h.h_ino = swap16(ino);+	h.h_ino = la_swap16((uint16_t)ino);  	h.h_mode = archive_entry_mode(entry); 	if (((h.h_mode & AE_IFMT) == AE_IFSOCK) || ((h.h_mode & AE_IFMT) == AE_IFIFO)) {@@ -460,20 +460,20 @@ 		/* we could turn off AE_IFREG here, but it does no harm, */ 		/* and allows v7 cpio to read the entry without confusion */ 	}-	h.h_mode = swap16(h.h_mode);+	h.h_mode = la_swap16(h.h_mode); -	h.h_uid = swap16(archive_entry_uid(entry));-	h.h_gid = swap16(archive_entry_gid(entry));-	h.h_nlink = swap16(archive_entry_nlink(entry));+	h.h_uid = la_swap16((uint16_t)archive_entry_uid(entry));+	h.h_gid = la_swap16((uint16_t)archive_entry_gid(entry));+	h.h_nlink = la_swap16((uint16_t)archive_entry_nlink(entry));  	if (archive_entry_filetype(entry) == AE_IFBLK 	    || archive_entry_filetype(entry) == AE_IFCHR)-		h.h_majmin = swap16(archive_entry_rdev(entry));+		h.h_majmin = la_swap16(archive_entry_rdev(entry)); 	else 		h.h_majmin = 0; -	h.h_mtime = swap32(archive_entry_mtime(entry));-	h.h_namesize = swap16(pathlength);+	h.h_mtime = la_swap32((uint32_t)archive_entry_mtime(entry));+	h.h_namesize = la_swap16(pathlength);  	/* Non-regular files don't store bodies. */ 	if (archive_entry_filetype(entry) != AE_IFREG)@@ -502,7 +502,7 @@ 			ret_final = ARCHIVE_FATAL; 			goto exit_write_header; 		}-		h.h_filesize = swap32(strlen(p)); /* symlink */+		h.h_filesize = la_swap32((uint32_t)strlen(p)); /* symlink */ 	} else { 		if ((a->archive.archive_format == ARCHIVE_FORMAT_CPIO_PWB) && 		    (archive_entry_size(entry) > 256*256*256-1)) {@@ -516,7 +516,7 @@ 			ret_final = ARCHIVE_FAILED; 			goto exit_write_header; 		}-		h.h_filesize = swap32(archive_entry_size(entry)); /* file */+		h.h_filesize = la_swap32((uint32_t)archive_entry_size(entry)); /* file */ 	}  	ret = __archive_write_output(a, &h, HSIZE);
c/archive_write_set_format_iso9660.c view
@@ -289,12 +289,12 @@ 		struct extr_rec	*current; 	}			 extr_rec_list; -	signed int		 virtual:1;+	unsigned int		 virtual:1; 	/* If set to one, this file type is a directory. 	 * A convenience flag to be used as 	 * "archive_entry_filetype(isoent->file->entry) == AE_IFDIR". 	 */-	signed int		 dir:1;+	unsigned int		 dir:1; };  struct hardlink {@@ -652,7 +652,7 @@ #define VOLUME_IDENTIFIER_SIZE		32  	/*-	 * Usage  : !zisofs [DEFAULT] +	 * Usage  : !zisofs [DEFAULT] 	 *        :    Disable to generate RRIP 'ZF' extension. 	 *        : zisofs 	 *        :    Make files zisofs file and generate RRIP 'ZF'@@ -689,7 +689,7 @@ 	uint64_t		 bytes_remaining; 	int			 need_multi_extent; -	/* Temporary string buffer for Joliet extension. */ +	/* Temporary string buffer for Joliet extension. */ 	struct archive_string	 utf16be; 	struct archive_string	 mbs; @@ -755,9 +755,9 @@  	/* Used for making zisofs. */ 	struct {-		signed int	 detect_magic:1;-		signed int	 making:1;-		signed int	 allzero:1;+		unsigned int	 detect_magic:1;+		unsigned int	 making:1;+		unsigned int	 allzero:1; 		unsigned char	 magic_buffer[64]; 		int		 magic_cnt; @@ -2521,12 +2521,11 @@ static void get_tmfromtime(struct tm *tm, time_t *t) {-#if HAVE_LOCALTIME_R+#if HAVE_LOCALTIME_S+	localtime_s(tm, t);+#elif HAVE_LOCALTIME_R 	tzset(); 	localtime_r(t, tm);-#elif HAVE__LOCALTIME64_S-	__time64_t tmp_t = (__time64_t) *t; //time_t may be shorter than 64 bits-	_localtime64_s(tm, &tmp_t); #else 	memcpy(tm, localtime(t), sizeof(*tm)); #endif@@ -4074,11 +4073,8 @@ 	} 	memset(info.s, 0, info_size); 	opt = 0;-#if defined(HAVE__CTIME64_S)-	{-		__time64_t iso9660_birth_time_tmp = (__time64_t) iso9660->birth_time; //time_t may be shorter than 64 bits-		_ctime64_s(buf, sizeof(buf), &(iso9660_birth_time_tmp));-	}+#if defined(HAVE_CTIME_S)+	ctime_s(buf, sizeof(buf), &(iso9660->birth_time)); #elif defined(HAVE_CTIME_R) 	ctime_r(&(iso9660->birth_time), buf); #else@@ -6802,6 +6798,7 @@  * This comparing rule is according to ISO9660 Standard 6.9.1  */ static int+__LA_LIBC_CC _compare_path_table(const void *v1, const void *v2) { 	const struct isoent *p1, *p2;@@ -6844,6 +6841,7 @@ }  static int+__LA_LIBC_CC _compare_path_table_joliet(const void *v1, const void *v2) { 	const struct isoent *p1, *p2;@@ -7800,8 +7798,8 @@ 	uint64_t	 pz_uncompressed_size; 	size_t		 uncompressed_buffer_size; -	signed int	 initialized:1;-	signed int	 header_passed:1;+	unsigned int	 initialized:1;+	unsigned int	 header_passed:1;  	uint32_t	 pz_offset; 	unsigned char	*block_pointers;
c/archive_write_set_format_pax.c view
@@ -100,6 +100,7 @@ static void		 sparse_list_clear(struct pax *); static int		 sparse_list_add(struct pax *, int64_t, int64_t); static char		*url_encode(const char *in);+static time_t		 get_ustar_max_mtime(void);  /*  * Set output format to 'restricted pax' format.@@ -595,6 +596,8 @@ 	need_extension = 0; 	pax = (struct pax *)a->format_data; +	const time_t ustar_max_mtime = get_ustar_max_mtime();+ 	/* Sanity check. */ 	if (archive_entry_pathname(entry_original) == NULL) { 		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,@@ -1028,10 +1031,8 @@ 	archive_string_init(&entry_name); 	archive_strcpy(&entry_name, archive_entry_pathname(entry_main)); -	/* If file size is too large, add 'size' to pax extended attrs. */+	/* If file size is too large, we need pax extended attrs. */ 	if (archive_entry_size(entry_main) >= (((int64_t)1) << 33)) {-		add_pax_attr_int(&(pax->pax_header), "size",-		    archive_entry_size(entry_main)); 		need_extension = 1; 	} @@ -1118,16 +1119,13 @@ 	}  	/*-	 * Technically, the mtime field in the ustar header can-	 * support 33 bits, but many platforms use signed 32-bit time-	 * values.  The cutoff of 0x7fffffff here is a compromise. 	 * Yes, this check is duplicated just below; this helps to 	 * avoid writing an mtime attribute just to handle a 	 * high-resolution timestamp in "restricted pax" mode. 	 */ 	if (!need_extension && 	    ((archive_entry_mtime(entry_main) < 0)-		|| (archive_entry_mtime(entry_main) >= 0x7fffffff)))+		|| (archive_entry_mtime(entry_main) >= ustar_max_mtime))) 		need_extension = 1;  	/* I use a star-compatible file flag attribute. */@@ -1192,7 +1190,7 @@ 	if (a->archive.archive_format != ARCHIVE_FORMAT_TAR_PAX_RESTRICTED || 	    need_extension) { 		if (archive_entry_mtime(entry_main) < 0  ||-		    archive_entry_mtime(entry_main) >= 0x7fffffff  ||+		    archive_entry_mtime(entry_main) >= ustar_max_mtime  || 		    archive_entry_mtime_nsec(entry_main) != 0) 			add_pax_attr_time(&(pax->pax_header), "mtime", 			    archive_entry_mtime(entry_main),@@ -1347,6 +1345,12 @@ 		    mapsize + pax->sparse_map_padding + sparse_total); 	} +	/* If file size is too large, add 'size' to pax extended attrs. */+	if (archive_entry_size(entry_main) >= (((int64_t)1) << 33)) {+		add_pax_attr_int(&(pax->pax_header), "size",+		    archive_entry_size(entry_main));+	}+ 	/* Format 'ustar' header for main entry. 	 * 	 * The trouble with file size: If the reader can't understand@@ -1424,7 +1428,7 @@ 		/* Copy mtime, but clip to ustar limits. */ 		s = archive_entry_mtime(entry_main); 		if (s < 0) { s = 0; }-		if (s >= 0x7fffffff) { s = 0x7fffffff; }+		if (s > ustar_max_mtime) { s = ustar_max_mtime; } 		archive_entry_set_mtime(pax_attr_entry, s, 0);  		/* Standard ustar doesn't support atime. */@@ -1713,7 +1717,7 @@ 	 * to having clients override it. 	 */ #if HAVE_GETPID && 0  /* Disable this for now; see above comment. */-	sprintf(buff, "PaxHeader.%d", getpid());+	snprintf(buff, sizeof(buff), "PaxHeader.%d", getpid()); #else 	/* If the platform can't fetch the pid, don't include it. */ 	strcpy(buff, "PaxHeader");@@ -2042,3 +2046,18 @@ 	return (_sparse_list_add_block(pax, offset, length, 0)); } +static time_t+get_ustar_max_mtime(void)+{+	/*+	 * Technically, the mtime field in the ustar header can+	 * support 33 bits. We are using all of them to keep+	 * tar/test/test_option_C_mtree.c simple and passing after 2038.+	 * For platforms that use signed 32-bit time values we+	 * use the 32-bit maximum.+	 */+	if (sizeof(time_t) > sizeof(int32_t))+		return (time_t)0x1ffffffff;+	else+		return (time_t)0x7fffffff;+}
c/archive_write_set_format_warc.c view
@@ -329,30 +329,21 @@ { /** like strftime(3) but for time_t objects */ 	struct tm *rt;-#if defined(HAVE_GMTIME_R) || defined(HAVE__GMTIME64_S)+#if defined(HAVE_GMTIME_R) || defined(HAVE_GMTIME_S) 	struct tm timeHere; #endif-#if defined(HAVE__GMTIME64_S)-	errno_t terr;-	__time64_t tmptime;-#endif 	char strtime[100]; 	size_t len; -#ifdef HAVE_GMTIME_R-	if ((rt = gmtime_r(&t, &timeHere)) == NULL)-		return;-#elif defined(HAVE__GMTIME64_S)-	tmptime = t;-	terr = _gmtime64_s(&timeHere, &tmptime);-	if (terr)-		rt = NULL;-	else-		rt = &timeHere;+#if defined(HAVE_GMTIME_S)+	rt = gmtime_s(&timeHere, &t) ? NULL : &timeHere;+#elif defined(HAVE_GMTIME_R)+	rt = gmtime_r(&t, &timeHere); #else-	if ((rt = gmtime(&t)) == NULL)-		return;+	rt = gmtime(&t); #endif+	if (!rt)+		return; 	/* leave the hard yacker to our role model strftime() */ 	len = strftime(strtime, sizeof(strtime)-1, fmt, rt); 	archive_strncat(as, strtime, len);
c/archive_write_set_format_xar.c view
@@ -212,8 +212,8 @@ 	struct heap_data	 data;         struct archive_string    script; -	signed int		 virtual:1;-	signed int		 dir:1;+	unsigned int		 virtual:1;+	unsigned int		 dir:1; };  struct hardlink {@@ -906,15 +906,11 @@ { 	char timestr[100]; 	struct tm tm;-#if defined(HAVE__GMTIME64_S)-	__time64_t tmptime;-#endif -#if defined(HAVE_GMTIME_R)+#if defined(HAVE_GMTIME_S)+	gmtime_s(&tm, &t);+#elif defined(HAVE_GMTIME_R) 	gmtime_r(&t, &tm);-#elif defined(HAVE__GMTIME64_S)-	tmptime = t;-	_gmtime64_s(&tm, &tmptime); #else 	memcpy(&tm, gmtime(&t), sizeof(tm)); #endif
c/archive_write_set_format_zip.c view
@@ -740,12 +740,16 @@ 		/* We may know the size, but never the CRC. */ 		zip->entry_flags |= ZIP_ENTRY_FLAG_LENGTH_AT_END; 	} else {-		/* We don't know the size.  In this case, we prefer-		 * deflate (it has a clear end-of-data marker which-		 * makes length-at-end more reliable) and will-		 * enable Zip64 extensions unless we're told not to.+		/* We don't know the size. Use the default+		 * compression unless specified otherwise.+		 * We enable Zip64 extensions unless we're told not to. 		 */-		zip->entry_compression = COMPRESSION_DEFAULT;++		zip->entry_compression = zip->requested_compression;+		if(zip->entry_compression == COMPRESSION_UNSPECIFIED){+			zip->entry_compression = COMPRESSION_DEFAULT;+		}+ 		zip->entry_flags |= ZIP_ENTRY_FLAG_LENGTH_AT_END; 		if ((zip->flags & ZIP_FLAG_AVOID_ZIP64) == 0) { 			zip->entry_uses_zip64 = 1;@@ -1378,25 +1382,14 @@ { 	struct tm *t; 	unsigned int dt;-#if defined(HAVE_LOCALTIME_R) || defined(HAVE__LOCALTIME64_S)+#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S) 	struct tm tmbuf; #endif-#if defined(HAVE__LOCALTIME64_S)-	errno_t terr;-	__time64_t tmptime;-#endif -	/* This will not preserve time when creating/extracting the archive-	 * on two systems with different time zones. */-#if defined(HAVE_LOCALTIME_R)+#if defined(HAVE_LOCALTIME_S)+	t = localtime_s(&tmbuf, &unix_time) ? NULL : &tmbuf;+#elif defined(HAVE_LOCALTIME_R) 	t = localtime_r(&unix_time, &tmbuf);-#elif defined(HAVE__LOCALTIME64_S)-	tmptime = unix_time;-	terr = _localtime64_s(&tmbuf, &tmptime);-	if (terr)-		t = NULL;-	else-		t = &tmbuf; #else 	t = localtime(&unix_time); #endif
c/autoconf-darwin/config.h view
@@ -170,13 +170,13 @@ /* #undef ARCHIVE_XATTR_LINUX */  /* Version number of bsdcat */-#define BSDCAT_VERSION_STRING "3.5.3"+#define BSDCAT_VERSION_STRING "3.7.1"  /* Version number of bsdcpio */-#define BSDCPIO_VERSION_STRING "3.5.3"+#define BSDCPIO_VERSION_STRING "3.7.1"  /* Version number of bsdtar */-#define BSDTAR_VERSION_STRING "3.5.3"+#define BSDTAR_VERSION_STRING "3.7.1"  /* Define to 1 if the system has the type `ace_t'. */ /* #undef HAVE_ACE_T */@@ -316,6 +316,9 @@ /* Define to 1 if you have the `chroot' function. */ #define HAVE_CHROOT 1 +/* cmtime_s function */+/* #undef HAVE_CMTIME_S */+ /* Define to 1 if you have the <copyfile.h> header file. */ #define HAVE_COPYFILE_H 1 @@ -515,6 +518,12 @@ /* Define to 1 if you have the `flistxattr' function. */ /* #undef HAVE_FLISTXATTR */ +/* Define to 1 if you have the `fnmatch' function. */+#define HAVE_FNMATCH 1++/* Define to 1 if you have the <fnmatch.h> header file. */+#define HAVE_FNMATCH_H 1+ /* Define to 1 if you have the `fork' function. */ #define HAVE_FORK 1 @@ -563,6 +572,12 @@ /* Define to 1 if you have the `getgrnam_r' function. */ #define HAVE_GETGRNAM_R 1 +/* Define to 1 if you have the `getline' function. */+#define HAVE_GETLINE 1++/* Platform uses optreset to reset getopt */+#define HAVE_GETOPT_OPTRESET 1+ /* Define to 1 if you have the `getpid' function. */ #define HAVE_GETPID 1 @@ -581,6 +596,9 @@ /* Define to 1 if you have the `gmtime_r' function. */ #define HAVE_GMTIME_R 1 +/* gmtime_s function */+/* #undef HAVE_GMTIME_S */+ /* Define to 1 if you have the <grp.h> header file. */ #define HAVE_GRP_H 1 @@ -632,12 +650,6 @@ /* Define to 1 if you have the `crypto' library (-lcrypto). */ /* #undef HAVE_LIBCRYPTO */ -/* Define to 1 if you have the `eay32' library (-leay32). */-/* #undef HAVE_LIBEAY32 */--/* Define to 1 if you have the `eay64' library (-leay64). */-/* #undef HAVE_LIBEAY64 */- /* Define to 1 if you have the `expat' library (-lexpat). */ /* #undef HAVE_LIBEXPAT */ @@ -686,6 +698,10 @@ /* Define to 1 if you have the `zstd' library (-lzstd). */ /* #undef HAVE_LIBZSTD */ +/* Define to 1 if you have the `zstd' library (-lzstd) with compression+   support. */+/* #undef HAVE_LIBZSTD_COMPRESSOR */+ /* Define to 1 if you have the <limits.h> header file. */ #define HAVE_LIMITS_H 1 @@ -731,6 +747,9 @@ /* Define to 1 if you have the `localtime_r' function. */ #define HAVE_LOCALTIME_R 1 +/* localtime_s function */+/* #undef HAVE_LOCALTIME_S */+ /* Define to 1 if the system has the type `long long int'. */ #define HAVE_LONG_LONG_INT 1 @@ -756,6 +775,9 @@ /* Define to 1 if you have the <lz4.h> header file. */ /* #undef HAVE_LZ4_H */ +/* Define to 1 if you have the `LZMA_FILTER_ARM64' macro. */+/* #undef HAVE_LZMA_FILTER_ARM64 */+ /* Define to 1 if you have the <lzma.h> header file. */ /* #undef HAVE_LZMA_H */ @@ -798,12 +820,12 @@ /* Define to 1 if you have the `memmove' function. */ #define HAVE_MEMMOVE 1 -/* Define to 1 if you have the <memory.h> header file. */-#define HAVE_MEMORY_H 1- /* Define to 1 if you have the `memset' function. */ #define HAVE_MEMSET 1 +/* Define to 1 if you have the <minix/config.h> header file. */+/* #undef HAVE_MINIX_CONFIG_H */+ /* Define to 1 if you have the `mkdir' function. */ #define HAVE_MKDIR 1 @@ -961,6 +983,9 @@ /* Define to 1 if you have the <stdint.h> header file. */ #define HAVE_STDINT_H 1 +/* Define to 1 if you have the <stdio.h> header file. */+#define HAVE_STDIO_H 1+ /* Define to 1 if you have the <stdlib.h> header file. */ #define HAVE_STDLIB_H 1 @@ -973,7 +998,7 @@ /* Define to 1 if you have the `strerror' function. */ #define HAVE_STRERROR 1 -/* Define to 1 if you have the `strerror_r' function. */+/* Define if you have `strerror_r'. */ #define HAVE_STRERROR_R 1  /* Define to 1 if you have the `strftime' function. */@@ -1088,6 +1113,9 @@ /* Define to 1 if you have the <sys/poll.h> header file. */ #define HAVE_SYS_POLL_H 1 +/* Define to 1 if you have the <sys/queue.h> header file. */+#define HAVE_SYS_QUEUE_H 1+ /* Define to 1 if you have the <sys/richacl.h> header file. */ /* #undef HAVE_SYS_RICHACL_H */ @@ -1226,32 +1254,23 @@ /* Define to 1 if you have the <zstd.h> header file. */ /* #undef HAVE_ZSTD_H */ -/* Define to 1 if you have the `_ctime64_s' function. */-/* #undef HAVE__CTIME64_S */- /* Define to 1 if you have the `_fseeki64' function. */ /* #undef HAVE__FSEEKI64 */  /* Define to 1 if you have the `_get_timezone' function. */ /* #undef HAVE__GET_TIMEZONE */ -/* Define to 1 if you have the `_gmtime64_s' function. */-/* #undef HAVE__GMTIME64_S */--/* Define to 1 if you have the `_localtime64_s' function. */-/* #undef HAVE__LOCALTIME64_S */--/* Define to 1 if you have the `_mkgmtime64' function. */-/* #undef HAVE__MKGMTIME64 */+/* _mkgmtime function */+/* #undef HAVE__MKGMTIME */  /* Define as const if the declaration of iconv() needs const. */ /* #undef ICONV_CONST */  /* Version number of libarchive as a single integer */-#define LIBARCHIVE_VERSION_NUMBER "3005003"+#define LIBARCHIVE_VERSION_NUMBER "3007001"  /* Version number of libarchive */-#define LIBARCHIVE_VERSION_STRING "3.5.3"+#define LIBARCHIVE_VERSION_STRING "3.7.1"  /* Define to 1 if `lstat' dereferences a symlink specified with a trailing    slash. */@@ -1281,7 +1300,7 @@ #define PACKAGE_NAME "libarchive"  /* Define to the full name and version of this package. */-#define PACKAGE_STRING "libarchive 3.5.3"+#define PACKAGE_STRING "libarchive 3.7.1"  /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "libarchive"@@ -1290,56 +1309,122 @@ #define PACKAGE_URL ""  /* Define to the version of this package. */-#define PACKAGE_VERSION "3.5.3"+#define PACKAGE_VERSION "3.7.1"  /* Define to 1 if PCRE_STATIC needs to be defined. */ /* #undef PCRE_STATIC */ +/* The number of bytes in type int */+#define SIZEOF_INT 4++/* The number of bytes in type long */+#define SIZEOF_LONG 8+ /* The size of `wchar_t', as computed by sizeof. */ #define SIZEOF_WCHAR_T 4 -/* Define to 1 if you have the ANSI C header files. */+/* Define to 1 if all of the C90 standard headers exist (not just the ones+   required in a freestanding environment). This macro is provided for+   backward compatibility; new code need not use it. */ #define STDC_HEADERS 1  /* Define to 1 if strerror_r returns char *. */ /* #undef STRERROR_R_CHAR_P */ -/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */-#define TIME_WITH_SYS_TIME 1- /* Enable extensions on AIX 3, Interix.  */ #ifndef _ALL_SOURCE # define _ALL_SOURCE 1 #endif+/* Enable general extensions on macOS.  */+#ifndef _DARWIN_C_SOURCE+# define _DARWIN_C_SOURCE 1+#endif+/* Enable general extensions on Solaris.  */+#ifndef __EXTENSIONS__+# define __EXTENSIONS__ 1+#endif /* Enable GNU extensions on systems that have them.  */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif-/* Enable threading extensions on Solaris.  */+/* Enable X/Open compliant socket functions that do not require linking+   with -lxnet on HP-UX 11.11.  */+#ifndef _HPUX_ALT_XOPEN_SOCKET_API+# define _HPUX_ALT_XOPEN_SOCKET_API 1+#endif+/* Identify the host operating system as Minix.+   This macro does not affect the system headers' behavior.+   A future release of Autoconf may stop defining this macro.  */+#ifndef _MINIX+/* # undef _MINIX */+#endif+/* Enable general extensions on NetBSD.+   Enable NetBSD compatibility extensions on Minix.  */+#ifndef _NETBSD_SOURCE+# define _NETBSD_SOURCE 1+#endif+/* Enable OpenBSD compatibility extensions on NetBSD.+   Oddly enough, this does nothing on OpenBSD.  */+#ifndef _OPENBSD_SOURCE+# define _OPENBSD_SOURCE 1+#endif+/* Define to 1 if needed for POSIX-compatible behavior.  */+#ifndef _POSIX_SOURCE+/* # undef _POSIX_SOURCE */+#endif+/* Define to 2 if needed for POSIX-compatible behavior.  */+#ifndef _POSIX_1_SOURCE+/* # undef _POSIX_1_SOURCE */+#endif+/* Enable POSIX-compatible threading on Solaris.  */ #ifndef _POSIX_PTHREAD_SEMANTICS # define _POSIX_PTHREAD_SEMANTICS 1 #endif+/* Enable extensions specified by ISO/IEC TS 18661-5:2014.  */+#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__+# define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1+#endif+/* Enable extensions specified by ISO/IEC TS 18661-1:2014.  */+#ifndef __STDC_WANT_IEC_60559_BFP_EXT__+# define __STDC_WANT_IEC_60559_BFP_EXT__ 1+#endif+/* Enable extensions specified by ISO/IEC TS 18661-2:2015.  */+#ifndef __STDC_WANT_IEC_60559_DFP_EXT__+# define __STDC_WANT_IEC_60559_DFP_EXT__ 1+#endif+/* Enable extensions specified by ISO/IEC TS 18661-4:2015.  */+#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__+# define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1+#endif+/* Enable extensions specified by ISO/IEC TS 18661-3:2015.  */+#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__+# define __STDC_WANT_IEC_60559_TYPES_EXT__ 1+#endif+/* Enable extensions specified by ISO/IEC TR 24731-2:2010.  */+#ifndef __STDC_WANT_LIB_EXT2__+# define __STDC_WANT_LIB_EXT2__ 1+#endif+/* Enable extensions specified by ISO/IEC 24747:2009.  */+#ifndef __STDC_WANT_MATH_SPEC_FUNCS__+# define __STDC_WANT_MATH_SPEC_FUNCS__ 1+#endif /* Enable extensions on HP NonStop.  */ #ifndef _TANDEM_SOURCE # define _TANDEM_SOURCE 1 #endif-/* Enable general extensions on Solaris.  */-#ifndef __EXTENSIONS__-# define __EXTENSIONS__ 1+/* Enable X/Open extensions.  Define to 500 only if necessary+   to make mbstate_t available.  */+#ifndef _XOPEN_SOURCE+/* # undef _XOPEN_SOURCE */ #endif   /* Version number of package */-#define VERSION "3.5.3"+#define VERSION "3.7.1"  /* Define to '0x0502' for Windows Server 2003 APIs. */ /* #undef WINVER */ -/* Enable large inode numbers on Mac OS X 10.5.  */-#ifndef _DARWIN_USE_64_BIT_INODE-# define _DARWIN_USE_64_BIT_INODE 1-#endif- /* Number of bits in a file offset, on hosts where this is settable. */ /* #undef _FILE_OFFSET_BITS */ @@ -1348,16 +1433,6 @@  /* Define for large files, on AIX-style hosts. */ /* #undef _LARGE_FILES */--/* Define to 1 if on MINIX. */-/* #undef _MINIX */--/* Define to 2 if the system does not provide POSIX.1 features except with-   this defined. */-/* #undef _POSIX_1_SOURCE */--/* Define to 1 if you need to in order for `stat' and other things to work. */-/* #undef _POSIX_SOURCE */  /* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,    <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
c/autoconf-freebsd/config.h view
@@ -165,13 +165,13 @@ /* #undef ARCHIVE_XATTR_LINUX */  /* Version number of bsdcat */-#define BSDCAT_VERSION_STRING "3.5.3"+#define BSDCAT_VERSION_STRING "3.7.1"  /* Version number of bsdcpio */-#define BSDCPIO_VERSION_STRING "3.5.3"+#define BSDCPIO_VERSION_STRING "3.7.1"  /* Version number of bsdtar */-#define BSDTAR_VERSION_STRING "3.5.3"+#define BSDTAR_VERSION_STRING "3.7.1"  /* Define to 1 if the system has the type `ace_t'. */ /* #undef HAVE_ACE_T */@@ -311,6 +311,9 @@ /* Define to 1 if you have the `chroot' function. */ #define HAVE_CHROOT 1 +/* cmtime_s function */+/* #undef HAVE_CMTIME_S */+ /* Define to 1 if you have the <copyfile.h> header file. */ /* #undef HAVE_COPYFILE_H */ @@ -510,6 +513,12 @@ /* Define to 1 if you have the `flistxattr' function. */ /* #undef HAVE_FLISTXATTR */ +/* Define to 1 if you have the `fnmatch' function. */+#define HAVE_FNMATCH 1++/* Define to 1 if you have the <fnmatch.h> header file. */+#define HAVE_FNMATCH_H 1+ /* Define to 1 if you have the `fork' function. */ #define HAVE_FORK 1 @@ -558,6 +567,12 @@ /* Define to 1 if you have the `getgrnam_r' function. */ #define HAVE_GETGRNAM_R 1 +/* Define to 1 if you have the `getline' function. */+#define HAVE_GETLINE 1++/* Platform uses optreset to reset getopt */+#define HAVE_GETOPT_OPTRESET 1+ /* Define to 1 if you have the `getpid' function. */ #define HAVE_GETPID 1 @@ -576,6 +591,9 @@ /* Define to 1 if you have the `gmtime_r' function. */ #define HAVE_GMTIME_R 1 +/* gmtime_s function */+/* #undef HAVE_GMTIME_S */+ /* Define to 1 if you have the <grp.h> header file. */ #define HAVE_GRP_H 1 @@ -627,12 +645,6 @@ /* Define to 1 if you have the `crypto' library (-lcrypto). */ /* #undef HAVE_LIBCRYPTO */ -/* Define to 1 if you have the `eay32' library (-leay32). */-/* #undef HAVE_LIBEAY32 */--/* Define to 1 if you have the `eay64' library (-leay64). */-/* #undef HAVE_LIBEAY64 */- /* Define to 1 if you have the `expat' library (-lexpat). */ /* #undef HAVE_LIBEXPAT */ @@ -675,11 +687,15 @@ /* #undef HAVE_LIBXML_XMLWRITER_H */  /* Define to 1 if you have the `z' library (-lz). */-#define HAVE_LIBZ 1+/* #undef HAVE_LIBZ */  /* Define to 1 if you have the `zstd' library (-lzstd). */ /* #undef HAVE_LIBZSTD */ +/* Define to 1 if you have the `zstd' library (-lzstd) with compression+   support. */+/* #undef HAVE_LIBZSTD_COMPRESSOR */+ /* Define to 1 if you have the <limits.h> header file. */ #define HAVE_LIMITS_H 1 @@ -725,6 +741,9 @@ /* Define to 1 if you have the `localtime_r' function. */ #define HAVE_LOCALTIME_R 1 +/* localtime_s function */+/* #undef HAVE_LOCALTIME_S */+ /* Define to 1 if the system has the type `long long int'. */ #define HAVE_LONG_LONG_INT 1 @@ -750,6 +769,9 @@ /* Define to 1 if you have the <lz4.h> header file. */ /* #undef HAVE_LZ4_H */ +/* Define to 1 if you have the `LZMA_FILTER_ARM64' macro. */+/* #undef HAVE_LZMA_FILTER_ARM64 */+ /* Define to 1 if you have the <lzma.h> header file. */ /* #undef HAVE_LZMA_H */ @@ -791,12 +813,12 @@ /* Define to 1 if you have the `memmove' function. */ #define HAVE_MEMMOVE 1 -/* Define to 1 if you have the <memory.h> header file. */-#define HAVE_MEMORY_H 1- /* Define to 1 if you have the `memset' function. */ #define HAVE_MEMSET 1 +/* Define to 1 if you have the <minix/config.h> header file. */+/* #undef HAVE_MINIX_CONFIG_H */+ /* Define to 1 if you have the `mkdir' function. */ #define HAVE_MKDIR 1 @@ -950,6 +972,9 @@ /* Define to 1 if you have the <stdint.h> header file. */ #define HAVE_STDINT_H 1 +/* Define to 1 if you have the <stdio.h> header file. */+#define HAVE_STDIO_H 1+ /* Define to 1 if you have the <stdlib.h> header file. */ #define HAVE_STDLIB_H 1 @@ -962,7 +987,7 @@ /* Define to 1 if you have the `strerror' function. */ #define HAVE_STRERROR 1 -/* Define to 1 if you have the `strerror_r' function. */+/* Define if you have `strerror_r'. */ #define HAVE_STRERROR_R 1  /* Define to 1 if you have the `strftime' function. */@@ -1077,6 +1102,9 @@ /* Define to 1 if you have the <sys/poll.h> header file. */ #define HAVE_SYS_POLL_H 1 +/* Define to 1 if you have the <sys/queue.h> header file. */+#define HAVE_SYS_QUEUE_H 1+ /* Define to 1 if you have the <sys/richacl.h> header file. */ /* #undef HAVE_SYS_RICHACL_H */ @@ -1210,37 +1238,28 @@ /* #undef HAVE_WORKING_FS_IOC_GETFLAGS */  /* Define to 1 if you have the <zlib.h> header file. */-#define HAVE_ZLIB_H 1+/* #undef HAVE_ZLIB_H */  /* Define to 1 if you have the <zstd.h> header file. */ /* #undef HAVE_ZSTD_H */ -/* Define to 1 if you have the `_ctime64_s' function. */-/* #undef HAVE__CTIME64_S */- /* Define to 1 if you have the `_fseeki64' function. */ /* #undef HAVE__FSEEKI64 */  /* Define to 1 if you have the `_get_timezone' function. */ /* #undef HAVE__GET_TIMEZONE */ -/* Define to 1 if you have the `_gmtime64_s' function. */-/* #undef HAVE__GMTIME64_S */--/* Define to 1 if you have the `_localtime64_s' function. */-/* #undef HAVE__LOCALTIME64_S */--/* Define to 1 if you have the `_mkgmtime64' function. */-/* #undef HAVE__MKGMTIME64 */+/* _mkgmtime function */+/* #undef HAVE__MKGMTIME */  /* Define as const if the declaration of iconv() needs const. */ /* #undef ICONV_CONST */  /* Version number of libarchive as a single integer */-#define LIBARCHIVE_VERSION_NUMBER "3005003"+#define LIBARCHIVE_VERSION_NUMBER "3007001"  /* Version number of libarchive */-#define LIBARCHIVE_VERSION_STRING "3.5.3"+#define LIBARCHIVE_VERSION_STRING "3.7.1"  /* Define to 1 if `lstat' dereferences a symlink specified with a trailing    slash. */@@ -1270,7 +1289,7 @@ #define PACKAGE_NAME "libarchive"  /* Define to the full name and version of this package. */-#define PACKAGE_STRING "libarchive 3.5.3"+#define PACKAGE_STRING "libarchive 3.7.1"  /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "libarchive"@@ -1279,56 +1298,122 @@ #define PACKAGE_URL ""  /* Define to the version of this package. */-#define PACKAGE_VERSION "3.5.3"+#define PACKAGE_VERSION "3.7.1"  /* Define to 1 if PCRE_STATIC needs to be defined. */ /* #undef PCRE_STATIC */ +/* The number of bytes in type int */+#define SIZEOF_INT 4++/* The number of bytes in type long */+#define SIZEOF_LONG 8+ /* The size of `wchar_t', as computed by sizeof. */ #define SIZEOF_WCHAR_T 4 -/* Define to 1 if you have the ANSI C header files. */+/* Define to 1 if all of the C90 standard headers exist (not just the ones+   required in a freestanding environment). This macro is provided for+   backward compatibility; new code need not use it. */ #define STDC_HEADERS 1  /* Define to 1 if strerror_r returns char *. */ /* #undef STRERROR_R_CHAR_P */ -/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */-#define TIME_WITH_SYS_TIME 1- /* Enable extensions on AIX 3, Interix.  */ #ifndef _ALL_SOURCE # define _ALL_SOURCE 1 #endif+/* Enable general extensions on macOS.  */+#ifndef _DARWIN_C_SOURCE+# define _DARWIN_C_SOURCE 1+#endif+/* Enable general extensions on Solaris.  */+#ifndef __EXTENSIONS__+# define __EXTENSIONS__ 1+#endif /* Enable GNU extensions on systems that have them.  */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif-/* Enable threading extensions on Solaris.  */+/* Enable X/Open compliant socket functions that do not require linking+   with -lxnet on HP-UX 11.11.  */+#ifndef _HPUX_ALT_XOPEN_SOCKET_API+# define _HPUX_ALT_XOPEN_SOCKET_API 1+#endif+/* Identify the host operating system as Minix.+   This macro does not affect the system headers' behavior.+   A future release of Autoconf may stop defining this macro.  */+#ifndef _MINIX+/* # undef _MINIX */+#endif+/* Enable general extensions on NetBSD.+   Enable NetBSD compatibility extensions on Minix.  */+#ifndef _NETBSD_SOURCE+# define _NETBSD_SOURCE 1+#endif+/* Enable OpenBSD compatibility extensions on NetBSD.+   Oddly enough, this does nothing on OpenBSD.  */+#ifndef _OPENBSD_SOURCE+# define _OPENBSD_SOURCE 1+#endif+/* Define to 1 if needed for POSIX-compatible behavior.  */+#ifndef _POSIX_SOURCE+/* # undef _POSIX_SOURCE */+#endif+/* Define to 2 if needed for POSIX-compatible behavior.  */+#ifndef _POSIX_1_SOURCE+/* # undef _POSIX_1_SOURCE */+#endif+/* Enable POSIX-compatible threading on Solaris.  */ #ifndef _POSIX_PTHREAD_SEMANTICS # define _POSIX_PTHREAD_SEMANTICS 1 #endif+/* Enable extensions specified by ISO/IEC TS 18661-5:2014.  */+#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__+# define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1+#endif+/* Enable extensions specified by ISO/IEC TS 18661-1:2014.  */+#ifndef __STDC_WANT_IEC_60559_BFP_EXT__+# define __STDC_WANT_IEC_60559_BFP_EXT__ 1+#endif+/* Enable extensions specified by ISO/IEC TS 18661-2:2015.  */+#ifndef __STDC_WANT_IEC_60559_DFP_EXT__+# define __STDC_WANT_IEC_60559_DFP_EXT__ 1+#endif+/* Enable extensions specified by ISO/IEC TS 18661-4:2015.  */+#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__+# define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1+#endif+/* Enable extensions specified by ISO/IEC TS 18661-3:2015.  */+#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__+# define __STDC_WANT_IEC_60559_TYPES_EXT__ 1+#endif+/* Enable extensions specified by ISO/IEC TR 24731-2:2010.  */+#ifndef __STDC_WANT_LIB_EXT2__+# define __STDC_WANT_LIB_EXT2__ 1+#endif+/* Enable extensions specified by ISO/IEC 24747:2009.  */+#ifndef __STDC_WANT_MATH_SPEC_FUNCS__+# define __STDC_WANT_MATH_SPEC_FUNCS__ 1+#endif /* Enable extensions on HP NonStop.  */ #ifndef _TANDEM_SOURCE # define _TANDEM_SOURCE 1 #endif-/* Enable general extensions on Solaris.  */-#ifndef __EXTENSIONS__-# define __EXTENSIONS__ 1+/* Enable X/Open extensions.  Define to 500 only if necessary+   to make mbstate_t available.  */+#ifndef _XOPEN_SOURCE+/* # undef _XOPEN_SOURCE */ #endif   /* Version number of package */-#define VERSION "3.5.3"+#define VERSION "3.7.1"  /* Define to '0x0502' for Windows Server 2003 APIs. */ /* #undef WINVER */ -/* Enable large inode numbers on Mac OS X 10.5.  */-#ifndef _DARWIN_USE_64_BIT_INODE-# define _DARWIN_USE_64_BIT_INODE 1-#endif- /* Number of bits in a file offset, on hosts where this is settable. */ /* #undef _FILE_OFFSET_BITS */ @@ -1338,16 +1423,6 @@ /* Define for large files, on AIX-style hosts. */ /* #undef _LARGE_FILES */ -/* Define to 1 if on MINIX. */-/* #undef _MINIX */--/* Define to 2 if the system does not provide POSIX.1 features except with-   this defined. */-/* #undef _POSIX_1_SOURCE */--/* Define to 1 if you need to in order for `stat' and other things to work. */-/* #undef _POSIX_SOURCE */- /* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,    <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the    #define below would cause a syntax error. */@@ -1430,3 +1505,5 @@  /* Define to `unsigned int' if <sys/types.h> does not define. */ /* #undef uintptr_t */+#define HAVE_LIBZ 1+#define HAVE_ZLIB_H 1
c/autoconf-linux/config.h view
@@ -170,13 +170,13 @@ /* #undef ARCHIVE_XATTR_LINUX */  /* Version number of bsdcat */-#define BSDCAT_VERSION_STRING "3.5.3"+#define BSDCAT_VERSION_STRING "3.7.1"  /* Version number of bsdcpio */-#define BSDCPIO_VERSION_STRING "3.5.3"+#define BSDCPIO_VERSION_STRING "3.7.1"  /* Version number of bsdtar */-#define BSDTAR_VERSION_STRING "3.5.3"+#define BSDTAR_VERSION_STRING "3.7.1"  /* Define to 1 if the system has the type `ace_t'. */ /* #undef HAVE_ACE_T */@@ -316,6 +316,9 @@ /* Define to 1 if you have the `chroot' function. */ #define HAVE_CHROOT 1 +/* cmtime_s function */+/* #undef HAVE_CMTIME_S */+ /* Define to 1 if you have the <copyfile.h> header file. */ /* #undef HAVE_COPYFILE_H */ @@ -514,6 +517,12 @@ /* Define to 1 if you have the `flistxattr' function. */ /* #undef HAVE_FLISTXATTR */ +/* Define to 1 if you have the `fnmatch' function. */+#define HAVE_FNMATCH 1++/* Define to 1 if you have the <fnmatch.h> header file. */+#define HAVE_FNMATCH_H 1+ /* Define to 1 if you have the `fork' function. */ #define HAVE_FORK 1 @@ -562,6 +571,12 @@ /* Define to 1 if you have the `getgrnam_r' function. */ #define HAVE_GETGRNAM_R 1 +/* Define to 1 if you have the `getline' function. */+#define HAVE_GETLINE 1++/* Platform uses optreset to reset getopt */+/* #undef HAVE_GETOPT_OPTRESET */+ /* Define to 1 if you have the `getpid' function. */ #define HAVE_GETPID 1 @@ -580,6 +595,9 @@ /* Define to 1 if you have the `gmtime_r' function. */ #define HAVE_GMTIME_R 1 +/* gmtime_s function */+/* #undef HAVE_GMTIME_S */+ /* Define to 1 if you have the <grp.h> header file. */ #define HAVE_GRP_H 1 @@ -605,7 +623,7 @@ /* #undef HAVE_LCHFLAGS */  /* Define to 1 if you have the `lchmod' function. */-/* #undef HAVE_LCHMOD */+#define HAVE_LCHMOD 1  /* Define to 1 if you have the `lchown' function. */ #define HAVE_LCHOWN 1@@ -631,12 +649,6 @@ /* Define to 1 if you have the `crypto' library (-lcrypto). */ /* #undef HAVE_LIBCRYPTO */ -/* Define to 1 if you have the `eay32' library (-leay32). */-/* #undef HAVE_LIBEAY32 */--/* Define to 1 if you have the `eay64' library (-leay64). */-/* #undef HAVE_LIBEAY64 */- /* Define to 1 if you have the `expat' library (-lexpat). */ /* #undef HAVE_LIBEXPAT */ @@ -685,6 +697,10 @@ /* Define to 1 if you have the `zstd' library (-lzstd). */ /* #undef HAVE_LIBZSTD */ +/* Define to 1 if you have the `zstd' library (-lzstd) with compression+   support. */+/* #undef HAVE_LIBZSTD_COMPRESSOR */+ /* Define to 1 if you have the <limits.h> header file. */ #define HAVE_LIMITS_H 1 @@ -730,6 +746,9 @@ /* Define to 1 if you have the `localtime_r' function. */ #define HAVE_LOCALTIME_R 1 +/* localtime_s function */+/* #undef HAVE_LOCALTIME_S */+ /* Define to 1 if the system has the type `long long int'. */ #define HAVE_LONG_LONG_INT 1 @@ -755,6 +774,9 @@ /* Define to 1 if you have the <lz4.h> header file. */ /* #undef HAVE_LZ4_H */ +/* Define to 1 if you have the `LZMA_FILTER_ARM64' macro. */+/* #undef HAVE_LZMA_FILTER_ARM64 */+ /* Define to 1 if you have the <lzma.h> header file. */ /* #undef HAVE_LZMA_H */ @@ -797,12 +819,12 @@ /* Define to 1 if you have the `memmove' function. */ #define HAVE_MEMMOVE 1 -/* Define to 1 if you have the <memory.h> header file. */-#define HAVE_MEMORY_H 1- /* Define to 1 if you have the `memset' function. */ #define HAVE_MEMSET 1 +/* Define to 1 if you have the <minix/config.h> header file. */+/* #undef HAVE_MINIX_CONFIG_H */+ /* Define to 1 if you have the `mkdir' function. */ #define HAVE_MKDIR 1 @@ -960,6 +982,9 @@ /* Define to 1 if you have the <stdint.h> header file. */ #define HAVE_STDINT_H 1 +/* Define to 1 if you have the <stdio.h> header file. */+#define HAVE_STDIO_H 1+ /* Define to 1 if you have the <stdlib.h> header file. */ #define HAVE_STDLIB_H 1 @@ -972,7 +997,7 @@ /* Define to 1 if you have the `strerror' function. */ #define HAVE_STRERROR 1 -/* Define to 1 if you have the `strerror_r' function. */+/* Define if you have `strerror_r'. */ #define HAVE_STRERROR_R 1  /* Define to 1 if you have the `strftime' function. */@@ -1088,6 +1113,9 @@ /* Define to 1 if you have the <sys/poll.h> header file. */ #define HAVE_SYS_POLL_H 1 +/* Define to 1 if you have the <sys/queue.h> header file. */+#define HAVE_SYS_QUEUE_H 1+ /* Define to 1 if you have the <sys/richacl.h> header file. */ /* #undef HAVE_SYS_RICHACL_H */ @@ -1226,32 +1254,23 @@ /* Define to 1 if you have the <zstd.h> header file. */ /* #undef HAVE_ZSTD_H */ -/* Define to 1 if you have the `_ctime64_s' function. */-/* #undef HAVE__CTIME64_S */- /* Define to 1 if you have the `_fseeki64' function. */ /* #undef HAVE__FSEEKI64 */  /* Define to 1 if you have the `_get_timezone' function. */ /* #undef HAVE__GET_TIMEZONE */ -/* Define to 1 if you have the `_gmtime64_s' function. */-/* #undef HAVE__GMTIME64_S */--/* Define to 1 if you have the `_localtime64_s' function. */-/* #undef HAVE__LOCALTIME64_S */--/* Define to 1 if you have the `_mkgmtime64' function. */-/* #undef HAVE__MKGMTIME64 */+/* _mkgmtime function */+/* #undef HAVE__MKGMTIME */  /* Define as const if the declaration of iconv() needs const. */ /* #undef ICONV_CONST */  /* Version number of libarchive as a single integer */-#define LIBARCHIVE_VERSION_NUMBER "3005003"+#define LIBARCHIVE_VERSION_NUMBER "3007001"  /* Version number of libarchive */-#define LIBARCHIVE_VERSION_STRING "3.5.3"+#define LIBARCHIVE_VERSION_STRING "3.7.1"  /* Define to 1 if `lstat' dereferences a symlink specified with a trailing    slash. */@@ -1281,7 +1300,7 @@ #define PACKAGE_NAME "libarchive"  /* Define to the full name and version of this package. */-#define PACKAGE_STRING "libarchive 3.5.3"+#define PACKAGE_STRING "libarchive 3.7.1"  /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "libarchive"@@ -1290,56 +1309,122 @@ #define PACKAGE_URL ""  /* Define to the version of this package. */-#define PACKAGE_VERSION "3.5.3"+#define PACKAGE_VERSION "3.7.1"  /* Define to 1 if PCRE_STATIC needs to be defined. */ /* #undef PCRE_STATIC */ +/* The number of bytes in type int */+#define SIZEOF_INT 4++/* The number of bytes in type long */+#define SIZEOF_LONG 8+ /* The size of `wchar_t', as computed by sizeof. */ #define SIZEOF_WCHAR_T 4 -/* Define to 1 if you have the ANSI C header files. */+/* Define to 1 if all of the C90 standard headers exist (not just the ones+   required in a freestanding environment). This macro is provided for+   backward compatibility; new code need not use it. */ #define STDC_HEADERS 1  /* Define to 1 if strerror_r returns char *. */ #define STRERROR_R_CHAR_P 1 -/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */-#define TIME_WITH_SYS_TIME 1- /* Enable extensions on AIX 3, Interix.  */ #ifndef _ALL_SOURCE # define _ALL_SOURCE 1 #endif+/* Enable general extensions on macOS.  */+#ifndef _DARWIN_C_SOURCE+# define _DARWIN_C_SOURCE 1+#endif+/* Enable general extensions on Solaris.  */+#ifndef __EXTENSIONS__+# define __EXTENSIONS__ 1+#endif /* Enable GNU extensions on systems that have them.  */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif-/* Enable threading extensions on Solaris.  */+/* Enable X/Open compliant socket functions that do not require linking+   with -lxnet on HP-UX 11.11.  */+#ifndef _HPUX_ALT_XOPEN_SOCKET_API+# define _HPUX_ALT_XOPEN_SOCKET_API 1+#endif+/* Identify the host operating system as Minix.+   This macro does not affect the system headers' behavior.+   A future release of Autoconf may stop defining this macro.  */+#ifndef _MINIX+/* # undef _MINIX */+#endif+/* Enable general extensions on NetBSD.+   Enable NetBSD compatibility extensions on Minix.  */+#ifndef _NETBSD_SOURCE+# define _NETBSD_SOURCE 1+#endif+/* Enable OpenBSD compatibility extensions on NetBSD.+   Oddly enough, this does nothing on OpenBSD.  */+#ifndef _OPENBSD_SOURCE+# define _OPENBSD_SOURCE 1+#endif+/* Define to 1 if needed for POSIX-compatible behavior.  */+#ifndef _POSIX_SOURCE+/* # undef _POSIX_SOURCE */+#endif+/* Define to 2 if needed for POSIX-compatible behavior.  */+#ifndef _POSIX_1_SOURCE+/* # undef _POSIX_1_SOURCE */+#endif+/* Enable POSIX-compatible threading on Solaris.  */ #ifndef _POSIX_PTHREAD_SEMANTICS # define _POSIX_PTHREAD_SEMANTICS 1 #endif+/* Enable extensions specified by ISO/IEC TS 18661-5:2014.  */+#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__+# define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1+#endif+/* Enable extensions specified by ISO/IEC TS 18661-1:2014.  */+#ifndef __STDC_WANT_IEC_60559_BFP_EXT__+# define __STDC_WANT_IEC_60559_BFP_EXT__ 1+#endif+/* Enable extensions specified by ISO/IEC TS 18661-2:2015.  */+#ifndef __STDC_WANT_IEC_60559_DFP_EXT__+# define __STDC_WANT_IEC_60559_DFP_EXT__ 1+#endif+/* Enable extensions specified by ISO/IEC TS 18661-4:2015.  */+#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__+# define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1+#endif+/* Enable extensions specified by ISO/IEC TS 18661-3:2015.  */+#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__+# define __STDC_WANT_IEC_60559_TYPES_EXT__ 1+#endif+/* Enable extensions specified by ISO/IEC TR 24731-2:2010.  */+#ifndef __STDC_WANT_LIB_EXT2__+# define __STDC_WANT_LIB_EXT2__ 1+#endif+/* Enable extensions specified by ISO/IEC 24747:2009.  */+#ifndef __STDC_WANT_MATH_SPEC_FUNCS__+# define __STDC_WANT_MATH_SPEC_FUNCS__ 1+#endif /* Enable extensions on HP NonStop.  */ #ifndef _TANDEM_SOURCE # define _TANDEM_SOURCE 1 #endif-/* Enable general extensions on Solaris.  */-#ifndef __EXTENSIONS__-# define __EXTENSIONS__ 1+/* Enable X/Open extensions.  Define to 500 only if necessary+   to make mbstate_t available.  */+#ifndef _XOPEN_SOURCE+/* # undef _XOPEN_SOURCE */ #endif   /* Version number of package */-#define VERSION "3.5.3"+#define VERSION "3.7.1"  /* Define to '0x0502' for Windows Server 2003 APIs. */ /* #undef WINVER */ -/* Enable large inode numbers on Mac OS X 10.5.  */-#ifndef _DARWIN_USE_64_BIT_INODE-# define _DARWIN_USE_64_BIT_INODE 1-#endif- /* Number of bits in a file offset, on hosts where this is settable. */ /* #undef _FILE_OFFSET_BITS */ @@ -1348,16 +1433,6 @@  /* Define for large files, on AIX-style hosts. */ /* #undef _LARGE_FILES */--/* Define to 1 if on MINIX. */-/* #undef _MINIX */--/* Define to 2 if the system does not provide POSIX.1 features except with-   this defined. */-/* #undef _POSIX_1_SOURCE */--/* Define to 1 if you need to in order for `stat' and other things to work. */-/* #undef _POSIX_SOURCE */  /* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,    <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
c/autoconf-windows/config.h view
@@ -104,7 +104,7 @@ /* #undef ARCHIVE_CRYPTO_SHA256_OPENSSL */  /* SHA256 via ARCHIVE_CRYPTO_SHA256_WIN supported. */-#define ARCHIVE_CRYPTO_SHA256_WIN 1+/* #undef ARCHIVE_CRYPTO_SHA256_WIN */  /* SHA384 via ARCHIVE_CRYPTO_SHA384_LIBC supported. */ /* #undef ARCHIVE_CRYPTO_SHA384_LIBC */@@ -128,7 +128,7 @@ /* #undef ARCHIVE_CRYPTO_SHA384_OPENSSL */  /* SHA384 via ARCHIVE_CRYPTO_SHA384_WIN supported. */-#define ARCHIVE_CRYPTO_SHA384_WIN 1+/* #undef ARCHIVE_CRYPTO_SHA384_WIN */  /* SHA512 via ARCHIVE_CRYPTO_SHA512_LIBC supported. */ /* #undef ARCHIVE_CRYPTO_SHA512_LIBC */@@ -155,7 +155,7 @@ /* #undef ARCHIVE_CRYPTO_SHA512_OPENSSL */  /* SHA512 via ARCHIVE_CRYPTO_SHA512_WIN supported. */-#define ARCHIVE_CRYPTO_SHA512_WIN 1+/* #undef ARCHIVE_CRYPTO_SHA512_WIN */  /* AIX xattr support */ /* #undef ARCHIVE_XATTR_AIX */@@ -170,13 +170,13 @@ /* #undef ARCHIVE_XATTR_LINUX */  /* Version number of bsdcat */-#define BSDCAT_VERSION_STRING "3.5.3"+#define BSDCAT_VERSION_STRING "3.7.1"  /* Version number of bsdcpio */-#define BSDCPIO_VERSION_STRING "3.5.3"+#define BSDCPIO_VERSION_STRING "3.7.1"  /* Version number of bsdtar */-#define BSDTAR_VERSION_STRING "3.5.3"+#define BSDTAR_VERSION_STRING "3.7.1"  /* Define to 1 if the system has the type `ace_t'. */ /* #undef HAVE_ACE_T */@@ -316,6 +316,9 @@ /* Define to 1 if you have the `chroot' function. */ /* #undef HAVE_CHROOT */ +/* cmtime_s function */+/* #undef HAVE_CMTIME_S */+ /* Define to 1 if you have the <copyfile.h> header file. */ /* #undef HAVE_COPYFILE_H */ @@ -406,7 +409,7 @@  /* Define to 1 if you have the declaration of `strerror_r', and to 0 if you    don't. */-#define HAVE_DECL_STRERROR_R 0+#define HAVE_DECL_STRERROR_R 1  /* Define to 1 if you have the declaration of `UINT32_MAX', and to 0 if you    don't. */@@ -429,10 +432,10 @@ #define HAVE_DIRENT_H 1  /* Define to 1 if you have a dirfd function or macro */-#define HAVE_DIRFD 1+/* #undef HAVE_DIRFD */  /* Define to 1 if you have the <dlfcn.h> header file. */-/* #undef HAVE_DLFCN_H */+#define HAVE_DLFCN_H 1  /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ /* #undef HAVE_DOPRNT */@@ -515,11 +518,17 @@ /* Define to 1 if you have the `flistxattr' function. */ /* #undef HAVE_FLISTXATTR */ +/* Define to 1 if you have the `fnmatch' function. */+/* #undef HAVE_FNMATCH */++/* Define to 1 if you have the <fnmatch.h> header file. */+/* #undef HAVE_FNMATCH_H */+ /* Define to 1 if you have the `fork' function. */ /* #undef HAVE_FORK */  /* Define to 1 if fseeko (and presumably ftello) exists and is declared. */-#define HAVE_FSEEKO 1+/* #undef HAVE_FSEEKO */  /* Define to 1 if you have the `fsetea' function. */ /* #undef HAVE_FSETEA */@@ -563,6 +572,12 @@ /* Define to 1 if you have the `getgrnam_r' function. */ /* #undef HAVE_GETGRNAM_R */ +/* Define to 1 if you have the `getline' function. */+#define HAVE_GETLINE 1++/* Platform uses optreset to reset getopt */+/* #undef HAVE_GETOPT_OPTRESET */+ /* Define to 1 if you have the `getpid' function. */ #define HAVE_GETPID 1 @@ -581,6 +596,9 @@ /* Define to 1 if you have the `gmtime_r' function. */ /* #undef HAVE_GMTIME_R */ +/* gmtime_s function */+/* #undef HAVE_GMTIME_S */+ /* Define to 1 if you have the <grp.h> header file. */ /* #undef HAVE_GRP_H */ @@ -632,12 +650,6 @@ /* Define to 1 if you have the `crypto' library (-lcrypto). */ /* #undef HAVE_LIBCRYPTO */ -/* Define to 1 if you have the `eay32' library (-leay32). */-/* #undef HAVE_LIBEAY32 */--/* Define to 1 if you have the `eay64' library (-leay64). */-/* #undef HAVE_LIBEAY64 */- /* Define to 1 if you have the `expat' library (-lexpat). */ /* #undef HAVE_LIBEXPAT */ @@ -681,17 +693,24 @@ /* #undef HAVE_LIBXML_XMLWRITER_H */  /* Define to 1 if you have the `z' library (-lz). */-#define HAVE_LIBZ+/* #undef HAVE_LIBZ */  /* Define to 1 if you have the `zstd' library (-lzstd). */ /* #undef HAVE_LIBZSTD */ +/* Define to 1 if you have the `zstd' library (-lzstd) with compression+   support. */+/* #undef HAVE_LIBZSTD_COMPRESSOR */+ /* Define to 1 if you have the <limits.h> header file. */ #define HAVE_LIMITS_H 1  /* Define to 1 if you have the `link' function. */ /* #undef HAVE_LINK */ +/* Define to 1 if you have the `linkat' function. */+/* #undef HAVE_LINKAT */+ /* Define to 1 if you have the <linux/fiemap.h> header file. */ /* #undef HAVE_LINUX_FIEMAP_H */ @@ -728,6 +747,9 @@ /* Define to 1 if you have the `localtime_r' function. */ /* #undef HAVE_LOCALTIME_R */ +/* localtime_s function */+/* #undef HAVE_LOCALTIME_S */+ /* Define to 1 if the system has the type `long long int'. */ #define HAVE_LONG_LONG_INT 1 @@ -753,6 +775,9 @@ /* Define to 1 if you have the <lz4.h> header file. */ /* #undef HAVE_LZ4_H */ +/* Define to 1 if you have the `LZMA_FILTER_ARM64' macro. */+/* #undef HAVE_LZMA_FILTER_ARM64 */+ /* Define to 1 if you have the <lzma.h> header file. */ /* #undef HAVE_LZMA_H */ @@ -795,12 +820,12 @@ /* Define to 1 if you have the `memmove' function. */ #define HAVE_MEMMOVE 1 -/* Define to 1 if you have the <memory.h> header file. */-#define HAVE_MEMORY_H 1- /* Define to 1 if you have the `memset' function. */ #define HAVE_MEMSET 1 +/* Define to 1 if you have the <minix/config.h> header file. */+/* #undef HAVE_MINIX_CONFIG_H */+ /* Define to 1 if you have the `mkdir' function. */ #define HAVE_MKDIR 1 @@ -865,13 +890,13 @@ /* #undef HAVE_POSIX_SPAWNP */  /* Define to 1 if you have the <pthread.h> header file. */-#define HAVE_PTHREAD_H 1+/* #undef HAVE_PTHREAD_H */  /* Define to 1 if you have the <pwd.h> header file. */ /* #undef HAVE_PWD_H */  /* Define to 1 if you have a POSIX compatible readdir_r */-#define HAVE_READDIR_R 1+/* #undef HAVE_READDIR_R */  /* Define to 1 if you have the `readlink' function. */ /* #undef HAVE_READLINK */@@ -916,7 +941,7 @@ /* #undef HAVE_SELECT */  /* Define to 1 if you have the `setenv' function. */-/* #undef HAVE_SETENV */+#define HAVE_SETENV 1  /* Define to 1 if you have the `setlocale' function. */ #define HAVE_SETLOCALE 1@@ -958,6 +983,9 @@ /* Define to 1 if you have the <stdint.h> header file. */ #define HAVE_STDINT_H 1 +/* Define to 1 if you have the <stdio.h> header file. */+#define HAVE_STDIO_H 1+ /* Define to 1 if you have the <stdlib.h> header file. */ #define HAVE_STDLIB_H 1 @@ -970,8 +998,8 @@ /* Define to 1 if you have the `strerror' function. */ #define HAVE_STRERROR 1 -/* Define to 1 if you have the `strerror_r' function. */-/* #undef HAVE_STRERROR_R */+/* Define if you have `strerror_r'. */+#define HAVE_STRERROR_R 1  /* Define to 1 if you have the `strftime' function. */ #define HAVE_STRFTIME 1@@ -997,6 +1025,12 @@ /* Define to 1 if the system has the type `struct richacl'. */ /* #undef HAVE_STRUCT_RICHACL */ +/* Define to 1 if the system has the type `struct statfs'. */+/* #undef HAVE_STRUCT_STATFS */++/* Define to 1 if `f_iosize' is a member of `struct statfs'. */+/* #undef HAVE_STRUCT_STATFS_F_IOSIZE */+ /* Define to 1 if `f_namemax' is a member of `struct statfs'. */ /* #undef HAVE_STRUCT_STATFS_F_NAMEMAX */ @@ -1049,7 +1083,7 @@ /* #undef HAVE_SYS_ACL_H */  /* Define to 1 if you have the <sys/cdefs.h> header file. */-#define HAVE_SYS_CDEFS_H 1+/* #undef HAVE_SYS_CDEFS_H */  /* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.    */@@ -1080,6 +1114,9 @@ /* Define to 1 if you have the <sys/poll.h> header file. */ /* #undef HAVE_SYS_POLL_H */ +/* Define to 1 if you have the <sys/queue.h> header file. */+/* #undef HAVE_SYS_QUEUE_H */+ /* Define to 1 if you have the <sys/richacl.h> header file. */ /* #undef HAVE_SYS_RICHACL_H */ @@ -1138,7 +1175,7 @@ /* #undef HAVE_UNLINKAT */  /* Define to 1 if you have the `unsetenv' function. */-/* #undef HAVE_UNSETENV */+#define HAVE_UNSETENV 1  /* Define to 1 if the system has the type `unsigned long long'. */ #define HAVE_UNSIGNED_LONG_LONG 1@@ -1213,37 +1250,28 @@ /* #undef HAVE_WORKING_FS_IOC_GETFLAGS */  /* Define to 1 if you have the <zlib.h> header file. */-#define HAVE_ZLIB_H 1+/* #undef HAVE_ZLIB_H */  /* Define to 1 if you have the <zstd.h> header file. */ /* #undef HAVE_ZSTD_H */ -/* Define to 1 if you have the `_ctime64_s' function. */-#define HAVE__CTIME64_S 1- /* Define to 1 if you have the `_fseeki64' function. */ #define HAVE__FSEEKI64 1  /* Define to 1 if you have the `_get_timezone' function. */ /* #undef HAVE__GET_TIMEZONE */ -/* Define to 1 if you have the `_gmtime64_s' function. */-#define HAVE__GMTIME64_S 1--/* Define to 1 if you have the `_localtime64_s' function. */-#define HAVE__LOCALTIME64_S 1--/* Define to 1 if you have the `_mkgmtime64' function. */-#define HAVE__MKGMTIME64 1+/* _mkgmtime function */+/* #undef HAVE__MKGMTIME */  /* Define as const if the declaration of iconv() needs const. */ /* #undef ICONV_CONST */  /* Version number of libarchive as a single integer */-#define LIBARCHIVE_VERSION_NUMBER "3005003"+#define LIBARCHIVE_VERSION_NUMBER "3007001"  /* Version number of libarchive */-#define LIBARCHIVE_VERSION_STRING "3.5.3"+#define LIBARCHIVE_VERSION_STRING "3.7.1"  /* Define to 1 if `lstat' dereferences a symlink specified with a trailing    slash. */@@ -1273,7 +1301,7 @@ #define PACKAGE_NAME "libarchive"  /* Define to the full name and version of this package. */-#define PACKAGE_STRING "libarchive 3.5.3"+#define PACKAGE_STRING "libarchive 3.7.1"  /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "libarchive"@@ -1282,58 +1310,124 @@ #define PACKAGE_URL ""  /* Define to the version of this package. */-#define PACKAGE_VERSION "3.5.3"+#define PACKAGE_VERSION "3.7.1"  /* Define to 1 if PCRE_STATIC needs to be defined. */ /* #undef PCRE_STATIC */ +/* The number of bytes in type int */+#define SIZEOF_INT 4++/* The number of bytes in type long */+#define SIZEOF_LONG 4+ /* The size of `wchar_t', as computed by sizeof. */ #define SIZEOF_WCHAR_T 2 -/* Define to 1 if you have the ANSI C header files. */+/* Define to 1 if all of the C90 standard headers exist (not just the ones+   required in a freestanding environment). This macro is provided for+   backward compatibility; new code need not use it. */ #define STDC_HEADERS 1  /* Define to 1 if strerror_r returns char *. */ /* #undef STRERROR_R_CHAR_P */ -/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */-#define TIME_WITH_SYS_TIME 1- /* Enable extensions on AIX 3, Interix.  */ #ifndef _ALL_SOURCE # define _ALL_SOURCE 1 #endif+/* Enable general extensions on macOS.  */+#ifndef _DARWIN_C_SOURCE+# define _DARWIN_C_SOURCE 1+#endif+/* Enable general extensions on Solaris.  */+#ifndef __EXTENSIONS__+# define __EXTENSIONS__ 1+#endif /* Enable GNU extensions on systems that have them.  */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif-/* Enable threading extensions on Solaris.  */+/* Enable X/Open compliant socket functions that do not require linking+   with -lxnet on HP-UX 11.11.  */+#ifndef _HPUX_ALT_XOPEN_SOCKET_API+# define _HPUX_ALT_XOPEN_SOCKET_API 1+#endif+/* Identify the host operating system as Minix.+   This macro does not affect the system headers' behavior.+   A future release of Autoconf may stop defining this macro.  */+#ifndef _MINIX+/* # undef _MINIX */+#endif+/* Enable general extensions on NetBSD.+   Enable NetBSD compatibility extensions on Minix.  */+#ifndef _NETBSD_SOURCE+# define _NETBSD_SOURCE 1+#endif+/* Enable OpenBSD compatibility extensions on NetBSD.+   Oddly enough, this does nothing on OpenBSD.  */+#ifndef _OPENBSD_SOURCE+# define _OPENBSD_SOURCE 1+#endif+/* Define to 1 if needed for POSIX-compatible behavior.  */+#ifndef _POSIX_SOURCE+/* # undef _POSIX_SOURCE */+#endif+/* Define to 2 if needed for POSIX-compatible behavior.  */+#ifndef _POSIX_1_SOURCE+/* # undef _POSIX_1_SOURCE */+#endif+/* Enable POSIX-compatible threading on Solaris.  */ #ifndef _POSIX_PTHREAD_SEMANTICS # define _POSIX_PTHREAD_SEMANTICS 1 #endif+/* Enable extensions specified by ISO/IEC TS 18661-5:2014.  */+#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__+# define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1+#endif+/* Enable extensions specified by ISO/IEC TS 18661-1:2014.  */+#ifndef __STDC_WANT_IEC_60559_BFP_EXT__+# define __STDC_WANT_IEC_60559_BFP_EXT__ 1+#endif+/* Enable extensions specified by ISO/IEC TS 18661-2:2015.  */+#ifndef __STDC_WANT_IEC_60559_DFP_EXT__+# define __STDC_WANT_IEC_60559_DFP_EXT__ 1+#endif+/* Enable extensions specified by ISO/IEC TS 18661-4:2015.  */+#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__+# define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1+#endif+/* Enable extensions specified by ISO/IEC TS 18661-3:2015.  */+#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__+# define __STDC_WANT_IEC_60559_TYPES_EXT__ 1+#endif+/* Enable extensions specified by ISO/IEC TR 24731-2:2010.  */+#ifndef __STDC_WANT_LIB_EXT2__+# define __STDC_WANT_LIB_EXT2__ 1+#endif+/* Enable extensions specified by ISO/IEC 24747:2009.  */+#ifndef __STDC_WANT_MATH_SPEC_FUNCS__+# define __STDC_WANT_MATH_SPEC_FUNCS__ 1+#endif /* Enable extensions on HP NonStop.  */ #ifndef _TANDEM_SOURCE # define _TANDEM_SOURCE 1 #endif-/* Enable general extensions on Solaris.  */-#ifndef __EXTENSIONS__-# define __EXTENSIONS__ 1+/* Enable X/Open extensions.  Define to 500 only if necessary+   to make mbstate_t available.  */+#ifndef _XOPEN_SOURCE+/* # undef _XOPEN_SOURCE */ #endif   /* Version number of package */-#define VERSION "3.5.3"+#define VERSION "3.7.1"  /* Define to '0x0502' for Windows Server 2003 APIs. */ #define WINVER 0x0502 -/* Enable large inode numbers on Mac OS X 10.5.  */-#ifndef _DARWIN_USE_64_BIT_INODE-# define _DARWIN_USE_64_BIT_INODE 1-#endif- /* Number of bits in a file offset, on hosts where this is settable. */-#define _FILE_OFFSET_BITS 64+/* #undef _FILE_OFFSET_BITS */  /* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ /* #undef _LARGEFILE_SOURCE */@@ -1341,16 +1435,6 @@ /* Define for large files, on AIX-style hosts. */ /* #undef _LARGE_FILES */ -/* Define to 1 if on MINIX. */-/* #undef _MINIX */--/* Define to 2 if the system does not provide POSIX.1 features except with-   this defined. */-/* #undef _POSIX_1_SOURCE */--/* Define to 1 if you need to in order for `stat' and other things to work. */-/* #undef _POSIX_SOURCE */- /* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,    <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the    #define below would cause a syntax error. */@@ -1433,3 +1517,5 @@  /* Define to `unsigned int' if <sys/types.h> does not define. */ /* #undef uintptr_t */+#define HAVE_LIBZ 1+#define HAVE_ZLIB_H 1
c/config_freebsd.h view
@@ -111,6 +111,8 @@ #define HAVE_FCNTL 1 #define HAVE_FCNTL_H 1 #define HAVE_FDOPENDIR 1+#define HAVE_FNMATCH 1+#define HAVE_FNMATCH_H 1 #define HAVE_FORK 1 #define HAVE_FSEEKO 1 #define HAVE_FSTAT 1@@ -123,6 +125,8 @@ #define HAVE_GETEUID 1 #define HAVE_GETGRGID_R 1 #define HAVE_GETGRNAM_R 1+#define HAVE_GETLINE 1+#define HAVE_GETOPT_OPTRESET 1 #define HAVE_GETPID 1 #define HAVE_GETPWNAM_R 1 #define HAVE_GETPWUID_R 1@@ -201,6 +205,7 @@ #define HAVE_SYS_MOUNT_H 1 #define HAVE_SYS_PARAM_H 1 #define HAVE_SYS_POLL_H 1+#define HAVE_SYS_QUEUE_H 1 #define HAVE_SYS_SELECT_H 1 #define HAVE_SYS_STATVFS_H 1 #define HAVE_SYS_STAT_H 1@@ -234,7 +239,15 @@ #define HAVE_WMEMCPY 1 #define HAVE_WMEMMOVE 1 #define HAVE_ZLIB_H 1-#define TIME_WITH_SYS_TIME 1+#define HAVE_SYS_TIME_H 1++#if __FreeBSD_version >= 800505+#define HAVE_LIBLZMA 1+#define HAVE_LZMA_H 1+#if __FreeBSD_version >= 1002504+#define HAVE_LZMA_STREAM_ENCODER_MT 1+#endif+#endif  #if __FreeBSD_version >= 1100056 #define HAVE_FUTIMENS 1
c/filter_fork_posix.c view
@@ -76,7 +76,7 @@ __archive_create_child(const char *cmd, int *child_stdin, int *child_stdout, 		pid_t *out_child) {-	pid_t child;+	pid_t child = -1; 	int stdin_pipe[2], stdout_pipe[2], tmp; #if HAVE_POSIX_SPAWNP 	posix_spawn_file_actions_t actions;
c/filter_fork_windows.c view
@@ -31,6 +31,44 @@  #include "filter_fork.h" +#if !defined(WINAPI_FAMILY_PARTITION) || WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)+/* There are some editions of Windows ("nano server," for example) that+ * do not host user32.dll. If we want to keep running on those editions,+ * we need to delay-load WaitForInputIdle. */+static void *+la_GetFunctionUser32(const char *name)+{+	static HINSTANCE lib;+	static int set;+	if (!set) {+		set = 1;+		lib = LoadLibrary(TEXT("user32.dll"));+	}+	if (lib == NULL) {+		return NULL;+	}+	return (void *)GetProcAddress(lib, name);+}++static int+la_WaitForInputIdle(HANDLE hProcess, DWORD dwMilliseconds)+{+	static DWORD (WINAPI *f)(HANDLE, DWORD);+	static int set;++	if (!set) {+		set = 1;+		f = la_GetFunctionUser32("WaitForInputIdle");+	}++	if (!f) {+		/* An inability to wait for input idle is+		 * not _good_, but it is not catastrophic. */+		return WAIT_FAILED;+	}+	return (*f)(hProcess, dwMilliseconds);+}+ int __archive_create_child(const char *cmd, int *child_stdin, int *child_stdout, 		HANDLE *out_child)@@ -149,7 +187,7 @@ 	if (CreateProcessA(fullpath.s, cmdline.s, NULL, NULL, TRUE, 0, 	      NULL, NULL, &staInfo, &childInfo) == 0) 		goto fail;-	WaitForInputIdle(childInfo.hProcess, INFINITE);+	la_WaitForInputIdle(childInfo.hProcess, INFINITE); 	CloseHandle(childInfo.hProcess); 	CloseHandle(childInfo.hThread); @@ -187,6 +225,14 @@ 	__archive_cmdline_free(acmd); 	return ARCHIVE_FAILED; }+#else /* !WINAPI_PARTITION_DESKTOP */+int+__archive_create_child(const char *cmd, int *child_stdin, int *child_stdout, HANDLE *out_child)+{+	(void)cmd; (void)child_stdin; (void) child_stdout; (void) out_child;+	return ARCHIVE_FAILED;+}+#endif /* !WINAPI_PARTITION_DESKTOP */  void __archive_check_child(int in, int out)
c/xxhash.c view
@@ -149,6 +149,10 @@  #if GCC_VERSION >= 409 __attribute__((__no_sanitize_undefined__))+#else+#  if defined(__clang__)+__attribute__((no_sanitize("undefined")))+#  endif #endif #if defined(_MSC_VER) static __inline U32 A32(const void * x)
libarchive.cabal view
@@ -1,14 +1,11 @@ cabal-version:      3.0 name:               libarchive-version:            3.0.3.2+version:            3.0.4.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 ==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.7 ghc ==9.0.2 ghc ==9.2.1  bug-reports:        https://github.com/vmchale/libarchive/issues synopsis:           Haskell interface to libarchive@@ -38,8 +35,8 @@  custom-setup     setup-depends:-        base,-        Cabal,+        base <=4,+        Cabal <=3,         chs-cabal  flag cross@@ -288,7 +285,7 @@                         build-depends: unbuildable <0      else-        pkgconfig-depends: libarchive (==3.5.2 || >3.5.2) && <4.0+        pkgconfig-depends: libarchive (==3.6.0 || >3.6.0) && <4.0  executable archive     main-is:          Main.hs@@ -365,7 +362,6 @@         criterion,         bytestring,         tar,-        tar-conduit >=0.2.5,         temporary      if impl(ghc >=8.0)
src/Codec/Archive/Foreign/Archive/Macros.chs view
@@ -34,6 +34,7 @@                                             , archiveReadDiskNoXattr                                             , archiveReadDiskNoAcl                                             , archiveReadDiskNoFFlags+                                            , archiveReadDiskNoSparse                                             -- * Conversion functions                                             , encryptionResult                                             ) where@@ -149,6 +150,10 @@ -- | @since 2.1.1.0 archiveReadDiskNoFFlags :: ReadDiskFlags archiveReadDiskNoFFlags = ReadDiskFlags {# const ARCHIVE_READDISK_NO_FFLAGS #}++-- | @since 3.0.4.0+archiveReadDiskNoSparse :: ReadDiskFlags+archiveReadDiskNoSparse = ReadDiskFlags {# const ARCHIVE_READDISK_NO_SPARSE #}  archiveMatchMTime :: TimeFlag archiveMatchMTime = TimeFlag {# const ARCHIVE_MATCH_MTIME #}