aboutsummaryrefslogtreecommitdiff
path: root/lib/libarchive
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libarchive')
-rw-r--r--lib/libarchive/archive.h15
-rw-r--r--lib/libarchive/archive_read.c2
-rw-r--r--lib/libarchive/archive_read_support_compression_bzip2.c2
-rw-r--r--lib/libarchive/archive_read_support_compression_uu.c4
-rw-r--r--lib/libarchive/archive_read_support_format_cpio.c6
-rw-r--r--lib/libarchive/archive_read_support_format_iso9660.c22
-rw-r--r--lib/libarchive/archive_read_support_format_tar.c2
-rw-r--r--lib/libarchive/archive_read_support_format_zip.c2
-rw-r--r--lib/libarchive/archive_string.h7
-rw-r--r--lib/libarchive/archive_write_disk.c2
-rw-r--r--lib/libarchive/archive_write_set_compression_xz.c3
-rw-r--r--lib/libarchive/archive_write_set_format_ar.c2
-rw-r--r--lib/libarchive/archive_write_set_format_shar.c3
-rw-r--r--lib/libarchive/archive_write_set_format_ustar.c2
-rw-r--r--lib/libarchive/config_freebsd.h1
-rw-r--r--lib/libarchive/libarchive-formats.51
-rw-r--r--lib/libarchive/libarchive.32
-rw-r--r--lib/libarchive/test/Makefile2
-rw-r--r--lib/libarchive/test/test_compat_zip.c2
-rw-r--r--lib/libarchive/test/test_read_format_iso_Z.c (renamed from lib/libarchive/test/test_read_format_iso_gz.c)6
20 files changed, 51 insertions, 37 deletions
diff --git a/lib/libarchive/archive.h b/lib/libarchive/archive.h
index 7075e2618b00..bac93f01fd4d 100644
--- a/lib/libarchive/archive.h
+++ b/lib/libarchive/archive.h
@@ -52,7 +52,7 @@
/* These should match the types used in 'struct stat' */
#if defined(_WIN32) && !defined(__CYGWIN__)
#define __LA_INT64_T __int64
-# if defined(_SSIZE_T_DEFINED)
+# if defined(_SSIZE_T_DEFINED) || defined(_SSIZE_T_)
# define __LA_SSIZE_T ssize_t
# elif defined(_WIN64)
# define __LA_SSIZE_T __int64
@@ -98,6 +98,13 @@
# define __LA_DECL
#endif
+#if defined(__GNUC__) && __GNUC__ >= 3
+#define __LA_PRINTF(fmtarg, firstvararg) \
+ __attribute__((__format__ (__printf__, fmtarg, firstvararg)))
+#else
+#define __LA_PRINTF(fmtarg, firstvararg) /* nothing */
+#endif
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -129,13 +136,13 @@ extern "C" {
* (ARCHIVE_API_VERSION * 1000000 + ARCHIVE_API_FEATURE * 1000)
* #endif
*/
-#define ARCHIVE_VERSION_NUMBER 2008004
+#define ARCHIVE_VERSION_NUMBER 2008005
__LA_DECL int archive_version_number(void);
/*
* Textual name/version of the library, useful for version displays.
*/
-#define ARCHIVE_VERSION_STRING "libarchive 2.8.4"
+#define ARCHIVE_VERSION_STRING "libarchive 2.8.5"
__LA_DECL const char * archive_version_string(void);
#if ARCHIVE_VERSION_NUMBER < 3000000
@@ -717,7 +724,7 @@ __LA_DECL const char *archive_format_name(struct archive *);
__LA_DECL int archive_format(struct archive *);
__LA_DECL void archive_clear_error(struct archive *);
__LA_DECL void archive_set_error(struct archive *, int _err,
- const char *fmt, ...);
+ const char *fmt, ...) __LA_PRINTF(3, 4);
__LA_DECL void archive_copy_error(struct archive *dest,
struct archive *src);
__LA_DECL int archive_file_count(struct archive *);
diff --git a/lib/libarchive/archive_read.c b/lib/libarchive/archive_read.c
index 7873d45a5708..fb72407b8f75 100644
--- a/lib/libarchive/archive_read.c
+++ b/lib/libarchive/archive_read.c
@@ -715,7 +715,7 @@ archive_read_data_block(struct archive *_a,
/*
* Close the file and release most resources.
*
- * Be careful: client might just call read_new and then read_finish.
+ * Be careful: client might just call read_new and then read_free.
* Don't assume we actually read anything or performed any non-trivial
* initialization.
*/
diff --git a/lib/libarchive/archive_read_support_compression_bzip2.c b/lib/libarchive/archive_read_support_compression_bzip2.c
index fc419d4cab60..891742f653fd 100644
--- a/lib/libarchive/archive_read_support_compression_bzip2.c
+++ b/lib/libarchive/archive_read_support_compression_bzip2.c
@@ -350,4 +350,4 @@ bzip2_filter_close(struct archive_read_filter *self)
return (ret);
}
-#endif /* HAVE_BZLIB_H */
+#endif /* HAVE_BZLIB_H && BZ_CONFIG_ERROR */
diff --git a/lib/libarchive/archive_read_support_compression_uu.c b/lib/libarchive/archive_read_support_compression_uu.c
index cb1dae504e09..1b6a54c16326 100644
--- a/lib/libarchive/archive_read_support_compression_uu.c
+++ b/lib/libarchive/archive_read_support_compression_uu.c
@@ -488,9 +488,9 @@ read_more:
switch (uudecode->state) {
default:
case ST_FIND_HEAD:
- if (len - nl > 13 && memcmp(b, "begin ", 6) == 0)
+ if (len - nl >= 11 && memcmp(b, "begin ", 6) == 0)
l = 6;
- else if (len - nl > 18 &&
+ else if (len - nl >= 18 &&
memcmp(b, "begin-base64 ", 13) == 0)
l = 13;
else
diff --git a/lib/libarchive/archive_read_support_format_cpio.c b/lib/libarchive/archive_read_support_format_cpio.c
index 24f3d35b30ed..790fa7a12a44 100644
--- a/lib/libarchive/archive_read_support_format_cpio.c
+++ b/lib/libarchive/archive_read_support_format_cpio.c
@@ -264,9 +264,9 @@ archive_read_format_cpio_read_header(struct archive_read *a,
/* Compare name to "TRAILER!!!" to test for end-of-archive. */
if (namelength == 11 && strcmp((const char *)h, "TRAILER!!!") == 0) {
- /* TODO: Store file location of start of block. */
- archive_set_error(&a->archive, 0, NULL);
- return (ARCHIVE_EOF);
+ /* TODO: Store file location of start of block. */
+ archive_clear_error(&a->archive);
+ return (ARCHIVE_EOF);
}
/* Detect and record hardlinks to previously-extracted entries. */
diff --git a/lib/libarchive/archive_read_support_format_iso9660.c b/lib/libarchive/archive_read_support_format_iso9660.c
index 021646112b3d..6d8d304c7807 100644
--- a/lib/libarchive/archive_read_support_format_iso9660.c
+++ b/lib/libarchive/archive_read_support_format_iso9660.c
@@ -934,14 +934,14 @@ read_children(struct archive_read *a, struct file_info *parent)
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
"Ignoring out-of-order directory (%s) %jd > %jd",
parent->name.s,
- iso9660->current_position,
- parent->offset);
+ (intmax_t)iso9660->current_position,
+ (intmax_t)parent->offset);
return (ARCHIVE_WARN);
}
if (parent->offset + parent->size > iso9660->volume_size) {
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
"Directory is beyond end-of-media: %s",
- parent->name);
+ parent->name.s);
return (ARCHIVE_WARN);
}
if (iso9660->current_position < parent->offset) {
@@ -1139,7 +1139,7 @@ archive_read_format_iso9660_read_header(struct archive_read *a,
if (file->offset + file->size > iso9660->volume_size) {
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
- "File is beyond end-of-media: %s", file->name);
+ "File is beyond end-of-media: %s", file->name.s);
iso9660->entry_bytes_remaining = 0;
iso9660->entry_sparse_offset = 0;
return (ARCHIVE_WARN);
@@ -1198,10 +1198,10 @@ archive_read_format_iso9660_read_header(struct archive_read *a,
if ((file->mode & AE_IFMT) != AE_IFDIR &&
file->offset < iso9660->current_position) {
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
- "Ignoring out-of-order file @%x (%s) %jd < %jd",
- file,
+ "Ignoring out-of-order file (%s) %jd < %jd",
iso9660->pathname.s,
- file->offset, iso9660->current_position);
+ (intmax_t)file->offset,
+ (intmax_t)iso9660->current_position);
iso9660->entry_bytes_remaining = 0;
iso9660->entry_sparse_offset = 0;
return (ARCHIVE_WARN);
@@ -1524,8 +1524,8 @@ archive_read_format_iso9660_read_data(struct archive_read *a,
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
"Ignoring out-of-order file (%s) %jd < %jd",
iso9660->pathname.s,
- iso9660->entry_content->offset,
- iso9660->current_position);
+ (intmax_t)iso9660->entry_content->offset,
+ (intmax_t)iso9660->current_position);
*buff = NULL;
*size = 0;
*offset = iso9660->entry_sparse_offset;
@@ -1626,8 +1626,8 @@ parse_file_info(struct archive_read *a, struct file_info *parent,
*/
if (location > 0 &&
(location + ((fsize + iso9660->logical_block_size -1)
- / iso9660->logical_block_size)) >
- (unsigned int)iso9660->volume_block) {
+ / iso9660->logical_block_size))
+ > (uint32_t)iso9660->volume_block) {
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
"Invalid location of extent of file");
return (NULL);
diff --git a/lib/libarchive/archive_read_support_format_tar.c b/lib/libarchive/archive_read_support_format_tar.c
index 20e1293c15c6..62be309382f5 100644
--- a/lib/libarchive/archive_read_support_format_tar.c
+++ b/lib/libarchive/archive_read_support_format_tar.c
@@ -576,7 +576,7 @@ tar_read_header(struct archive_read *a, struct tar *tar,
h = __archive_read_ahead(a, 512, NULL);
if (h != NULL)
__archive_read_consume(a, 512);
- archive_set_error(&a->archive, 0, NULL);
+ archive_clear_error(&a->archive);
if (a->archive.archive_format_name == NULL) {
a->archive.archive_format = ARCHIVE_FORMAT_TAR;
a->archive.archive_format_name = "tar";
diff --git a/lib/libarchive/archive_read_support_format_zip.c b/lib/libarchive/archive_read_support_format_zip.c
index 0fa1fa391d58..a02a2c290e0e 100644
--- a/lib/libarchive/archive_read_support_format_zip.c
+++ b/lib/libarchive/archive_read_support_format_zip.c
@@ -211,7 +211,7 @@ archive_read_format_zip_bid(struct archive_read *a)
/* Get 4k of data beyond where we stopped. */
buff = __archive_read_ahead(a, offset + 4096,
&bytes_avail);
- if (bytes_avail < offset + 1)
+ if (buff == NULL)
break;
p = (const char *)buff + offset;
while (p + 9 < (const char *)buff + bytes_avail) {
diff --git a/lib/libarchive/archive_string.h b/lib/libarchive/archive_string.h
index 68fbf167e734..f0655d143deb 100644
--- a/lib/libarchive/archive_string.h
+++ b/lib/libarchive/archive_string.h
@@ -44,6 +44,8 @@
#include <wchar.h>
#endif
+#include "archive.h"
+
/*
* Basic resizable/reusable string support a la Java's "StringBuffer."
*
@@ -134,10 +136,11 @@ void __archive_string_free(struct archive_string *);
/* Like 'vsprintf', but resizes the underlying string as necessary. */
void __archive_string_vsprintf(struct archive_string *, const char *,
- va_list);
+ va_list) __LA_PRINTF(2, 0);
#define archive_string_vsprintf __archive_string_vsprintf
-void __archive_string_sprintf(struct archive_string *, const char *, ...);
+void __archive_string_sprintf(struct archive_string *, const char *, ...)
+ __LA_PRINTF(2, 3);
#define archive_string_sprintf __archive_string_sprintf
/* Allocates a fresh buffer and converts as (assumed to be UTF-8) into it.
diff --git a/lib/libarchive/archive_write_disk.c b/lib/libarchive/archive_write_disk.c
index 8a4fd0412adb..23192201fabc 100644
--- a/lib/libarchive/archive_write_disk.c
+++ b/lib/libarchive/archive_write_disk.c
@@ -1730,7 +1730,7 @@ create_dir(struct archive_write_disk *a, char *path)
if (unlink(path) != 0) {
archive_set_error(&a->archive, errno,
"Can't create directory '%s': "
- "Conflicting file cannot be removed");
+ "Conflicting file cannot be removed", path);
return (ARCHIVE_FAILED);
}
} else if (errno != ENOENT && errno != ENOTDIR) {
diff --git a/lib/libarchive/archive_write_set_compression_xz.c b/lib/libarchive/archive_write_set_compression_xz.c
index d97bca7e512b..15b6cc273907 100644
--- a/lib/libarchive/archive_write_set_compression_xz.c
+++ b/lib/libarchive/archive_write_set_compression_xz.c
@@ -132,9 +132,10 @@ static int
archive_compressor_xz_init_stream(struct archive_write *a,
struct private_data *state)
{
+ static const lzma_stream lzma_stream_init_data = LZMA_STREAM_INIT;
int ret;
- state->stream = (lzma_stream)LZMA_STREAM_INIT;
+ state->stream = lzma_stream_init_data;
state->stream.next_out = state->compressed;
state->stream.avail_out = state->compressed_buffer_size;
if (a->archive.compression_code == ARCHIVE_COMPRESSION_XZ)
diff --git a/lib/libarchive/archive_write_set_format_ar.c b/lib/libarchive/archive_write_set_format_ar.c
index bffe07cba8f5..cb8ddaa203e7 100644
--- a/lib/libarchive/archive_write_set_format_ar.c
+++ b/lib/libarchive/archive_write_set_format_ar.c
@@ -440,7 +440,7 @@ archive_write_ar_finish_entry(struct archive_write *a)
if (ar->entry_padding != 1) {
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
"Padding wrong size: %d should be 1 or 0",
- ar->entry_padding);
+ (int)ar->entry_padding);
return (ARCHIVE_WARN);
}
diff --git a/lib/libarchive/archive_write_set_format_shar.c b/lib/libarchive/archive_write_set_format_shar.c
index 6cb58e863771..bd6276846658 100644
--- a/lib/libarchive/archive_write_set_format_shar.c
+++ b/lib/libarchive/archive_write_set_format_shar.c
@@ -537,8 +537,7 @@ archive_write_shar_finish_entry(struct archive_write *a)
}
if ((p = archive_entry_fflags_text(shar->entry)) != NULL) {
- archive_string_sprintf(&shar->work, "chflags %s ",
- p, archive_entry_pathname(shar->entry));
+ archive_string_sprintf(&shar->work, "chflags %s ", p);
shar_quote(&shar->work,
archive_entry_pathname(shar->entry), 1);
archive_strcat(&shar->work, "\n");
diff --git a/lib/libarchive/archive_write_set_format_ustar.c b/lib/libarchive/archive_write_set_format_ustar.c
index 2de0cf1db2ba..54893d487492 100644
--- a/lib/libarchive/archive_write_set_format_ustar.c
+++ b/lib/libarchive/archive_write_set_format_ustar.c
@@ -168,7 +168,7 @@ archive_write_set_format_ustar(struct archive *_a)
/* Basic internal sanity test. */
if (sizeof(template_header) != 512) {
- archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "Internal: template_header wrong size: %d should be 512", sizeof(template_header));
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "Internal: template_header wrong size: %d should be 512", (int)sizeof(template_header));
return (ARCHIVE_FATAL);
}
diff --git a/lib/libarchive/config_freebsd.h b/lib/libarchive/config_freebsd.h
index a39a1fba4745..b4694ea136e4 100644
--- a/lib/libarchive/config_freebsd.h
+++ b/lib/libarchive/config_freebsd.h
@@ -68,6 +68,7 @@
#endif
#define HAVE_BSDXML_H 1
+#define HAVE_BZLIB_H 1
#define HAVE_CHFLAGS 1
#define HAVE_CHOWN 1
#define HAVE_DECL_EXTATTR_NAMESPACE_USER 1
diff --git a/lib/libarchive/libarchive-formats.5 b/lib/libarchive/libarchive-formats.5
index ef4b6ca6255b..e6849b90bea5 100644
--- a/lib/libarchive/libarchive-formats.5
+++ b/lib/libarchive/libarchive-formats.5
@@ -65,6 +65,7 @@ Later variants have extended this by either appropriating undefined
areas of the header record, extending the header to multiple records,
or by storing special entries that modify the interpretation of
subsequent entries.
+.Pp
.Bl -tag -width indent
.It Cm gnutar
The
diff --git a/lib/libarchive/libarchive.3 b/lib/libarchive/libarchive.3
index 115a79c0f16f..70059dcdc34c 100644
--- a/lib/libarchive/libarchive.3
+++ b/lib/libarchive/libarchive.3
@@ -177,6 +177,8 @@ which provides a slightly more efficient interface.
You may prefer to use the higher-level
.Fn archive_read_data_skip ,
which reads and discards the data for this entry,
+.Fn archive_read_data_to_buffer ,
+which reads the data into an in-memory buffer,
.Fn archive_read_data_to_file ,
which copies the data to the provided file descriptor, or
.Fn archive_read_extract ,
diff --git a/lib/libarchive/test/Makefile b/lib/libarchive/test/Makefile
index ba72db772811..e05ff1f16323 100644
--- a/lib/libarchive/test/Makefile
+++ b/lib/libarchive/test/Makefile
@@ -52,7 +52,7 @@ TESTS= \
test_read_format_gtar_gz.c \
test_read_format_gtar_lzma.c \
test_read_format_gtar_sparse.c \
- test_read_format_iso_gz.c \
+ test_read_format_iso_Z.c \
test_read_format_iso_multi_extent.c \
test_read_format_isorr_rr_moved.c \
test_read_format_isojoliet_bz2.c \
diff --git a/lib/libarchive/test/test_compat_zip.c b/lib/libarchive/test/test_compat_zip.c
index adb377c759da..7c1bde7e8b6b 100644
--- a/lib/libarchive/test/test_compat_zip.c
+++ b/lib/libarchive/test/test_compat_zip.c
@@ -67,7 +67,7 @@ finish:
#if ARCHIVE_VERSION_NUMBER < 2000000
archive_read_finish(a);
#else
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
#endif
}
diff --git a/lib/libarchive/test/test_read_format_iso_gz.c b/lib/libarchive/test/test_read_format_iso_Z.c
index d0d6b3c1a1f9..2d60d41b4707 100644
--- a/lib/libarchive/test/test_read_format_iso_gz.c
+++ b/lib/libarchive/test/test_read_format_iso_Z.c
@@ -47,7 +47,7 @@ test1(void)
ARCHIVE_COMPRESSION_COMPRESS);
assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ISO9660);
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
static
@@ -87,10 +87,10 @@ void test2(void)
ARCHIVE_COMPRESSION_COMPRESS);
assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ISO9660);
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
-DEFINE_TEST(test_read_format_iso_gz)
+DEFINE_TEST(test_read_format_iso_Z)
{
test1();
test2();