Update vendor/libarchive/dist to git 85b9f665b6a2d4397fdd38992152d011265e374b

Relevant vendor changes:
  Issue #1257: Add testcase for ZIPX files with LZMA_STREAM_END marker
  PR #1331: cpio.5: fix hard link description
  Issue #1335: archive_read.c: fix UBSan warning about undefined behavior
  Issue #1338: XAR reader: fix UBSan warning about undefined behavior
  Issue #1339: bsdcpio_test: fix datatype in from_hex()
  Issue #1341: Safe writes: delete temporary file if rename fails
This commit is contained in:
Martin Matuska 2020-03-02 02:12:53 +00:00
parent 8185c4ae24
commit 65da968c5c
27 changed files with 186 additions and 85 deletions

View File

@ -26,27 +26,6 @@ FreeBSD_task:
install_script: install_script:
- ./build/ci/build.sh -a install - ./build/ci/build.sh -a install
Fedora_30_task:
container:
dockerfile: build/ci/cirrus_ci/Dockerfile.fc30
env:
matrix:
- BS: autotools
- BS: cmake
matrix:
- CRYPTO: mbedtls
- CRYPTO: nettle
- CRYPTO: openssl
configure_script:
- ./build/ci/build.sh -a autogen
- ./build/ci/build.sh -a configure
build_script:
- ./build/ci/build.sh -a build
test_script:
- ./build/ci/build.sh -a test
install_script:
- ./build/ci/build.sh -a install
Windows_Cygwin_task: Windows_Cygwin_task:
windows_container: windows_container:
image: cirrusci/windowsservercore:2019 image: cirrusci/windowsservercore:2019

View File

@ -51,7 +51,7 @@ jobs:
steps: steps:
- uses: actions/checkout@master - uses: actions/checkout@master
- name: Install dependencies - name: Install dependencies
run: sudo apt-get install -y build-essential cmake libssl-dev nettle-dev libmbedtls-dev libacl1-dev libbz2-dev liblzma-dev libzip-dev liblz4-dev libzstd-dev lzop run: sudo apt-get install -y build-essential cmake libssl-dev nettle-dev libmbedtls-dev libacl1-dev libbz2-dev liblzma-dev liblz4-dev libzstd-dev lzop
- name: Autogen - name: Autogen
run: ./build/ci/build.sh -a autogen run: ./build/ci/build.sh -a autogen
env: env:
@ -87,7 +87,7 @@ jobs:
steps: steps:
- uses: actions/checkout@master - uses: actions/checkout@master
- name: Install dependencies - name: Install dependencies
run: sudo apt-get install -y build-essential cmake libssl-dev libacl1-dev libbz2-dev liblzma-dev libzip-dev liblz4-dev libzstd-dev lzop groff ghostscript run: sudo apt-get install -y build-essential cmake libssl-dev libacl1-dev libbz2-dev liblzma-dev liblz4-dev libzstd-dev lzop groff ghostscript
- name: Autogen - name: Autogen
run: ./build/ci/build.sh -a autogen run: ./build/ci/build.sh -a autogen
- name: Configure - name: Configure

View File

@ -18,7 +18,7 @@ endif()
# RelWithDebInfo : Release build with Debug Info # RelWithDebInfo : Release build with Debug Info
# MinSizeRel : Release Min Size build # MinSizeRel : Release Min Size build
IF(NOT CMAKE_BUILD_TYPE) 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) ENDIF(NOT CMAKE_BUILD_TYPE)
# Set a value type to properly display CMAKE_BUILD_TYPE on GUI if the # Set a value type to properly display CMAKE_BUILD_TYPE on GUI if the
# value type is "UNINITIALIZED". # value type is "UNINITIALIZED".

View File

@ -915,6 +915,7 @@ libarchive_test_EXTRA_DIST=\
libarchive/test/test_read_format_zip_lzma.zipx.uu \ libarchive/test/test_read_format_zip_lzma.zipx.uu \
libarchive/test/test_read_format_zip_lzma_alone_leak.zipx.uu \ libarchive/test/test_read_format_zip_lzma_alone_leak.zipx.uu \
libarchive/test/test_read_format_zip_lzma_multi.zipx.uu \ libarchive/test/test_read_format_zip_lzma_multi.zipx.uu \
libarchive/test/test_read_format_zip_lzma_stream_end.zipx.uu \
libarchive/test/test_read_format_zip_jar.jar.uu \ libarchive/test/test_read_format_zip_jar.jar.uu \
libarchive/test/test_read_format_zip_mac_metadata.zip.uu \ libarchive/test/test_read_format_zip_mac_metadata.zip.uu \
libarchive/test/test_read_format_zip_malformed1.zip.uu \ libarchive/test/test_read_format_zip_malformed1.zip.uu \

View File

@ -1,3 +0,0 @@
FROM fedora:30
RUN dnf -y install make cmake gcc gcc-c++ kernel-devel automake libtool bison sharutils pkgconf libacl-devel libasan librichacl-devel bzip2-devel libzip-devel zlib-devel xz-devel lz4-devel libzstd-devel openssl-devel nettle-devel mbedtls-devel

View File

@ -1,3 +1,3 @@
FROM fedora:30 FROM fedora:31
RUN dnf -y install make cmake gcc gcc-c++ kernel-devel automake libtool bison sharutils pkgconf libacl-devel libasan librichacl-devel bzip2-devel libzip-devel zlib-devel xz-devel lz4-devel libzstd-devel openssl-devel groff ghostscript xz zip RUN dnf -y install make cmake gcc gcc-c++ kernel-devel automake libtool bison sharutils pkgconf libacl-devel libasan librichacl-devel bzip2-devel zlib-devel xz-devel lz4-devel libzstd-devel openssl-devel nettle-devel mbedtls-devel

View File

@ -0,0 +1,3 @@
FROM fedora:31
RUN dnf -y install make cmake gcc gcc-c++ kernel-devel automake libtool bison sharutils pkgconf libacl-devel libasan librichacl-devel bzip2-devel zlib-devel xz-devel lz4-devel libzstd-devel openssl-devel groff ghostscript xz zip

View File

@ -5,7 +5,9 @@ then
if [ "${UNAME}" = "FreeBSD" ] if [ "${UNAME}" = "FreeBSD" ]
then then
set -x -e set -x -e
env ASSUME_ALWAYS_YES=yes pkg bootstrap -f
sed -i.bak -e 's,pkg+http://pkg.FreeBSD.org/\${ABI}/quarterly,pkg+http://pkg.FreeBSD.org/\${ABI}/latest,' /etc/pkg/FreeBSD.conf sed -i.bak -e 's,pkg+http://pkg.FreeBSD.org/\${ABI}/quarterly,pkg+http://pkg.FreeBSD.org/\${ABI}/latest,' /etc/pkg/FreeBSD.conf
pkg update
mount -u -o acls / mount -u -o acls /
mkdir /tmp_acl_nfsv4 mkdir /tmp_acl_nfsv4
MD=`mdconfig -a -t swap -s 128M` MD=`mdconfig -a -t swap -s 128M`
@ -27,10 +29,10 @@ then
if [ -f "/etc/debian_version" ] if [ -f "/etc/debian_version" ]
then then
apt-get -y update apt-get -y update
apt-get -y install build-essential locales automake libtool bison sharutils pkgconf libacl1-dev libbz2-dev libzip-dev zlib1g-dev liblzma-dev liblz4-dev libzstd-dev libssl-dev lrzip cmake apt-get -y install build-essential locales automake libtool bison sharutils pkgconf libacl1-dev libbz2-dev zlib1g-dev liblzma-dev liblz4-dev libzstd-dev libssl-dev lrzip cmake
elif [ -f "/etc/fedora-release" ] elif [ -f "/etc/fedora-release" ]
then then
dnf -y install make cmake gcc gcc-c++ kernel-devel automake libtool bison sharutils pkgconf libacl-devel librichacl-devel bzip2-devel libzip-devel zlib-devel xz-devel lz4-devel libzstd-devel openssl-devel dnf -y install make cmake gcc gcc-c++ kernel-devel automake libtool bison sharutils pkgconf libacl-devel librichacl-devel bzip2-devel zlib-devel xz-devel lz4-devel libzstd-devel openssl-devel
fi fi
fi fi
elif [ "$1" = "test" ] elif [ "$1" = "test" ]

View File

@ -1,6 +1,7 @@
@ECHO OFF @ECHO OFF
SET ZLIB_VERSION=1.2.11 SET ZLIB_VERSION=1.2.11
SET BZIP2_VERSION=b7a672291188a6469f71dd13ad14f2f9a7344fc8 SET BZIP2_VERSION=b7a672291188a6469f71dd13ad14f2f9a7344fc8
SET XZ_VERSION=292a5c0f9c9b3a66f5a5c652dc46381836d4537f
IF NOT "%BE%"=="mingw-gcc" ( IF NOT "%BE%"=="mingw-gcc" (
IF NOT "%BE%"=="msvc" ( IF NOT "%BE%"=="msvc" (
ECHO Environment variable BE must be mingw-gcc or msvc ECHO Environment variable BE must be mingw-gcc or msvc
@ -19,16 +20,28 @@ IF "%1"=="deplibs" (
) )
CD build_ci\libs CD build_ci\libs
IF NOT EXIST zlib-%ZLIB_VERSION%.zip ( IF NOT EXIST zlib-%ZLIB_VERSION%.zip (
curl -L -o zlib-%ZLIB_VERSION%.zip https://github.com/libarchive/zlib/archive/v%ZLIB_VERSION%.zip ECHO Downloading https://github.com/libarchive/zlib/archive/v%ZLIB_VERSION%.zip
curl -L -o zlib-%ZLIB_VERSION%.zip https://github.com/libarchive/zlib/archive/v%ZLIB_VERSION%.zip || EXIT /b 1
) )
IF NOT EXIST zlib-%ZLIB_VERSION% ( IF NOT EXIST zlib-%ZLIB_VERSION% (
tar -x -f zlib-%ZLIB_VERSION%.zip ECHO Unpacking zlib-%ZLIB_VERSION%.zip
C:\windows\system32\tar.exe -x -f zlib-%ZLIB_VERSION%.zip || EXIT /b 1
) )
IF NOT EXIST bzip2-%BZIP2_VERSION%.zip ( IF NOT EXIST bzip2-%BZIP2_VERSION%.zip (
curl -L -o bzip2-%BZIP2_VERSION%.zip https://github.com/libarchive/bzip2/archive/%BZIP2_VERSION%.zip echo Downloading https://github.com/libarchive/bzip2/archive/%BZIP2_VERSION%.zip
curl -L -o bzip2-%BZIP2_VERSION%.zip https://github.com/libarchive/bzip2/archive/%BZIP2_VERSION%.zip || EXIT /b 1
) )
IF NOT EXIST bzip2-%BZIP2_VERSION% ( IF NOT EXIST bzip2-%BZIP2_VERSION% (
tar -x -f bzip2-%BZIP2_VERSION%.zip echo Unpacking bzip2-%BZIP2_VERSION%.zip
C:\windows\system32\tar.exe -x -f bzip2-%BZIP2_VERSION%.zip || EXIT /b 1
)
IF NOT EXIST xz-%XZ_VERSION%.zip (
echo Downloading https://github.com/libarchive/xz/archive/%XZ_VERSION%.zip
curl -L -o xz-%XZ_VERSION%.zip https://github.com/libarchive/xz/archive/%XZ_VERSION%.zip || EXIT /b 1
)
IF NOT EXIST xz-%XZ_VERSION% (
echo Unpacking xz-%XZ_VERSION%.zip
C:\windows\system32\tar.exe -x -f xz-%XZ_VERSION%.zip || EXIT /b 1
) )
CD zlib-%ZLIB_VERSION% CD zlib-%ZLIB_VERSION%
IF "%BE%"=="mingw-gcc" ( IF "%BE%"=="mingw-gcc" (
@ -58,16 +71,27 @@ IF "%1"=="deplibs" (
cmake --build . --target INSTALL --config Release || EXIT /b 1 cmake --build . --target INSTALL --config Release || EXIT /b 1
) )
CD .. CD ..
CD xz-%XZ_VERSION%
IF "%BE%"=="mingw-gcc" (
SET PATH=%MINGWPATH%
cmake -G "MinGW Makefiles" -D CMAKE_BUILD_TYPE="Release" . || EXIT /b 1
mingw32-make || EXIT /b 1
mingw32-make install || EXIT /b 1
) ELSE IF "%BE%"=="msvc" (
cmake -G "Visual Studio 16 2019" -D CMAKE_BUILD_TYPE="Release" . || EXIT /b 1
cmake --build . --target ALL_BUILD --config Release || EXIT /b 1
cmake --build . --target INSTALL --config Release || EXIT /b 1
)
) ELSE IF "%1%"=="configure" ( ) ELSE IF "%1%"=="configure" (
IF "%BE%"=="mingw-gcc" ( IF "%BE%"=="mingw-gcc" (
SET PATH=%MINGWPATH% SET PATH=%MINGWPATH%
MKDIR build_ci\cmake MKDIR build_ci\cmake
CD build_ci\cmake CD build_ci\cmake
cmake -G "MinGW Makefiles" -D ZLIB_LIBRARY="C:/Program Files (x86)/zlib/lib/libzlibstatic.a" -D ZLIB_INCLUDE_DIR="C:/Program Files (x86)/zlib/include" -D BZIP2_LIBRARIES="C:/Program Files (x86)/bzip2/lib/libbz2.a" -D BZIP2_INCLUDE_DIR="C:/Program Files (x86)/bzip2/include" ..\.. || EXIT /b 1 cmake -G "MinGW Makefiles" -D ZLIB_LIBRARY="C:/Program Files (x86)/zlib/lib/libzlibstatic.a" -D ZLIB_INCLUDE_DIR="C:/Program Files (x86)/zlib/include" -D BZIP2_LIBRARIES="C:/Program Files (x86)/bzip2/lib/libbz2.a" -D BZIP2_INCLUDE_DIR="C:/Program Files (x86)/bzip2/include" -D LIBLZMA_LIBRARY="C:/Program Files (x86)/xz/lib/liblzma.a" -D LIBLZMA_INCLUDE_DIR="C:/Program Files (x86)/xz/include" ..\.. || EXIT /b 1
) ELSE IF "%BE%"=="msvc" ( ) ELSE IF "%BE%"=="msvc" (
MKDIR build_ci\cmake MKDIR build_ci\cmake
CD build_ci\cmake CD build_ci\cmake
cmake -G "Visual Studio 16 2019" -D CMAKE_BUILD_TYPE="Release" -D ZLIB_LIBRARY="C:/Program Files (x86)/zlib/lib/zlibstatic.lib" -D ZLIB_INCLUDE_DIR="C:/Program Files (x86)/zlib/include" -D BZIP2_LIBRARIES="C:/Program Files (x86)/bzip2/lib/bz2.lib" -D BZIP2_INCLUDE_DIR="C:/Program Files (x86)/bzip2/include" ..\.. || EXIT /b 1 cmake -G "Visual Studio 16 2019" -D CMAKE_BUILD_TYPE="Release" -D ZLIB_LIBRARY="C:/Program Files (x86)/zlib/lib/zlibstatic.lib" -D ZLIB_INCLUDE_DIR="C:/Program Files (x86)/zlib/include" -D BZIP2_LIBRARIES="C:/Program Files (x86)/bzip2/lib/bz2.lib" -D BZIP2_INCLUDE_DIR="C:/Program Files (x86)/bzip2/include" -D LIBLZMA_LIBRARY="C:/Program Files (x86)/xz/lib/liblzma.lib" -D LIBLZMA_INCLUDE_DIR="C:/Program Files (x86)/xz/include" ..\.. || EXIT /b 1
) )
) ELSE IF "%1%"=="build" ( ) ELSE IF "%1%"=="build" (
IF "%BE%"=="mingw-gcc" ( IF "%BE%"=="mingw-gcc" (
@ -100,7 +124,7 @@ IF "%1"=="deplibs" (
cmake --build . --target INSTALL --config Release || EXIT /b 1 cmake --build . --target INSTALL --config Release || EXIT /b 1
) )
) ELSE IF "%1"=="artifact" ( ) ELSE IF "%1"=="artifact" (
tar -c -C "C:\Program Files (x86)" --format=zip -f libarchive.zip libarchive C:\windows\system32\tar.exe -c -C "C:\Program Files (x86)" --format=zip -f libarchive.zip libarchive
) ELSE ( ) ELSE (
ECHO "Usage: %0% deplibs|configure|build|test|install|artifact" ECHO "Usage: %0% deplibs|configure|build|test|install|artifact"
@EXIT /b 0 @EXIT /b 0

View File

@ -1,5 +1,5 @@
FROM ubuntu:18.04 FROM ubuntu:18.04
RUN apt-get update && apt-get install -y build-essential autoconf automake libtool pkg-config cmake libssl-dev libacl1-dev libbz2-dev liblzma-dev libzip-dev liblz4-dev libzstd-dev lzop groff ghostscript bsdmainutils zip RUN apt-get update && apt-get install -y build-essential autoconf automake libtool pkg-config cmake libssl-dev libacl1-dev libbz2-dev liblzma-dev liblz4-dev libzstd-dev lzop groff ghostscript bsdmainutils zip
ADD . $HOME/libarchive/ ADD . $HOME/libarchive/
ADD "http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD" $HOME/libarchive/build/autoconf/config.guess ADD "http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD" $HOME/libarchive/build/autoconf/config.guess
ADD "http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD" $HOME/libarchive/build/autoconf/config.sub ADD "http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD" $HOME/libarchive/build/autoconf/config.sub

View File

@ -1 +1 @@
3004002 3004003dev

View File

@ -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 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. dnl These first two version numbers are updated automatically on each release.
m4_define([LIBARCHIVE_VERSION_S],[3.4.2]) m4_define([LIBARCHIVE_VERSION_S],[3.4.3dev])
m4_define([LIBARCHIVE_VERSION_N],[3004002]) m4_define([LIBARCHIVE_VERSION_N],[3004003])
dnl bsdtar and bsdcpio versioning tracks libarchive dnl bsdtar and bsdcpio versioning tracks libarchive
m4_define([BSDTAR_VERSION_S],LIBARCHIVE_VERSION_S()) m4_define([BSDTAR_VERSION_S],LIBARCHIVE_VERSION_S())

View File

@ -737,7 +737,7 @@ file_to_archive(struct cpio *cpio, const char *srcpath)
*/ */
destpath = srcpath; destpath = srcpath;
if (cpio->destdir) { if (cpio->destdir) {
len = strlen(cpio->destdir) + strlen(srcpath) + 8; len = cpio->destdir_len + strlen(srcpath) + 8;
if (len >= cpio->pass_destpath_alloc) { if (len >= cpio->pass_destpath_alloc) {
while (len >= cpio->pass_destpath_alloc) { while (len >= cpio->pass_destpath_alloc) {
cpio->pass_destpath_alloc += 512; cpio->pass_destpath_alloc += 512;
@ -1228,15 +1228,14 @@ mode_pass(struct cpio *cpio, const char *destdir)
struct lafe_line_reader *lr; struct lafe_line_reader *lr;
const char *p; const char *p;
int r; int r;
size_t destdir_len;
/* Ensure target dir has a trailing '/' to simplify path surgery. */ /* Ensure target dir has a trailing '/' to simplify path surgery. */
destdir_len = strlen(destdir); cpio->destdir_len = strlen(destdir);
cpio->destdir = malloc(destdir_len + 8); cpio->destdir = malloc(cpio->destdir_len + 8);
memcpy(cpio->destdir, destdir, destdir_len); memcpy(cpio->destdir, destdir, cpio->destdir_len);
if (destdir_len == 0 || destdir[destdir_len - 1] != '/') if (cpio->destdir_len == 0 || destdir[cpio->destdir_len - 1] != '/')
cpio->destdir[destdir_len++] = '/'; cpio->destdir[cpio->destdir_len++] = '/';
cpio->destdir[destdir_len++] = '\0'; cpio->destdir[cpio->destdir_len] = '\0';
cpio->archive = archive_write_disk_new(); cpio->archive = archive_write_disk_new();
if (cpio->archive == NULL) if (cpio->archive == NULL)

View File

@ -64,6 +64,7 @@ struct cpio {
int option_numeric_uid_gid; /* -n */ int option_numeric_uid_gid; /* -n */
int option_rename; /* -r */ int option_rename; /* -r */
char *destdir; char *destdir;
size_t destdir_len;
size_t pass_destpath_alloc; size_t pass_destpath_alloc;
char *pass_destpath; char *pass_destpath;
int uid_override; int uid_override;

View File

@ -49,10 +49,11 @@ is_hex(const char *p, size_t l)
return (1); return (1);
} }
static int /* Convert up to 8 hex characters to unsigned 32-bit decimal integer */
static uint32_t
from_hex(const char *p, size_t l) from_hex(const char *p, size_t l)
{ {
int r = 0; uint32_t r = 0;
while (l > 0) { while (l > 0) {
r *= 16; r *= 16;
@ -82,11 +83,11 @@ DEFINE_TEST(test_format_newc)
{ {
FILE *list; FILE *list;
int r; int r;
int devmajor, devminor, ino, gid; uint32_t devmajor, devminor, ino, gid, uid;
int uid = -1;
time_t t, t2, now; time_t t, t2, now;
char *p, *e; char *p, *e;
size_t s, fs, ns; size_t s;
uint64_t fs, ns;
char result[1024]; char result[1024];
assertUmask(0); assertUmask(0);
@ -199,9 +200,11 @@ DEFINE_TEST(test_format_newc)
#else #else
assertEqualInt(0x81a4, from_hex(e + 14, 8)); /* Mode */ assertEqualInt(0x81a4, from_hex(e + 14, 8)); /* Mode */
#endif #endif
if (uid < 0) #if defined(_WIN32)
uid = from_hex(e + 22, 8); uid = from_hex(e + 22, 8);
#else
assertEqualInt(from_hex(e + 22, 8), uid); /* uid */ assertEqualInt(from_hex(e + 22, 8), uid); /* uid */
#endif
gid = from_hex(e + 30, 8); /* gid */ gid = from_hex(e + 30, 8); /* gid */
assertEqualMem(e + 38, "00000003", 8); /* nlink */ assertEqualMem(e + 38, "00000003", 8); /* nlink */
t = from_hex(e + 46, 8); /* mtime */ t = from_hex(e + 46, 8); /* mtime */
@ -215,14 +218,14 @@ DEFINE_TEST(test_format_newc)
" first appearance should be empty, so this file size\n" " first appearance should be empty, so this file size\n"
" field should be zero"); " field should be zero");
assertEqualInt(0, from_hex(e + 54, 8)); /* File size */ assertEqualInt(0, from_hex(e + 54, 8)); /* File size */
fs = from_hex(e + 54, 8); fs = (uint64_t)from_hex(e + 54, 8);
fs += PAD(fs, 4); fs += PAD(fs, 4);
devmajor = from_hex(e + 62, 8); /* devmajor */ devmajor = from_hex(e + 62, 8); /* devmajor */
devminor = from_hex(e + 70, 8); /* devminor */ devminor = from_hex(e + 70, 8); /* devminor */
assert(is_hex(e + 78, 8)); /* rdevmajor */ assert(is_hex(e + 78, 8)); /* rdevmajor */
assert(is_hex(e + 86, 8)); /* rdevminor */ assert(is_hex(e + 86, 8)); /* rdevminor */
assertEqualMem(e + 94, "00000006", 8); /* Name size */ assertEqualMem(e + 94, "00000006", 8); /* Name size */
ns = from_hex(e + 94, 8); ns = (uint64_t)from_hex(e + 94, 8);
ns += PAD(ns + 2, 4); ns += PAD(ns + 2, 4);
assertEqualInt(0, from_hex(e + 102, 8)); /* check field */ assertEqualInt(0, from_hex(e + 102, 8)); /* check field */
assertEqualMem(e + 110, "file1\0", 6); /* Name contents */ assertEqualMem(e + 110, "file1\0", 6); /* Name contents */
@ -249,14 +252,14 @@ DEFINE_TEST(test_format_newc)
" at t2=%#08jx", (intmax_t)t, (intmax_t)t2); " at t2=%#08jx", (intmax_t)t, (intmax_t)t2);
assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */ assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */
assertEqualMem(e + 54, "00000005", 8); /* File size */ assertEqualMem(e + 54, "00000005", 8); /* File size */
fs = from_hex(e + 54, 8); fs = (uint64_t)from_hex(e + 54, 8);
fs += PAD(fs, 4); fs += PAD(fs, 4);
assertEqualInt(devmajor, from_hex(e + 62, 8)); /* devmajor */ assertEqualInt(devmajor, from_hex(e + 62, 8)); /* devmajor */
assertEqualInt(devminor, from_hex(e + 70, 8)); /* devminor */ assertEqualInt(devminor, from_hex(e + 70, 8)); /* devminor */
assert(is_hex(e + 78, 8)); /* rdevmajor */ assert(is_hex(e + 78, 8)); /* rdevmajor */
assert(is_hex(e + 86, 8)); /* rdevminor */ assert(is_hex(e + 86, 8)); /* rdevminor */
assertEqualMem(e + 94, "00000008", 8); /* Name size */ assertEqualMem(e + 94, "00000008", 8); /* Name size */
ns = from_hex(e + 94, 8); ns = (uint64_t)from_hex(e + 94, 8);
ns += PAD(ns + 2, 4); ns += PAD(ns + 2, 4);
assertEqualInt(0, from_hex(e + 102, 8)); /* check field */ assertEqualInt(0, from_hex(e + 102, 8)); /* check field */
assertEqualMem(e + 110, "symlink\0\0\0", 10); /* Name contents */ assertEqualMem(e + 110, "symlink\0\0\0", 10); /* Name contents */
@ -285,14 +288,14 @@ DEFINE_TEST(test_format_newc)
"t2=%#08jx", (intmax_t)t, (intmax_t)t2); "t2=%#08jx", (intmax_t)t, (intmax_t)t2);
assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */ assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */
assertEqualMem(e + 54, "00000000", 8); /* File size */ assertEqualMem(e + 54, "00000000", 8); /* File size */
fs = from_hex(e + 54, 8); fs = (uint64_t)from_hex(e + 54, 8);
fs += PAD(fs, 4); fs += PAD(fs, 4);
assertEqualInt(devmajor, from_hex(e + 62, 8)); /* devmajor */ assertEqualInt(devmajor, from_hex(e + 62, 8)); /* devmajor */
assertEqualInt(devminor, from_hex(e + 70, 8)); /* devminor */ assertEqualInt(devminor, from_hex(e + 70, 8)); /* devminor */
assert(is_hex(e + 78, 8)); /* rdevmajor */ assert(is_hex(e + 78, 8)); /* rdevmajor */
assert(is_hex(e + 86, 8)); /* rdevminor */ assert(is_hex(e + 86, 8)); /* rdevminor */
assertEqualMem(e + 94, "00000004", 8); /* Name size */ assertEqualMem(e + 94, "00000004", 8); /* Name size */
ns = from_hex(e + 94, 8); ns = (uint64_t)from_hex(e + 94, 8);
ns += PAD(ns + 2, 4); ns += PAD(ns + 2, 4);
assertEqualInt(0, from_hex(e + 102, 8)); /* check field */ assertEqualInt(0, from_hex(e + 102, 8)); /* check field */
assertEqualMem(e + 110, "dir\0\0\0", 6); /* Name contents */ assertEqualMem(e + 110, "dir\0\0\0", 6); /* Name contents */
@ -319,14 +322,14 @@ DEFINE_TEST(test_format_newc)
"t2=%#08jx", (intmax_t)t, (intmax_t)t2); "t2=%#08jx", (intmax_t)t, (intmax_t)t2);
assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */ assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */
assertEqualInt(10, from_hex(e + 54, 8)); /* File size */ assertEqualInt(10, from_hex(e + 54, 8)); /* File size */
fs = from_hex(e + 54, 8); fs = (uint64_t)from_hex(e + 54, 8);
fs += PAD(fs, 4); fs += PAD(fs, 4);
assertEqualInt(devmajor, from_hex(e + 62, 8)); /* devmajor */ assertEqualInt(devmajor, from_hex(e + 62, 8)); /* devmajor */
assertEqualInt(devminor, from_hex(e + 70, 8)); /* devminor */ assertEqualInt(devminor, from_hex(e + 70, 8)); /* devminor */
assert(is_hex(e + 78, 8)); /* rdevmajor */ assert(is_hex(e + 78, 8)); /* rdevmajor */
assert(is_hex(e + 86, 8)); /* rdevminor */ assert(is_hex(e + 86, 8)); /* rdevminor */
assertEqualMem(e + 94, "00000009", 8); /* Name size */ assertEqualMem(e + 94, "00000009", 8); /* Name size */
ns = from_hex(e + 94, 8); ns = (uint64_t)from_hex(e + 94, 8);
ns += PAD(ns + 2, 4); ns += PAD(ns + 2, 4);
assertEqualInt(0, from_hex(e + 102, 8)); /* check field */ assertEqualInt(0, from_hex(e + 102, 8)); /* check field */
assertEqualMem(e + 110, "hardlink\0\0", 10); /* Name contents */ assertEqualMem(e + 110, "hardlink\0\0", 10); /* Name contents */

View File

@ -36,7 +36,7 @@
* assert that ARCHIVE_VERSION_NUMBER >= 2012108. * assert that ARCHIVE_VERSION_NUMBER >= 2012108.
*/ */
/* Note: Compiler will complain if this does not match archive_entry.h! */ /* Note: Compiler will complain if this does not match archive_entry.h! */
#define ARCHIVE_VERSION_NUMBER 3004002 #define ARCHIVE_VERSION_NUMBER 3004003
#include <sys/stat.h> #include <sys/stat.h>
#include <stddef.h> /* for wchar_t */ #include <stddef.h> /* for wchar_t */
@ -155,7 +155,7 @@ __LA_DECL int archive_version_number(void);
/* /*
* Textual name/version of the library, useful for version displays. * Textual name/version of the library, useful for version displays.
*/ */
#define ARCHIVE_VERSION_ONLY_STRING "3.4.2" #define ARCHIVE_VERSION_ONLY_STRING "3.4.3dev"
#define ARCHIVE_VERSION_STRING "libarchive " ARCHIVE_VERSION_ONLY_STRING #define ARCHIVE_VERSION_STRING "libarchive " ARCHIVE_VERSION_ONLY_STRING
__LA_DECL const char * archive_version_string(void); __LA_DECL const char * archive_version_string(void);

View File

@ -30,7 +30,7 @@
#define ARCHIVE_ENTRY_H_INCLUDED #define ARCHIVE_ENTRY_H_INCLUDED
/* Note: Compiler will complain if this does not match archive.h! */ /* Note: Compiler will complain if this does not match archive.h! */
#define ARCHIVE_VERSION_NUMBER 3004002 #define ARCHIVE_VERSION_NUMBER 3004003
/* /*
* Note: archive_entry.h is for use outside of libarchive; the * Note: archive_entry.h is for use outside of libarchive; the

View File

@ -892,7 +892,7 @@ archive_read_data(struct archive *_a, void *buff, size_t s)
len = a->read_data_remaining; len = a->read_data_remaining;
if (len > s) if (len > s)
len = s; len = s;
if (len) if (len) {
memcpy(dest, a->read_data_block, len); memcpy(dest, a->read_data_block, len);
s -= len; s -= len;
a->read_data_block += len; a->read_data_block += len;
@ -903,6 +903,7 @@ archive_read_data(struct archive *_a, void *buff, size_t s)
bytes_read += len; bytes_read += len;
} }
} }
}
a->read_data_is_posix_read = 0; a->read_data_is_posix_read = 0;
a->read_data_requested = 0; a->read_data_requested = 0;
return (bytes_read); return (bytes_read);

View File

@ -221,7 +221,9 @@ file_open(struct archive *a, void *client_data)
struct read_file_data *mine = (struct read_file_data *)client_data; struct read_file_data *mine = (struct read_file_data *)client_data;
void *buffer; void *buffer;
const char *filename = NULL; const char *filename = NULL;
#if defined(_WIN32) && !defined(__CYGWIN__)
const wchar_t *wfilename = NULL; const wchar_t *wfilename = NULL;
#endif
int fd = -1; int fd = -1;
int is_disk_like = 0; int is_disk_like = 0;
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
@ -281,10 +283,12 @@ file_open(struct archive *a, void *client_data)
#endif #endif
} }
if (fstat(fd, &st) != 0) { if (fstat(fd, &st) != 0) {
#if defined(_WIN32) && !defined(__CYGWIN__)
if (mine->filename_type == FNT_WCS) if (mine->filename_type == FNT_WCS)
archive_set_error(a, errno, "Can't stat '%S'", archive_set_error(a, errno, "Can't stat '%S'",
wfilename); wfilename);
else else
#endif
archive_set_error(a, errno, "Can't stat '%s'", archive_set_error(a, errno, "Can't stat '%s'",
filename); filename);
goto fail; goto fail;

View File

@ -458,6 +458,11 @@ archive_read_support_format_xar(struct archive *_a)
return (ARCHIVE_FATAL); return (ARCHIVE_FATAL);
} }
/* initialize xar->file_queue */
xar->file_queue.allocated = 0;
xar->file_queue.used = 0;
xar->file_queue.files = NULL;
r = __archive_read_register_format(a, r = __archive_read_register_format(a,
xar, xar,
"xar", "xar",
@ -1221,10 +1226,12 @@ heap_add_entry(struct archive_read *a,
/* Expand our pending files list as necessary. */ /* Expand our pending files list as necessary. */
if (heap->used >= heap->allocated) { if (heap->used >= heap->allocated) {
struct xar_file **new_pending_files; struct xar_file **new_pending_files;
int new_size = heap->allocated * 2; int new_size;
if (heap->allocated < 1024) if (heap->allocated < 1024)
new_size = 1024; new_size = 1024;
else
new_size = heap->allocated * 2;
/* Overflow might keep us from growing the list. */ /* Overflow might keep us from growing the list. */
if (new_size <= heap->allocated) { if (new_size <= heap->allocated) {
archive_set_error(&a->archive, archive_set_error(&a->archive,
@ -1238,9 +1245,11 @@ heap_add_entry(struct archive_read *a,
ENOMEM, "Out of memory"); ENOMEM, "Out of memory");
return (ARCHIVE_FATAL); return (ARCHIVE_FATAL);
} }
if (heap->allocated) {
memcpy(new_pending_files, heap->files, memcpy(new_pending_files, heap->files,
heap->allocated * sizeof(new_pending_files[0])); heap->allocated * sizeof(new_pending_files[0]));
free(heap->files); free(heap->files);
}
heap->files = new_pending_files; heap->files = new_pending_files;
heap->allocated = new_size; heap->allocated = new_size;
} }

View File

@ -1654,6 +1654,7 @@ _archive_write_disk_finish_entry(struct archive *_a)
{ {
struct archive_write_disk *a = (struct archive_write_disk *)_a; struct archive_write_disk *a = (struct archive_write_disk *)_a;
int ret = ARCHIVE_OK; int ret = ARCHIVE_OK;
int oerrno;
archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC, archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC,
ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA, ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA,
@ -1855,8 +1856,11 @@ _archive_write_disk_finish_entry(struct archive *_a)
a->fd = -1; a->fd = -1;
if (a->tmpname) { if (a->tmpname) {
if (rename(a->tmpname, a->name) == -1) { if (rename(a->tmpname, a->name) == -1) {
oerrno = errno;
unlink(a->tmpname);
errno = oerrno;
archive_set_error(&a->archive, errno, archive_set_error(&a->archive, errno,
"rename failed"); "Failed to safe write");
ret = ARCHIVE_FATAL; ret = ARCHIVE_FATAL;
} }
a->tmpname = NULL; a->tmpname = NULL;

View File

@ -1174,6 +1174,7 @@ _archive_write_disk_finish_entry(struct archive *_a)
{ {
struct archive_write_disk *a = (struct archive_write_disk *)_a; struct archive_write_disk *a = (struct archive_write_disk *)_a;
int ret = ARCHIVE_OK; int ret = ARCHIVE_OK;
int oerrno;
archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC, archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC,
ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA, ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA,
@ -1281,8 +1282,11 @@ _archive_write_disk_finish_entry(struct archive *_a)
/* Windows does not support atomic rename */ /* Windows does not support atomic rename */
disk_unlink(a->name); disk_unlink(a->name);
if (_wrename(a->tmpname, a->name) != 0) { if (_wrename(a->tmpname, a->name) != 0) {
oerrno = errno;
disk_unlink(a->tmpname);
errno = oerrno;
archive_set_error(&a->archive, errno, archive_set_error(&a->archive, errno,
"rename failed"); "Failed to safe write");
ret = ARCHIVE_FATAL; ret = ARCHIVE_FATAL;
} }
a->tmpname = NULL; a->tmpname = NULL;

View File

@ -82,7 +82,7 @@ void
__archive_write_entry_filetype_unsupported(struct archive *a, __archive_write_entry_filetype_unsupported(struct archive *a,
struct archive_entry *entry, const char *format) struct archive_entry *entry, const char *format)
{ {
char *name = NULL; const char *name = NULL;
switch (archive_entry_filetype(entry)) { switch (archive_entry_filetype(entry)) {
/* /*

View File

@ -681,7 +681,8 @@ xar_write_data(struct archive_write *a, const void *buff, size_t s)
{ {
struct xar *xar; struct xar *xar;
enum la_zaction run; enum la_zaction run;
size_t size, rsize; size_t size = 0;
size_t rsize;
int r; int r;
xar = (struct xar *)a->format_data; xar = (struct xar *)a->format_data;

View File

@ -244,7 +244,7 @@ Note that this format supports only 4 gigabyte files (unlike the
older ASCII format, which supports 8 gigabyte files). older ASCII format, which supports 8 gigabyte files).
.Pp .Pp
In this format, hardlinked files are handled by setting the In this format, hardlinked files are handled by setting the
filesize to zero for each entry except the last one that filesize to zero for each entry except the first one that
appears in the archive. appears in the archive.
.Ss New CRC Format .Ss New CRC Format
The CRC format is identical to the new ASCII format described The CRC format is identical to the new ASCII format described

View File

@ -916,3 +916,53 @@ DEFINE_TEST(test_read_format_zip_lzma_alone_leak)
* suite under Valgrind or ASan, the test runner won't return with * suite under Valgrind or ASan, the test runner won't return with
* exit code 0 in case if a memory leak. */ * exit code 0 in case if a memory leak. */
} }
DEFINE_TEST(test_read_format_zip_lzma_stream_end)
{
const char *refname = "test_read_format_zip_lzma_stream_end.zipx";
struct archive *a;
struct archive_entry *ae;
assert((a = archive_read_new()) != NULL);
if (ARCHIVE_OK != archive_read_support_filter_lzma(a)) {
skipping("lzma reading not fully supported on this platform");
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
return;
}
extract_reference_file(refname);
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37));
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
assertEqualString("ZIP 6.3 (lzma)", archive_format_name(a));
assertEqualString("vimrc", archive_entry_pathname(ae));
assertEqualIntA(a, 0, extract_one(a, ae, 0xBA8E3BAA));
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
}
DEFINE_TEST(test_read_format_zip_lzma_stream_end_blockread)
{
const char *refname = "test_read_format_zip_lzma_stream_end.zipx";
struct archive *a;
struct archive_entry *ae;
assert((a = archive_read_new()) != NULL);
if (ARCHIVE_OK != archive_read_support_filter_lzma(a)) {
skipping("lzma reading not fully supported on this platform");
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
return;
}
extract_reference_file(refname);
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37));
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
assertEqualString("ZIP 6.3 (lzma)", archive_format_name(a));
assertEqualString("vimrc", archive_entry_pathname(ae));
assertEqualIntA(a, 0, extract_one_using_blocks(a, 13, 0xBA8E3BAA));
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
}

View File

@ -0,0 +1,19 @@
begin 664 test_read_format_zip_lzma_stream_end.zipx
M4$L#!#\``@`.`#TQD4VJ.XZZ/@(``)`#```%````=FEM<F,)!`4`70``@```
M$0@$J,)\D;(#4L%<^$P5TO^CM0KI0HWG08B&_].4<,CJ")TW/L>)82Q1PWAL
M+U`,N0L_$]^&650C/X$D6#4QFD$\A/"_![4!O/5O/!KH`WCQ*4?T2*]4P#/D
M0'9I?EZG=N69Z0V;H0I=C<!C<J6O^834W097PY1$%=-++.YUA'!>P*$?".I\
MGMG/80.A'^W>R4J'S/CZ%P`8`>F=R>R&R$2T@EM#X)"OQH1?A7,`:4IU9WV!
M#2W*DXT',;.4YIN4A:-X)O=IREL201ZSOC=YSAU[C4-::/YV8\)%"L17+>VC
M%/'B]ZCQN$2(Q*9*\KJZ`Y131`]5C&G';@1S-QES_RZF!2OX45@58+??ES%(
MUJ<(\`11M$NO)HK#/MK-9RT"15.2I:IZN8<TJR>VTM1_?$G\L#BH67]$S%[4
M%C-$\Q<+./&HV](4,7)OL-@C^M0F"2O!0N$OHOW54H87^QLBQVH*D%A<#SI%
M/#+-5U(W';:KC)RE>0Y^5YI!RECQNR"R4.UW9IR!@:B!UB8?_D5$FT8YCJHJ
M2[2"-&-_D2BJ6#XK[6G=%K"%;'^-+0]FHCY4ER#`^<I-M<!"D:-0H@);U"P"
MPYX+4#8!&$7\M.+%%MZ:KQ2GX0<]$"P7F^HT)J5JM<$VO9/D[#7KZ\'FITL/
MYIF"=GO+-L?F[8QS4KC7+=A)1`")V<.8DX629Q;;Y4XA\M-%O&MWC)^)`NO<
M.J6(5V2UY9"I(C*QKA[Z-GJ<5/_O%<=P4$L!`C\#/P`"``X`/3&13:H[CKH^
M`@``D`,```4``````````````+2!`````'9I;7)C4$L%!@`````!``$`,P``
'`&$"````````
`
end