From bcd2ffcdc2bdf4551e249ea3f75de6bbb5bfef02 Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Sun, 13 Dec 2020 15:29:19 +0000 Subject: [PATCH] Update vendor/libarchive/dist to b2c3ee7e2907511533eeb2a0f2ceecc1faa73185 Vendor changes: Issue #1461: Unbreak build without lzma Issue #1462: warc reader: Fix build with gcc11 Issue #1463: Fix code compatibility in test_archive_read_support.c Issue #1464: Use built-in strnlen on platforms where not available Issue #1465: warc reader: fix undefined behaviour in deconst() function --- CMakeLists.txt | 3 ++- build/cmake/config.h.in | 3 +++ build/version | 2 +- configure.ac | 8 +++---- contrib/libarchive.spec | 2 +- libarchive/archive.h | 4 ++-- libarchive/archive_entry.h | 2 +- .../archive_read_support_format_mtree.c | 23 ++++++++++++++++++- libarchive/archive_read_support_format_warc.c | 4 ++-- libarchive/archive_read_support_format_zip.c | 2 ++ libarchive/test/test_archive_read_support.c | 4 +++- 11 files changed, 43 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b2634da6fa59..9d8fc3c46dc0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,7 @@ endif() # RelWithDebInfo : Release build with Debug Info # MinSizeRel : Release Min Size build IF(NOT CMAKE_BUILD_TYPE) - SET(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build Type" FORCE) + SET(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build Type" FORCE) ENDIF(NOT CMAKE_BUILD_TYPE) # Set a value type to properly display CMAKE_BUILD_TYPE on GUI if the # value type is "UNINITIALIZED". @@ -1378,6 +1378,7 @@ CHECK_FUNCTION_EXISTS_GLIBC(strchr HAVE_STRCHR) CHECK_FUNCTION_EXISTS_GLIBC(strdup HAVE_STRDUP) CHECK_FUNCTION_EXISTS_GLIBC(strerror HAVE_STRERROR) CHECK_FUNCTION_EXISTS_GLIBC(strncpy_s HAVE_STRNCPY_S) +CHECK_FUNCTION_EXISTS_GLIBC(strnlen HAVE_STRNLEN) CHECK_FUNCTION_EXISTS_GLIBC(strrchr HAVE_STRRCHR) CHECK_FUNCTION_EXISTS_GLIBC(symlink HAVE_SYMLINK) CHECK_FUNCTION_EXISTS_GLIBC(timegm HAVE_TIMEGM) diff --git a/build/cmake/config.h.in b/build/cmake/config.h.in index 6d2fa746927c..ff629f9ceb4a 100644 --- a/build/cmake/config.h.in +++ b/build/cmake/config.h.in @@ -959,6 +959,9 @@ typedef uint64_t uintmax_t; /* Define to 1 if you have the `strchr' function. */ #cmakedefine HAVE_STRCHR 1 +/* Define to 1 if you have the `strnlen' function. */ +#cmakedefine HAVE_STRNLEN 1 + /* Define to 1 if you have the `strdup' function. */ #cmakedefine HAVE_STRDUP 1 diff --git a/build/version b/build/version index 4c8608b0a0f6..ea39081c3023 100644 --- a/build/version +++ b/build/version @@ -1 +1 @@ -3005000 +3005001dev diff --git a/configure.ac b/configure.ac index a2172c824905..cb823bd473a2 100644 --- a/configure.ac +++ b/configure.ac @@ -4,8 +4,8 @@ dnl First, define all of the version numbers up front. dnl In particular, this allows the version macro to be used in AC_INIT dnl These first two version numbers are updated automatically on each release. -m4_define([LIBARCHIVE_VERSION_S],[3.5.0]) -m4_define([LIBARCHIVE_VERSION_N],[3005000]) +m4_define([LIBARCHIVE_VERSION_S],[3.5.1dev]) +m4_define([LIBARCHIVE_VERSION_N],[3005001]) dnl bsdtar and bsdcpio versioning tracks libarchive m4_define([BSDTAR_VERSION_S],LIBARCHIVE_VERSION_S()) @@ -654,8 +654,8 @@ AC_CHECK_FUNCS([mkdir mkfifo mknod mkstemp]) AC_CHECK_FUNCS([nl_langinfo openat pipe poll posix_spawnp readlink readlinkat]) AC_CHECK_FUNCS([readpassphrase]) AC_CHECK_FUNCS([select setenv setlocale sigaction statfs statvfs]) -AC_CHECK_FUNCS([strchr strdup strerror strncpy_s strrchr symlink timegm]) -AC_CHECK_FUNCS([tzset unlinkat unsetenv utime utimensat utimes vfork]) +AC_CHECK_FUNCS([strchr strdup strerror strncpy_s strnlen strrchr symlink]) +AC_CHECK_FUNCS([timegm tzset unlinkat unsetenv utime utimensat utimes vfork]) AC_CHECK_FUNCS([wcrtomb wcscmp wcscpy wcslen wctomb wmemcmp wmemcpy wmemmove]) AC_CHECK_FUNCS([_ctime64_s _fseeki64]) AC_CHECK_FUNCS([_get_timezone _gmtime64_s _localtime64_s _mkgmtime64]) diff --git a/contrib/libarchive.spec b/contrib/libarchive.spec index 211b391e9173..6ef8957f176e 100644 --- a/contrib/libarchive.spec +++ b/contrib/libarchive.spec @@ -1,5 +1,5 @@ Name: {{{ git_name }}} -Version: {{{ git_version lead=3 follow=4 }}} +Version: {{{ git_version lead=3 follow=5 }}} Release: 1%{?dist} Summary: A library for handling streaming archive formats diff --git a/libarchive/archive.h b/libarchive/archive.h index d7ef495a435f..48abb3bc994e 100644 --- a/libarchive/archive.h +++ b/libarchive/archive.h @@ -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 3005000 +#define ARCHIVE_VERSION_NUMBER 3005001 #include #include /* for wchar_t */ @@ -155,7 +155,7 @@ __LA_DECL int archive_version_number(void); /* * Textual name/version of the library, useful for version displays. */ -#define ARCHIVE_VERSION_ONLY_STRING "3.5.0" +#define ARCHIVE_VERSION_ONLY_STRING "3.5.1dev" #define ARCHIVE_VERSION_STRING "libarchive " ARCHIVE_VERSION_ONLY_STRING __LA_DECL const char * archive_version_string(void); diff --git a/libarchive/archive_entry.h b/libarchive/archive_entry.h index d8c7535c3213..c0e75bf9f102 100644 --- a/libarchive/archive_entry.h +++ b/libarchive/archive_entry.h @@ -30,7 +30,7 @@ #define ARCHIVE_ENTRY_H_INCLUDED /* Note: Compiler will complain if this does not match archive.h! */ -#define ARCHIVE_VERSION_NUMBER 3005000 +#define ARCHIVE_VERSION_NUMBER 3005001 /* * Note: archive_entry.h is for use outside of libarchive; the diff --git a/libarchive/archive_read_support_format_mtree.c b/libarchive/archive_read_support_format_mtree.c index 127706d53b17..93ba2959a3c6 100644 --- a/libarchive/archive_read_support_format_mtree.c +++ b/libarchive/archive_read_support_format_mtree.c @@ -136,6 +136,9 @@ static int skip(struct archive_read *a); static int read_header(struct archive_read *, struct archive_entry *); static int64_t mtree_atol(char **, int base); +#ifndef HAVE_STRNLEN +static size_t mtree_strnlen(const char *, size_t); +#endif /* * There's no standard for TIME_T_MAX/TIME_T_MIN. So we compute them @@ -187,6 +190,24 @@ get_time_t_min(void) #endif } +#ifdef HAVE_STRNLEN +#define mtree_strnlen(a,b) strnlen(a,b) +#else +static size_t +mtree_strnlen(const char *p, size_t maxlen) +{ + size_t i; + + for (i = 0; i <= maxlen; i++) { + if (p[i] == 0) + break; + } + if (i > maxlen) + return (-1);/* invalid */ + return (i); +} +#endif + static int archive_read_format_mtree_options(struct archive_read *a, const char *key, const char *val) @@ -1540,7 +1561,7 @@ parse_digest(struct archive_read *a, struct archive_entry *entry, len *= 2; - if (strnlen(digest, len+1) != len) { + if (mtree_strnlen(digest, len+1) != len) { archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "incorrect digest length, ignoring"); return ARCHIVE_WARN; diff --git a/libarchive/archive_read_support_format_warc.c b/libarchive/archive_read_support_format_warc.c index 25c651564d26..27329962d6d1 100644 --- a/libarchive/archive_read_support_format_warc.c +++ b/libarchive/archive_read_support_format_warc.c @@ -127,7 +127,7 @@ static int _warc_skip(struct archive_read *a); static int _warc_rdhdr(struct archive_read *a, struct archive_entry *e); /* private routines */ -static unsigned int _warc_rdver(const char buf[10], size_t bsz); +static unsigned int _warc_rdver(const char *buf, size_t bsz); static unsigned int _warc_rdtyp(const char *buf, size_t bsz); static warc_string_t _warc_rduri(const char *buf, size_t bsz); static ssize_t _warc_rdlen(const char *buf, size_t bsz); @@ -443,7 +443,7 @@ _warc_skip(struct archive_read *a) static void* deconst(const void *c) { - return (char *)0x1 + (((const char *)c) - (const char *)0x1); + return (void *)(uintptr_t)c; } static char* diff --git a/libarchive/archive_read_support_format_zip.c b/libarchive/archive_read_support_format_zip.c index 81b8f86329c2..a64332c2818c 100644 --- a/libarchive/archive_read_support_format_zip.c +++ b/libarchive/archive_read_support_format_zip.c @@ -899,6 +899,7 @@ process_extra(struct archive_read *a, struct archive_entry *entry, return ARCHIVE_OK; } +#if HAVE_LZMA_H && HAVE_LIBLZMA /* * Auxiliary function to uncompress data chunk from zipx archive * (zip with lzma compression). @@ -971,6 +972,7 @@ zipx_lzma_uncompress_buffer(const char *compressed_buffer, free(lzma_alone_compressed_buffer); return status; } +#endif /* * Assumes file pointer is at beginning of local file header. diff --git a/libarchive/test/test_archive_read_support.c b/libarchive/test/test_archive_read_support.c index 6d213c409bf2..c6eb9346c627 100644 --- a/libarchive/test/test_archive_read_support.c +++ b/libarchive/test/test_archive_read_support.c @@ -126,7 +126,9 @@ DEFINE_TEST(test_archive_read_support) ARCHIVE_FORMAT_WARC, ARCHIVE_FORMAT_RAR_V5, }; - for (unsigned i = 0; i < sizeof(format_codes) / sizeof(int); i++) { + unsigned int i; + + for (i = 0; i < sizeof(format_codes) / sizeof(int); i++) { format_code = format_codes[i]; test_filter_or_format(format_code_enabler); test_filter_or_format(format_code_setter);