diff options
812 files changed, 12946 insertions, 2367 deletions
diff --git a/.cirrus.yml b/.cirrus.yml index f882d1451911..9b1c5a72c2cf 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -10,23 +10,21 @@ FreeBSD_task: BS: cmake matrix: freebsd_instance: - image_family: freebsd-13-0 + image_family: freebsd-14-0 freebsd_instance: - image_family: freebsd-12-2 - freebsd_instance: - image_family: freebsd-11-4 + image_family: freebsd-13-2 prepare_script: - ./build/ci/cirrus_ci/ci.sh prepare configure_script: - env CFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib ./build/ci/build.sh -a autogen - env CFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib ./build/ci/build.sh -a configure build_script: - - ./build/ci/build.sh -a build + - env MAKE_ARGS="-j 2" ./build/ci/build.sh -a build test_script: - - env SKIP_TEST_RESTORE_ATIME=1 ./build/ci/build.sh -a test + - env SKIP_TEST_RESTORE_ATIME=1 MAKE_ARGS="-j 2" ./build/ci/build.sh -a test - ./build/ci/cirrus_ci/ci.sh test install_script: - - ./build/ci/build.sh -a install + - env MAKE_ARGS="-j 2" ./build/ci/build.sh -a install Windows_Cygwin_task: windows_container: diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000000..e4b8a2f5e440 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,15 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + groups: + all-actions: + patterns: + - "*" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0b1565ae1881..3ecc4434cd11 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,14 +2,17 @@ name: CI on: [push, pull_request] +permissions: + contents: read + jobs: MacOS: - runs-on: macos-latest + runs-on: macos-13 strategy: matrix: bs: [autotools, cmake] steps: - - uses: actions/checkout@master + - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: Install dependencies run: ./build/ci/github_actions/macos.sh prepare - name: Autogen @@ -24,32 +27,39 @@ jobs: run: ./build/ci/build.sh -a build env: BS: ${{ matrix.bs }} + MAKE_ARGS: -j - name: Test run: ./build/ci/build.sh -a test env: BS: ${{ matrix.bs }} SKIP_OPEN_FD_ERR_TEST: 1 + IGNORE_TRAVERSALS_TEST4: 1 + MAKE_ARGS: -j + CTEST_OUTPUT_ON_FAILURE: ON - name: Install run: ./build/ci/build.sh -a install env: BS: ${{ matrix.bs }} + MAKE_ARGS: -j - name: Artifact run: ./build/ci/build.sh -a artifact env: BS: ${{ matrix.bs }} - - uses: actions/upload-artifact@v1 + - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: libarchive-macos-${{ matrix.bs }}-${{ github.sha }} path: libarchive.tar.xz Ubuntu: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 strategy: matrix: bs: [autotools, cmake] crypto: [mbedtls, nettle, openssl] steps: - - uses: actions/checkout@master + - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 + - name: Update apt cache + run: sudo apt-get update - name: Install dependencies run: sudo apt-get install -y autoconf automake build-essential cmake git libssl-dev nettle-dev libmbedtls-dev libacl1-dev libbz2-dev liblzma-dev liblz4-dev libzstd-dev lzop pkg-config zlib1g-dev - name: Autogen @@ -65,11 +75,14 @@ jobs: run: ./build/ci/build.sh -a build env: BS: ${{ matrix.bs }} + MAKE_ARGS: -j - name: Test run: ./build/ci/build.sh -a test env: BS: ${{ matrix.bs }} SKIP_OPEN_FD_ERR_TEST: 1 + MAKE_ARGS: -j + CTEST_OUTPUT_ON_FAILURE: ON - name: Install run: ./build/ci/build.sh -a install env: @@ -78,14 +91,16 @@ jobs: run: ./build/ci/build.sh -a artifact env: BS: ${{ matrix.bs }} - - uses: actions/upload-artifact@v1 + - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: libarchive-ubuntu-${{ matrix.bs }}-${{ matrix.crypto }}-${{ github.sha }} path: libarchive.tar.xz Ubuntu-distcheck: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@master + - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 + - name: Update package definitions + run: sudo apt-get update - name: Install dependencies run: sudo apt-get install -y autoconf automake bsdmainutils build-essential cmake ghostscript git groff libssl-dev libacl1-dev libbz2-dev liblzma-dev liblz4-dev libzstd-dev lzop pkg-config zip zlib1g-dev - name: Autogen @@ -98,7 +113,7 @@ jobs: SKIP_OPEN_FD_ERR_TEST: 1 - name: Dist-Artifact run: ./build/ci/build.sh -a dist-artifact - - uses: actions/upload-artifact@v1 + - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: libarchive-${{ github.sha }} path: libarchive-dist.tar @@ -106,11 +121,16 @@ jobs: Windows: runs-on: windows-2022 strategy: + fail-fast: false matrix: be: [mingw-gcc, msvc] steps: - - uses: actions/checkout@master - - name: Install dependencies + - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 + - name: Install mingw + if: ${{ matrix.be=='mingw-gcc' }} + run: choco install mingw + shell: cmd + - name: Install library dependencies run: ./build/ci/github_actions/ci.cmd deplibs shell: cmd env: @@ -130,6 +150,7 @@ jobs: shell: cmd env: BE: ${{ matrix.be }} + CTEST_OUTPUT_ON_FAILURE: ON - name: Install run: ./build/ci/github_actions/ci.cmd install shell: cmd @@ -140,7 +161,7 @@ jobs: shell: cmd env: BE: ${{ matrix.be }} - - uses: actions/upload-artifact@v1 + - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: libarchive-windows-${{ matrix.be }}-${{ github.sha }} path: libarchive.zip diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml index e5c60e4b0de2..9dd1dc3ec1a0 100644 --- a/.github/workflows/cifuzz.yml +++ b/.github/workflows/cifuzz.yml @@ -1,5 +1,9 @@ name: CIFuzz on: [pull_request] + +permissions: + contents: read + jobs: Fuzzing: runs-on: ubuntu-latest @@ -17,7 +21,7 @@ jobs: fuzz-seconds: 600 dry-run: false - name: Upload Crash - uses: actions/upload-artifact@v1 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 if: failure() && steps.build.outcome == 'success' with: name: artifacts diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 000000000000..b9e4dcc48e5a --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,43 @@ +name: "CodeQL" + +permissions: + contents: read + +on: + push: + branches: [ "master", "3.5" ] + pull_request: + branches: [ "master" ] + schedule: + - cron: "49 4 * * 2" + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ cpp ] + + steps: + - name: Checkout + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 + + - name: Initialize CodeQL + uses: github/codeql-action/init@05963f47d870e2cb19a537396c1f668a348c7d8f # v3.24.8 + with: + languages: ${{ matrix.language }} + queries: +security-and-quality + + - name: Autobuild + uses: github/codeql-action/autobuild@05963f47d870e2cb19a537396c1f668a348c7d8f # v3.24.8 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@05963f47d870e2cb19a537396c1f668a348c7d8f # v3.24.8 + with: + category: "/language:${{ matrix.language }}" diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml new file mode 100644 index 000000000000..b6c4f17a9b31 --- /dev/null +++ b/.github/workflows/scorecard.yml @@ -0,0 +1,65 @@ +# This workflow uses actions that are not certified by GitHub. They are provided +# by a third-party and are governed by separate terms of service, privacy +# policy, and support documentation. + +name: Scorecard supply-chain security +on: + # For Branch-Protection check. Only the default branch is supported. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection + branch_protection_rule: + # To guarantee Maintained check is occasionally updated. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained + schedule: + - cron: '42 8 * * 0' + push: + branches: [ "master" ] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecard analysis + runs-on: ubuntu-latest + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Needed to publish results and get a badge (see publish_results below). + id-token: write + + steps: + - name: "Checkout code" + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@0864cf19026789058feabb7e87baa5f140aac736 # v2.3.1 + with: + results_file: results.sarif + results_format: sarif + # (Optional) "write" PAT token. Uncomment the `repo_token` line below if: + # you want to enable the Branch-Protection check on a *public* repository + # To create the PAT, follow the steps in + # https://github.com/ossf/scorecard-action#authentication-with-fine-grained-pat-optional + # repo_token: ${{ secrets.SCORECARD_TOKEN }} + + # - Publish results to OpenSSF REST API for easy access by consumers + # - Allows the repository to include the Scorecard badge. + # - See https://github.com/ossf/scorecard-action#publishing-results. + publish_results: true + + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF + # format to the repository Actions tab. + - name: "Upload artifact" + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard. + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@05963f47d870e2cb19a537396c1f668a348c7d8f # v3.24.8 + with: + sarif_file: results.sarif diff --git a/.gitignore b/.gitignore index 6b4d2dc76455..8dc637ee132d 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ autom4te.cache/ bsdcat bsdcpio bsdtar +bsdunzip build/autoconf/compile build/autoconf/config.guess build/autoconf/config.sub @@ -41,10 +42,12 @@ libarchive/test/list.h libtool stamp-h1 tar/test/list.h +unzip/test/list.h CMakeCache.txt CMakeFiles/ DartConfiguration.tcl cmake.tmp/ +.vscode/ doc/html/*.html doc/man/*.1 @@ -72,3 +75,5 @@ test-suite.log .sw? .*.sw? + +*.pdb diff --git a/CMakeLists.txt b/CMakeLists.txt index 1e1ff575fd36..c0fbd70b38e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,6 +6,9 @@ endif() if(POLICY CMP0074) cmake_policy(SET CMP0074 NEW) #3.12.0 `find_package()`` uses ``<PackageName>_ROOT`` variables. endif() +if(POLICY CMP0075) + cmake_policy(SET CMP0075 NEW) #3.12.0 `check_include_file()`` and friends use ``CMAKE_REQUIRED_LIBRARIES``. +endif() # PROJECT(libarchive C) # @@ -20,8 +23,9 @@ endif() # Release : Release build # RelWithDebInfo : Release build with Debug Info # MinSizeRel : Release Min Size build +# None : No build type IF(NOT CMAKE_BUILD_TYPE) - SET(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build Type" FORCE) + SET(CMAKE_BUILD_TYPE "Release" 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". @@ -31,12 +35,12 @@ IF("${cached_type}" STREQUAL "UNINITIALIZED") ENDIF("${cached_type}" STREQUAL "UNINITIALIZED") # Check the Build Type. IF(NOT "${CMAKE_BUILD_TYPE}" - MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel)\$") + MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel|None)\$") MESSAGE(FATAL_ERROR "Unknown keyword for CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}\n" - "Acceptable keywords: Debug,Release,RelWithDebInfo,MinSizeRel") + "Acceptable keywords: Debug,Release,RelWithDebInfo,MinSizeRel,None") ENDIF(NOT "${CMAKE_BUILD_TYPE}" - MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel)\$") + MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel|None)\$") # On MacOS, prefer MacPorts libraries to system libraries. # I haven't come up with a compelling argument for this to be conditional. @@ -65,6 +69,7 @@ SET(VERSION "${_major}.${_trimmed_minor}.${_trimmed_revision} SET(BSDCPIO_VERSION_STRING "${VERSION}") SET(BSDTAR_VERSION_STRING "${VERSION}") SET(BSDCAT_VERSION_STRING "${VERSION}") +SET(BSDUNZIP_VERSION_STRING "${VERSION}") SET(LIBARCHIVE_VERSION_NUMBER "${_version_number}") SET(LIBARCHIVE_VERSION_STRING "${VERSION}") @@ -123,8 +128,6 @@ IF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR # either of the following two, yet neither is supported as of 3.0.2 # - check_linker_flag - does not exist # - try_compile - does not support linker flags - # - # The CI fails with this on MacOS IF(NOT CMAKE_SYSTEM_NAME MATCHES "Darwin") # Place the functions and data into separate sections, allowing the linker # to garbage collect the unused ones. @@ -134,6 +137,9 @@ IF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR # Printing the discarded section is "too much", so enable on demand. #SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -Wl,--print-gc-sections") #SET(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} -Wl,--print-gc-sections") + ELSE() + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-dead_strip") + SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-dead_strip") ENDIF(NOT CMAKE_SYSTEM_NAME MATCHES "Darwin") ENDIF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR CMAKE_C_COMPILER_ID MATCHES "^Clang$") @@ -199,6 +205,8 @@ ENDIF (MSVC) # Enable CTest/CDash support include(CTest) +option(BUILD_SHARED_LIBS "Build shared libraries" ON) + OPTION(ENABLE_MBEDTLS "Enable use of mbed TLS" OFF) OPTION(ENABLE_NETTLE "Enable use of Nettle" OFF) OPTION(ENABLE_OPENSSL "Enable use of OpenSSL" ON) @@ -213,7 +221,8 @@ OPTION(ENABLE_BZip2 "Enable the use of the system BZip2 library if found" ON) OPTION(ENABLE_LIBXML2 "Enable the use of the system libxml2 library if found" ON) OPTION(ENABLE_EXPAT "Enable the use of the system EXPAT library if found" ON) OPTION(ENABLE_PCREPOSIX "Enable the use of the system PCREPOSIX library if found" ON) -OPTION(ENABLE_LibGCC "Enable the use of the system LibGCC library if found" ON) +OPTION(ENABLE_PCRE2POSIX "Enable the use of the system PCRE2POSIX library if found" ON) +OPTION(ENABLE_LIBGCC "Enable the use of the system LibGCC library if found" ON) # CNG is used for encrypt/decrypt Zip archives on Windows. OPTION(ENABLE_CNG "Enable the use of CNG(Crypto Next Generation)" ON) @@ -223,6 +232,13 @@ OPTION(ENABLE_CPIO "Enable cpio building" ON) OPTION(ENABLE_CPIO_SHARED "Enable dynamic build of cpio" FALSE) OPTION(ENABLE_CAT "Enable cat building" ON) OPTION(ENABLE_CAT_SHARED "Enable dynamic build of cat" FALSE) +IF(WIN32 AND NOT CYGWIN) + SET(ENABLE_UNZIP FALSE) + SET(ENABLE_UNZIP_SHARED FALSE) +ELSE() + OPTION(ENABLE_UNZIP "Enable unzip building" ON) + OPTION(ENABLE_UNZIP_SHARED "Enable dynamic build of unzip" FALSE) +ENDIF() OPTION(ENABLE_XATTR "Enable extended attribute support" ON) OPTION(ENABLE_ACL "Enable ACL support" ON) OPTION(ENABLE_ICONV "Enable iconv support" ON) @@ -232,7 +248,7 @@ OPTION(ENABLE_INSTALL "Enable installing of libraries" ON) SET(POSIX_REGEX_LIB "AUTO" CACHE STRING "Choose what library should provide POSIX regular expression support") SET(ENABLE_SAFESEH "AUTO" CACHE STRING "Enable use of /SAFESEH linker flag (MSVC only)") -SET(WINDOWS_VERSION "WIN7" CACHE STRING "Set Windows version to use (Windows only)") +SET(WINDOWS_VERSION "WIN10" CACHE STRING "Set Windows version to use (Windows only)") IF(ENABLE_COVERAGE) include(LibarchiveCodeCoverage) @@ -243,7 +259,11 @@ IF(ENABLE_TEST) ENDIF(ENABLE_TEST) IF(WIN32) - IF(WINDOWS_VERSION STREQUAL "WIN8") + IF(WINDOWS_VERSION STREQUAL "WIN10") + SET(NTDDI_VERSION 0x0A000000) + SET(_WIN32_WINNT 0x0A00) + SET(WINVER 0x0A00) + ELSEIF(WINDOWS_VERSION STREQUAL "WIN8") SET(NTDDI_VERSION 0x06020000) SET(_WIN32_WINNT 0x0602) SET(WINVER 0x0602) @@ -267,12 +287,12 @@ IF(WIN32) SET(NTDDI_VERSION 0x05010000) SET(_WIN32_WINNT 0x0501) SET(WINVER 0x0501) - ELSE(WINDOWS_VERSION STREQUAL "WIN8") + ELSE(WINDOWS_VERSION STREQUAL "WIN10") # Default to Windows Server 2003 API if we don't recognize the specifier SET(NTDDI_VERSION 0x05020000) SET(_WIN32_WINNT 0x0502) SET(WINVER 0x0502) - ENDIF(WINDOWS_VERSION STREQUAL "WIN8") + ENDIF(WINDOWS_VERSION STREQUAL "WIN10") ENDIF(WIN32) IF(MSVC) @@ -295,6 +315,7 @@ ENDIF() IF(MINGW) ADD_DEFINITIONS(-D__USE_MINGW_ANSI_STDIO) + ADD_DEFINITIONS(-D__MINGW_USE_VC2005_COMPAT) ENDIF() # @@ -365,7 +386,11 @@ MACRO (TRY_MACRO_FOR_LIBRARY INCLUDES LIBRARIES IF("${TRY_TYPE}" MATCHES "COMPILES") CHECK_C_SOURCE_COMPILES("${SAMPLE_SOURCE}" ${VAR}) ELSEIF("${TRY_TYPE}" MATCHES "RUNS") - CHECK_C_SOURCE_RUNS("${SAMPLE_SOURCE}" ${VAR}) + IF(CMAKE_CROSSCOMPILING) + MESSAGE(WARNING "Cannot test run \"${VAR}\" when cross-compiling") + ELSE(CMAKE_CROSSCOMPILING) + CHECK_C_SOURCE_RUNS("${SAMPLE_SOURCE}" ${VAR}) + ENDIF(CMAKE_CROSSCOMPILING) ELSE("${TRY_TYPE}" MATCHES "COMPILES") MESSAGE(FATAL_ERROR "UNKNOWN KEYWORD \"${TRY_TYPE}\" FOR TRY_TYPE") ENDIF("${TRY_TYPE}" MATCHES "COMPILES") @@ -503,12 +528,16 @@ IF(LIBLZMA_FOUND) COMPILES "#include <lzma.h>\nint main() {return (int)lzma_version_number(); }" "WITHOUT_LZMA_API_STATIC;LZMA_API_STATIC") + CHECK_C_SOURCE_COMPILES( + "#include <lzma.h>\n#if LZMA_VERSION < 50020000\n#error unsupported\n#endif\nint main(void){int ignored __attribute__((unused)); ignored = lzma_stream_encoder_mt(0, 0); return 0;}" + HAVE_LZMA_STREAM_ENCODER_MT) IF(NOT WITHOUT_LZMA_API_STATIC AND LZMA_API_STATIC) ADD_DEFINITIONS(-DLZMA_API_STATIC) ENDIF(NOT WITHOUT_LZMA_API_STATIC AND LZMA_API_STATIC) CMAKE_POP_CHECK_STATE() ELSE(LIBLZMA_FOUND) # LZMA not found and will not be used. + SET(HAVE_LZMA_STREAM_ENCODER_MT 0) ENDIF(LIBLZMA_FOUND) MARK_AS_ADVANCED(CLEAR LIBLZMA_INCLUDE_DIR) MARK_AS_ADVANCED(CLEAR LIBLZMA_LIBRARY) @@ -562,6 +591,7 @@ IF(LIBB2_FOUND) SET(HAVE_BLAKE2_H 1) SET(ARCHIVE_BLAKE2 FALSE) LIST(APPEND ADDITIONAL_LIBS ${LIBB2_LIBRARY}) + INCLUDE_DIRECTORIES(${LIBB2_INCLUDE_DIR}) CMAKE_PUSH_CHECK_STATE() SET(CMAKE_REQUIRED_LIBRARIES ${LIBB2_LIBRARY}) SET(CMAKE_REQUIRED_INCLUDES ${LIBB2_INCLUDE_DIR}) @@ -610,8 +640,13 @@ IF(ENABLE_ZSTD) SET(ZSTD_FIND_QUIETLY TRUE) ENDIF (ZSTD_INCLUDE_DIR) - FIND_PATH(ZSTD_INCLUDE_DIR zstd.h) - FIND_LIBRARY(ZSTD_LIBRARY NAMES zstd libzstd) + IF(UNIX) + FIND_PACKAGE(PkgConfig QUIET) + PKG_SEARCH_MODULE(PC_ZSTD libzstd) + ENDIF() + + FIND_PATH(ZSTD_INCLUDE_DIR zstd.h HINTS ${PC_ZSTD_INCLUDEDIR} ${PC_ZSTD_INCLUDE_DIRS}) + FIND_LIBRARY(ZSTD_LIBRARY NAMES zstd libzstd HINTS ${PC_ZSTD_LIBDIR} ${PC_ZSTD_LIBRARY_DIRS}) INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(ZSTD DEFAULT_MSG ZSTD_LIBRARY ZSTD_INCLUDE_DIR) ELSE(ENABLE_ZSTD) @@ -625,7 +660,7 @@ IF(ZSTD_FOUND) SET(CMAKE_REQUIRED_LIBRARIES ${ZSTD_LIBRARY}) SET(CMAKE_REQUIRED_INCLUDES ${ZSTD_INCLUDE_DIR}) CHECK_FUNCTION_EXISTS(ZSTD_decompressStream HAVE_LIBZSTD) - CHECK_FUNCTION_EXISTS(ZSTD_compressStream HAVE_LIBZSTD_COMPRESSOR) + CHECK_FUNCTION_EXISTS(ZSTD_compressStream HAVE_ZSTD_compressStream) # # TODO: test for static library. # @@ -666,6 +701,7 @@ CHECK_C_SOURCE_COMPILES("#include <sys/ioctl.h> int main(void) { return EXT2_IOC_GETFLAGS; }" HAVE_WORKING_EXT2_IOC_GETFLAGS) LA_CHECK_INCLUDE_FILE("fcntl.h" HAVE_FCNTL_H) +LA_CHECK_INCLUDE_FILE("fnmatch.h" HAVE_FNMATCH_H) LA_CHECK_INCLUDE_FILE("grp.h" HAVE_GRP_H) LA_CHECK_INCLUDE_FILE("inttypes.h" HAVE_INTTYPES_H) LA_CHECK_INCLUDE_FILE("io.h" HAVE_IO_H) @@ -705,6 +741,7 @@ LA_CHECK_INCLUDE_FILE("sys/mkdev.h" HAVE_SYS_MKDEV_H) LA_CHECK_INCLUDE_FILE("sys/mount.h" HAVE_SYS_MOUNT_H) LA_CHECK_INCLUDE_FILE("sys/param.h" HAVE_SYS_PARAM_H) LA_CHECK_INCLUDE_FILE("sys/poll.h" HAVE_SYS_POLL_H) +LA_CHECK_INCLUDE_FILE("sys/queue.h" HAVE_SYS_QUEUE_H) LA_CHECK_INCLUDE_FILE("sys/richacl.h" HAVE_SYS_RICHACL_H) LA_CHECK_INCLUDE_FILE("sys/select.h" HAVE_SYS_SELECT_H) LA_CHECK_INCLUDE_FILE("sys/stat.h" HAVE_SYS_STAT_H) @@ -724,9 +761,9 @@ LA_CHECK_INCLUDE_FILE("wchar.h" HAVE_WCHAR_H) LA_CHECK_INCLUDE_FILE("wctype.h" HAVE_WCTYPE_H) LA_CHECK_INCLUDE_FILE("windows.h" HAVE_WINDOWS_H) IF(ENABLE_CNG) - LA_CHECK_INCLUDE_FILE("Bcrypt.h" HAVE_BCRYPT_H) + LA_CHECK_INCLUDE_FILE("bcrypt.h" HAVE_BCRYPT_H) IF(HAVE_BCRYPT_H) - LIST(APPEND ADDITIONAL_LIBS "Bcrypt") + LIST(APPEND ADDITIONAL_LIBS "bcrypt") ENDIF(HAVE_BCRYPT_H) ELSE(ENABLE_CNG) UNSET(HAVE_BCRYPT_H CACHE) @@ -803,6 +840,10 @@ IF(ENABLE_OPENSSL AND NOT CMAKE_SYSTEM_NAME MATCHES "Darwin") SET(HAVE_LIBCRYPTO 1) INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR}) LIST(APPEND ADDITIONAL_LIBS ${OPENSSL_CRYPTO_LIBRARY}) + SET(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY}) + SET(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR}) + LA_CHECK_INCLUDE_FILE("openssl/evp.h" HAVE_OPENSSL_EVP_H) + CHECK_FUNCTION_EXISTS(PKCS5_PBKDF2_HMAC_SHA1 HAVE_PKCS5_PBKDF2_HMAC_SHA1) ENDIF(OPENSSL_FOUND) ELSE() SET(OPENSSL_FOUND FALSE) # Override cached value @@ -1152,7 +1193,7 @@ ENDIF(ENABLE_ICONV) # # Find Libxml2 # -IF(ENABLE_LIBXML2) +IF(ENABLE_LIBXML2 AND HAVE_ICONV) FIND_PACKAGE(LibXml2) ELSE() SET(LIBXML2_FOUND FALSE) @@ -1255,9 +1296,10 @@ IF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCREPOSIX)$" # # If requested, try finding library for PCREPOSIX # - IF(ENABLE_LibGCC) - FIND_PACKAGE(LibGCC) + IF(ENABLE_LIBGCC) + FIND_PACKAGE(LIBGCC) ELSE() + MESSAGE(FATAL_ERROR "libgcc not found.") SET(LIBGCC_FOUND FALSE) # Override cached value ENDIF() IF(ENABLE_PCREPOSIX) @@ -1312,6 +1354,68 @@ IF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCREPOSIX)$" MARK_AS_ADVANCED(CLEAR LIBGCC_LIBRARIES) ENDIF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCREPOSIX)$") +IF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCRE2POSIX)$") + # + # If requested, try finding library for PCRE2POSIX + # + IF(ENABLE_LIBGCC) + FIND_PACKAGE(LIBGCC) + ELSE() + MESSAGE(FATAL_ERROR "libgcc not found.") + SET(LIBGCC_FOUND FALSE) # Override cached value + ENDIF() + IF(ENABLE_PCRE2POSIX) + FIND_PACKAGE(PCRE2POSIX) + ELSE() + SET(PCRE2POSIX_FOUND FALSE) # Override cached value + ENDIF() + IF(PCRE2POSIX_FOUND) + INCLUDE_DIRECTORIES(${PCRE2_INCLUDE_DIR}) + LIST(APPEND ADDITIONAL_LIBS ${PCRE2POSIX_LIBRARIES}) + # Test if a macro is needed for the library. + TRY_MACRO_FOR_LIBRARY( + "${PCRE2_INCLUDE_DIR}" "${PCRE2POSIX_LIBRARIES}" + COMPILES + "#include <pcre2posix.h>\nint main() {regex_t r;return pcre2_regcomp(&r, \"\", 0);}" + "WITHOUT_PCRE2_STATIC;PCRE2_STATIC") + IF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC) + ADD_DEFINITIONS(-DPCRE2_STATIC) + ELSEIF(NOT WITHOUT_PCRE2_STATIC AND NOT PCRE2_STATIC AND PCRE2_FOUND) + # Determine if pcre2 static libraries are to be used. + LIST(APPEND ADDITIONAL_LIBS ${PCRE2_LIBRARIES}) + SET(TMP_LIBRARIES ${PCRE2POSIX_LIBRARIES} ${PCRE2_LIBRARIES}) + MESSAGE(STATUS "trying again with -lpcre2-8 included") + TRY_MACRO_FOR_LIBRARY( + "${PCRE2_INCLUDE_DIR}" "${TMP_LIBRARIES}" + COMPILES + "#include <pcre2posix.h>\nint main() {regex_t r;return pcre2_regcomp(&r, \"\", 0);}" + "WITHOUT_PCRE2_STATIC;PCRE2_STATIC") + IF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC) + ADD_DEFINITIONS(-DPCRE2_STATIC) + ELSEIF(NOT WITHOUT_PCRE2_STATIC AND NOT PCRE2_STATIC AND MSVC AND LIBGCC_FOUND) + # When doing a Visual Studio build using pcre2 static libraries + # built using the mingw toolchain, -lgcc is needed to resolve + # ___chkstk_ms. + MESSAGE(STATUS "Visual Studio build detected, trying again with -lgcc included") + LIST(APPEND ADDITIONAL_LIBS ${LIBGCC_LIBRARIES}) + SET(TMP_LIBRARIES ${PCRE2POSIX_LIBRARIES} ${PCRE2_LIBRARIES} ${LIBGCC_LIBRARIES}) + TRY_MACRO_FOR_LIBRARY( + "${PCRE2_INCLUDE_DIR}" "${TMP_LIBRARIES}" + COMPILES + "#include <pcre2posix.h>\nint main() {regex_t r;return pcre2_regcomp(&r, \"\", 0);}" + "WITHOUT_PCRE2_STATIC;PCRE2_STATIC") + IF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC) + ADD_DEFINITIONS(-DPCRE2_STATIC) + ENDIF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC) + ENDIF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC) + ENDIF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC) + ENDIF(PCRE2POSIX_FOUND) + MARK_AS_ADVANCED(CLEAR PCRE2_INCLUDE_DIR) + MARK_AS_ADVANCED(CLEAR PCRE2POSIX_LIBRARIES) + MARK_AS_ADVANCED(CLEAR PCRE2_LIBRARIES) + MARK_AS_ADVANCED(CLEAR LIBGCC_LIBRARIES) +ENDIF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCRE2POSIX)$") + # # Check functions # @@ -1338,6 +1442,7 @@ CHECK_FUNCTION_EXISTS_GLIBC(fchmod HAVE_FCHMOD) CHECK_FUNCTION_EXISTS_GLIBC(fchown HAVE_FCHOWN) CHECK_FUNCTION_EXISTS_GLIBC(fcntl HAVE_FCNTL) CHECK_FUNCTION_EXISTS_GLIBC(fdopendir HAVE_FDOPENDIR) +CHECK_FUNCTION_EXISTS_GLIBC(fnmatch HAVE_FNMATCH) CHECK_FUNCTION_EXISTS_GLIBC(fork HAVE_FORK) CHECK_FUNCTION_EXISTS_GLIBC(fstat HAVE_FSTAT) CHECK_FUNCTION_EXISTS_GLIBC(fstatat HAVE_FSTATAT) @@ -1350,6 +1455,7 @@ CHECK_FUNCTION_EXISTS_GLIBC(futimesat HAVE_FUTIMESAT) CHECK_FUNCTION_EXISTS_GLIBC(geteuid HAVE_GETEUID) CHECK_FUNCTION_EXISTS_GLIBC(getgrgid_r HAVE_GETGRGID_R) CHECK_FUNCTION_EXISTS_GLIBC(getgrnam_r HAVE_GETGRNAM_R) +CHECK_FUNCTION_EXISTS_GLIBC(getline HAVE_GETLINE) CHECK_FUNCTION_EXISTS_GLIBC(getpwnam_r HAVE_GETPWNAM_R) CHECK_FUNCTION_EXISTS_GLIBC(getpwuid_r HAVE_GETPWUID_R) CHECK_FUNCTION_EXISTS_GLIBC(getpid HAVE_GETPID) @@ -1402,12 +1508,12 @@ CHECK_FUNCTION_EXISTS_GLIBC(wcscmp HAVE_WCSCMP) CHECK_FUNCTION_EXISTS_GLIBC(wcscpy HAVE_WCSCPY) CHECK_FUNCTION_EXISTS_GLIBC(wcslen HAVE_WCSLEN) CHECK_FUNCTION_EXISTS_GLIBC(wctomb HAVE_WCTOMB) -CHECK_FUNCTION_EXISTS_GLIBC(_ctime64_s HAVE__CTIME64_S) CHECK_FUNCTION_EXISTS_GLIBC(_fseeki64 HAVE__FSEEKI64) CHECK_FUNCTION_EXISTS_GLIBC(_get_timezone HAVE__GET_TIMEZONE) -CHECK_FUNCTION_EXISTS_GLIBC(_gmtime64_s HAVE__GMTIME64_S) -CHECK_FUNCTION_EXISTS_GLIBC(_localtime64_s HAVE__LOCALTIME64_S) -CHECK_FUNCTION_EXISTS_GLIBC(_mkgmtime64 HAVE__MKGMTIME64) +CHECK_SYMBOL_EXISTS(ctime_s "time.h" HAVE_CTIME_S) +CHECK_SYMBOL_EXISTS(gmtime_s "time.h" HAVE_GMTIME_S) +CHECK_SYMBOL_EXISTS(localtime_s "time.h" HAVE_LOCALTIME_S) +CHECK_SYMBOL_EXISTS(_mkgmtime "time.h" HAVE__MKGMTIME) SET(CMAKE_REQUIRED_LIBRARIES "") CHECK_FUNCTION_EXISTS(cygwin_conv_path HAVE_CYGWIN_CONV_PATH) @@ -1450,7 +1556,6 @@ CHECK_C_SOURCE_COMPILES( "#include <fcntl.h>\n#include <unistd.h>\nint main() {char buf[10]; return readlinkat(AT_FDCWD, \"\", buf, 0);}" HAVE_READLINKAT) - # To verify major(), we need to both include the header # of interest and verify that the result can be linked. # CHECK_FUNCTION_EXISTS doesn't accept a header argument, @@ -1462,14 +1567,6 @@ CHECK_C_SOURCE_COMPILES( "#include <sys/sysmacros.h>\nint main() { return major(256); }" MAJOR_IN_SYSMACROS) -IF(ENABLE_LZMA) -CHECK_C_SOURCE_COMPILES( - "#include <lzma.h>\n#if LZMA_VERSION < 50020000\n#error unsupported\n#endif\nint main(void){lzma_stream_encoder_mt(0, 0); return 0;}" - HAVE_LZMA_STREAM_ENCODER_MT) -ELSE() - SET(HAVE_LZMA_STREAM_ENCODER_MT 0) -ENDIF(ENABLE_LZMA) - IF(HAVE_STRERROR_R) SET(HAVE_DECL_STRERROR_R 1) ENDIF(HAVE_STRERROR_R) @@ -1549,7 +1646,7 @@ ENDIF() # # CHECK_STRUCT_HAS_MEMBER("struct tm" tm_sec - "sys/types.h;sys/time.h;time.h" TIME_WITH_SYS_TIME) + "sys/types.h;sys/time.h;time.h" HAVE_SYS_TIME_H) # # Check for integer types @@ -2024,6 +2121,17 @@ CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA512" LIBMD) CHECK_CRYPTO_WIN("MD5;SHA1;SHA256;SHA384;SHA512") +# Check visibility annotations +SET(OLD_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}") +SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fvisibility=hidden -Werror") +CHECK_C_SOURCE_COMPILES("void __attribute__((visibility(\"default\"))) foo(void); +int main() { return 0; }" HAVE_VISIBILITY_ATTR) +IF (HAVE_VISIBILITY_ATTR) + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden") + ADD_DEFINITIONS(-D__LIBARCHIVE_ENABLE_VISIBILITY) +ENDIF(HAVE_VISIBILITY_ATTR) +SET(CMAKE_REQUIRED_FLAGS "${OLD_CMAKE_REQUIRED_FLAGS}") + # Generate "config.h" from "build/cmake/config.h.in" CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/build/cmake/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h) @@ -2071,3 +2179,4 @@ add_subdirectory(libarchive) add_subdirectory(cat) add_subdirectory(tar) add_subdirectory(cpio) +add_subdirectory(unzip) diff --git a/Makefile.am b/Makefile.am index 743aaa0db05c..286f08694c43 100644 --- a/Makefile.am +++ b/Makefile.am @@ -8,17 +8,17 @@ ACLOCAL_AMFLAGS = -I build/autoconf # lib_LTLIBRARIES= libarchive.la noinst_LTLIBRARIES= libarchive_fe.la -bin_PROGRAMS= $(bsdtar_programs) $(bsdcpio_programs) $(bsdcat_programs) -man_MANS= $(libarchive_man_MANS) $(bsdtar_man_MANS) $(bsdcpio_man_MANS) $(bsdcat_man_MANS) -BUILT_SOURCES= libarchive/test/list.h tar/test/list.h cpio/test/list.h cat/test/list.h +bin_PROGRAMS= $(bsdtar_programs) $(bsdcpio_programs) $(bsdcat_programs) $(bsdunzip_programs) +man_MANS= $(libarchive_man_MANS) $(bsdtar_man_MANS) $(bsdcpio_man_MANS) $(bsdcat_man_MANS) $(bsdunzip_man_MANS) +BUILT_SOURCES= libarchive/test/list.h tar/test/list.h cpio/test/list.h cat/test/list.h unzip/test/list.h # # What to test: We always test libarchive, test bsdtar and bsdcpio only # if we built them. # -check_PROGRAMS= libarchive_test $(bsdtar_test_programs) $(bsdcpio_test_programs) $(bsdcat_test_programs) -TESTS= libarchive_test $(bsdtar_test_programs) $(bsdcpio_test_programs) $(bsdcat_test_programs) -TESTS_ENVIRONMENT= $(libarchive_TESTS_ENVIRONMENT) $(bsdtar_TESTS_ENVIRONMENT) $(bsdcpio_TESTS_ENVIRONMENT) $(bsdcat_TESTS_ENVIRONMENT) +check_PROGRAMS= libarchive_test $(bsdtar_test_programs) $(bsdcpio_test_programs) $(bsdcat_test_programs) $(bsdunzip_test_programs) +TESTS= libarchive_test $(bsdtar_test_programs) $(bsdcpio_test_programs) $(bsdcat_test_programs) $(bsdunzip_test_programs) +TESTS_ENVIRONMENT= $(libarchive_TESTS_ENVIRONMENT) $(bsdtar_TESTS_ENVIRONMENT) $(bsdcpio_TESTS_ENVIRONMENT) $(bsdcat_TESTS_ENVIRONMENT) $(bsdunzip_TESTS_ENVIRONMENT) # Always build and test both bsdtar and bsdcpio as part of 'distcheck' DISTCHECK_CONFIGURE_FLAGS = --enable-bsdtar --enable-bsdcpio # The next line is commented out by default in shipping libarchive releases. @@ -49,7 +49,9 @@ EXTRA_DIST= \ $(bsdcpio_EXTRA_DIST) \ $(bsdcpio_test_EXTRA_DIST) \ $(bsdcat_EXTRA_DIST) \ - $(bsdcat_test_EXTRA_DIST) + $(bsdcat_test_EXTRA_DIST) \ + $(bsdunzip_EXTRA_DIST) \ + $(bsdunzip_test_EXTRA_DIST) # a) Clean out some unneeded files and directories # b) Collect all documentation and format it for distribution. @@ -69,7 +71,8 @@ DISTCLEANFILES= \ libarchive/test/list.h \ tar/test/list.h \ cpio/test/list.h \ - cat/test/list.h + cat/test/list.h \ + unzip/test/list.h distclean-local: -rm -rf .ref @@ -82,7 +85,9 @@ distclean-local: -[ -f cpio/Makefile ] && cd cpio && make clean -[ -f cpio/test/Makefile ] && cd cpio/test && make clean -[ -f cat/Makefile ] && cd cat && make clean - -[ -f cpio/test/Makefile ] && cd cat/test && make clean + -[ -f cat/test/Makefile ] && cd cat/test && make clean + -[ -f unzip/Makefile ] && cd unzip && make clean + -[ -f unzip/test/Makefile ] && cd unzip/test && make clean # # Libarchive headers, source, etc. @@ -284,7 +289,7 @@ endif # -no-undefined marks that libarchive doesn't rely on symbols # defined in the application. This is mandatory for cygwin. -libarchive_la_LDFLAGS= -no-undefined -version-info $(ARCHIVE_LIBTOOL_VERSION) $(GC_SECTIONS) +libarchive_la_LDFLAGS= -no-undefined -version-info $(ARCHIVE_LIBTOOL_VERSION) $(DEAD_CODE_REMOVAL) libarchive_la_LIBADD= $(LTLIBICONV) # Manpages to install @@ -449,6 +454,7 @@ libarchive_test_SOURCES= \ libarchive/test/test_read_filter_program.c \ libarchive/test/test_read_filter_program_signature.c \ libarchive/test/test_read_filter_uudecode.c \ + libarchive/test/test_read_filter_uudecode_raw.c \ libarchive/test/test_read_format_7zip.c \ libarchive/test/test_read_format_7zip_encryption_data.c \ libarchive/test/test_read_format_7zip_encryption_partially.c \ @@ -513,6 +519,7 @@ libarchive_test_SOURCES= \ libarchive/test/test_read_format_tar_empty_filename.c \ libarchive/test/test_read_format_tar_empty_with_gnulabel.c \ libarchive/test/test_read_format_tar_filename.c \ + libarchive/test/test_read_format_tar_invalid_pax_size.c \ libarchive/test/test_read_format_tbz.c \ libarchive/test/test_read_format_tgz.c \ libarchive/test/test_read_format_tlz.c \ @@ -626,13 +633,15 @@ libarchive_test_SOURCES= \ libarchive/test/test_write_format_xar.c \ libarchive/test/test_write_format_xar_empty.c \ libarchive/test/test_write_format_zip.c \ + libarchive/test/test_write_format_zip64_stream.c \ libarchive/test/test_write_format_zip_compression_store.c \ - libarchive/test/test_write_format_zip_entry_size_unset.c \ libarchive/test/test_write_format_zip_empty.c \ libarchive/test/test_write_format_zip_empty_zip64.c \ + libarchive/test/test_write_format_zip_entry_size_unset.c \ libarchive/test/test_write_format_zip_file.c \ libarchive/test/test_write_format_zip_file_zip64.c \ libarchive/test/test_write_format_zip_large.c \ + libarchive/test/test_write_format_zip_stream.c \ libarchive/test/test_write_format_zip_zip64.c \ libarchive/test/test_write_open_memory.c \ libarchive/test/test_write_read_format_zip.c \ @@ -683,6 +692,8 @@ libarchive_test_EXTRA_DIST=\ libarchive/test/test_compat_lz4_B7BD.tar.lz4.uu \ libarchive/test/test_compat_lzip_1.tlz.uu \ libarchive/test/test_compat_lzip_2.tlz.uu \ + libarchive/test/test_compat_lzip_3.lz.uu \ + libarchive/test/test_compat_lzip_4.tlz.uu \ libarchive/test/test_compat_lzma_1.tlz.uu \ libarchive/test/test_compat_lzma_2.tlz.uu \ libarchive/test/test_compat_lzma_3.tlz.uu \ @@ -742,6 +753,8 @@ libarchive_test_EXTRA_DIST=\ libarchive/test/test_read_filter_lrzip.tar.lrz.uu \ libarchive/test/test_read_filter_lzop.tar.lzo.uu \ libarchive/test/test_read_filter_lzop_multiple_parts.tar.lzo.uu \ + libarchive/test/test_read_filter_uudecode_raw.uu \ + libarchive/test/test_read_filter_uudecode_base64_raw.uu \ libarchive/test/test_read_format_mtree_crash747.mtree.bz2.uu \ libarchive/test/test_read_format_mtree_noprint.mtree.uu \ libarchive/test/test_read_format_7zip_bcj2_bzip2.7z.uu \ @@ -762,6 +775,7 @@ libarchive_test_EXTRA_DIST=\ libarchive/test/test_read_format_7zip_copy.7z.uu \ libarchive/test/test_read_format_7zip_copy_2.7z.uu \ libarchive/test/test_read_format_7zip_deflate.7z.uu \ + libarchive/test/test_read_format_7zip_deflate_arm64.7z.uu \ libarchive/test/test_read_format_7zip_delta_lzma1.7z.uu \ libarchive/test/test_read_format_7zip_delta4_lzma1.7z.uu \ libarchive/test/test_read_format_7zip_delta_lzma2.7z.uu \ @@ -775,11 +789,19 @@ libarchive_test_EXTRA_DIST=\ libarchive/test/test_read_format_7zip_lzma1_2.7z.uu \ libarchive/test/test_read_format_7zip_lzma1_lzma2.7z.uu \ libarchive/test/test_read_format_7zip_lzma2.7z.uu \ + libarchive/test/test_read_format_7zip_lzma2_arm64.7z.uu \ + libarchive/test/test_read_format_7zip_lzma2_arm.7z.uu \ libarchive/test/test_read_format_7zip_malformed.7z.uu \ libarchive/test/test_read_format_7zip_malformed2.7z.uu \ libarchive/test/test_read_format_7zip_packinfo_digests.7z.uu \ libarchive/test/test_read_format_7zip_ppmd.7z.uu \ + libarchive/test/test_read_format_7zip_solid_zstd.7z.uu \ libarchive/test/test_read_format_7zip_symbolic_name.7z.uu \ + libarchive/test/test_read_format_7zip_win_attrib.7z.uu \ + libarchive/test/test_read_format_7zip_zstd_arm.7z.uu \ + libarchive/test/test_read_format_7zip_zstd_bcj.7z.uu \ + libarchive/test/test_read_format_7zip_zstd_nobcj.7z.uu \ + libarchive/test/test_read_format_7zip_zstd.7z.uu \ libarchive/test/test_read_format_ar.ar.uu \ libarchive/test/test_read_format_cab_1.cab.uu \ libarchive/test/test_read_format_cab_2.cab.uu \ @@ -905,6 +927,7 @@ libarchive_test_EXTRA_DIST=\ libarchive/test/test_read_format_tar_empty_with_gnulabel.tar.uu \ libarchive/test/test_read_format_tar_empty_pax.tar.Z.uu \ libarchive/test/test_read_format_tar_filename_koi8r.tar.Z.uu \ + libarchive/test/test_read_format_tar_invalid_pax_size.tar.uu \ libarchive/test/test_read_format_ustar_filename_cp866.tar.Z.uu \ libarchive/test/test_read_format_ustar_filename_eucjp.tar.Z.uu \ libarchive/test/test_read_format_ustar_filename_koi8r.tar.Z.uu \ @@ -1031,7 +1054,7 @@ endif bsdtar_LDADD= libarchive.la libarchive_fe.la $(LTLIBICONV) bsdtar_CPPFLAGS= -I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe $(bsdtar_ccstatic) $(PLATFORMCPPFLAGS) -bsdtar_LDFLAGS= $(bsdtar_ldstatic) $(GC_SECTIONS) +bsdtar_LDFLAGS= $(bsdtar_ldstatic) $(DEAD_CODE_REMOVAL) bsdtar_EXTRA_DIST= \ tar/bsdtar.1 \ @@ -1091,6 +1114,7 @@ bsdtar_test_SOURCES= \ tar/test/test_option_exclude_vcs.c \ tar/test/test_option_fflags.c \ tar/test/test_option_gid_gname.c \ + tar/test/test_option_group.c \ tar/test/test_option_grzip.c \ tar/test/test_option_ignore_zeros.c \ tar/test/test_option_j.c \ @@ -1104,6 +1128,7 @@ bsdtar_test_SOURCES= \ tar/test/test_option_newer_than.c \ tar/test/test_option_nodump.c \ tar/test/test_option_older_than.c \ + tar/test/test_option_owner.c \ tar/test/test_option_passphrase.c \ tar/test/test_option_q.c \ tar/test/test_option_r.c \ @@ -1197,7 +1222,7 @@ endif bsdcpio_LDADD= libarchive_fe.la libarchive.la $(LTLIBICONV) bsdcpio_CPPFLAGS= -I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe $(bsdcpio_ccstatic) $(PLATFORMCPPFLAGS) -bsdcpio_LDFLAGS= $(bsdcpio_ldstatic) $(GC_SECTIONS) +bsdcpio_LDFLAGS= $(bsdcpio_ldstatic) $(DEAD_CODE_REMOVAL) bsdcpio_EXTRA_DIST= \ cpio/bsdcpio.1 \ @@ -1351,7 +1376,7 @@ endif bsdcat_LDADD= libarchive_fe.la libarchive.la $(LTLIBICONV) bsdcat_CPPFLAGS= -I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe $(bsdcat_ccstatic) $(PLATFORMCPPFLAGS) -bsdcat_LDFLAGS= $(bsdcat_ldstatic) $(GC_SECTIONS) +bsdcat_LDFLAGS= $(bsdcat_ldstatic) $(DEAD_CODE_REMOVAL) bsdcat_EXTRA_DIST= \ cat/bsdcat.1 \ @@ -1402,6 +1427,7 @@ bsdcat_test_CPPFLAGS= \ bsdcat_test_LDADD=libarchive_fe.la cat/test/list.h: Makefile + $(MKDIR_P) cat/test cat $(top_srcdir)/cat/test/test_*.c | grep '^DEFINE_TEST' > cat/test/list.h if BUILD_BSDCAT @@ -1426,3 +1452,108 @@ bsdcat_test_EXTRA_DIST= \ cat/test/test_expand.plain.uu \ cat/test/test_expand.xz.uu \ cat/test/CMakeLists.txt + +# +# +# bsdunzip source, docs, etc. +# +# + +bsdunzip_SOURCES= \ + unzip/bsdunzip.c \ + unzip/bsdunzip.h \ + unzip/bsdunzip_platform.h \ + unzip/cmdline.c \ + unzip/la_getline.c \ + unzip/la_queue.h + +if INC_WINDOWS_FILES +bsdunzip_SOURCES+= +endif + +bsdunzip_DEPENDENCIES = libarchive.la libarchive_fe.la + + +if STATIC_BSDUNZIP +bsdunzip_ldstatic= -static +bsdunzip_ccstatic= -DLIBARCHIVE_STATIC +else +bsdunzip_ldstatic= +bsdunzip_ccstatic= +endif + +bsdunzip_LDADD= libarchive_fe.la libarchive.la $(LTLIBICONV) +bsdunzip_CPPFLAGS= -I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe $(bsdunzip_ccstatic) $(PLATFORMCPPFLAGS) +bsdunzip_LDFLAGS= $(bsdunzip_ldstatic) $(DEAD_CODE_REMOVAL) + +bsdunzip_EXTRA_DIST= \ + unzip/bsdunzip.1 \ + unzip/CMakeLists.txt + + +if BUILD_BSDUNZIP +# Manpages to install +bsdunzip_man_MANS= unzip/bsdunzip.1 +bsdunzip_programs= bsdunzip +else +bsdunzip_man_MANS= +bsdunzip_programs= +endif + +# +# bsdunzip_test +# + +bsdunzip_test_SOURCES= \ + $(test_utils_SOURCES) \ + unzip/test/test.h \ + unzip/test/test_0.c \ + unzip/test/test_basic.c \ + unzip/test/test_doubledash.c \ + unzip/test/test_glob.c \ + unzip/test/test_not_exist.c \ + unzip/test/test_singlefile.c \ + unzip/test/test_C.c \ + unzip/test/test_p.c \ + unzip/test/test_d.c \ + unzip/test/test_j.c \ + unzip/test/test_L.c \ + unzip/test/test_n.c \ + unzip/test/test_o.c \ + unzip/test/test_q.c \ + unzip/test/test_t.c \ + unzip/test/test_t_bad.c \ + unzip/test/test_version.c \ + unzip/test/test_x.c \ + unzip/test/test_Z1.c \ + unzip/test/test_P_encryption.c \ + unzip/test/test_I.c + +bsdunzip_test_CPPFLAGS= \ + -I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe \ + -I$(top_srcdir)/test_utils \ + -I$(top_srcdir)/unzip -I$(top_srcdir)/unzip/test \ + -I$(top_builddir)/unzip/test \ + $(PLATFORMCPPFLAGS) +bsdunzip_test_LDADD=libarchive_fe.la + +unzip/test/list.h: Makefile + $(MKDIR_P) unzip/test + cat $(top_srcdir)/unzip/test/test_*.c | grep '^DEFINE_TEST' > unzip/test/list.h + +if BUILD_BSDUNZIP +bsdunzip_test_programs= bsdunzip_test +bsdunzip_TESTS_ENVIRONMENT= BSDUNZIP=`cd $(top_builddir);/bin/pwd`/bsdunzip$(EXEEXT) BSDUNZIP_TEST_FILES=`cd $(top_srcdir);/bin/pwd`/unzip/test +else +bsdunzip_test_programs= +bsdunzip_TESTS_ENVIRONMENT= +endif + +bsdunzip_test_EXTRA_DIST= \ + unzip/test/list.h \ + unzip/test/test_basic.zip.uu \ + unzip/test/test_encrypted.zip.uu \ + unzip/test/test_singlefile.zip.uu \ + unzip/test/test_t_bad.zip.uu \ + unzip/test/test_I.zip.uu \ + unzip/test/CMakeLists.txt @@ -1,3 +1,17 @@ +Apr 08, 2024: libarchive 3.7.3 released + +Sep 12, 2023: libarchive 3.7.2 released + +Jul 29, 2023: libarchive 3.7.1 released + +Jul 18, 2023: libarchive 3.7.0 released + +Jul 14, 2023: bsdunzip port from FreeBSD + +Dec 07, 2022: libarchive 3.6.2 released + +Apr 08, 2022: libarchive 3.6.1 released + Feb 09, 2022: libarchive 3.6.0 released Feb 08, 2022: libarchive 3.5.3 released diff --git a/README.md b/README.md index d5ef70c2191d..727ed49856b6 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ command-line tools that use the libarchive library. ## Questions? Issues? -* http://www.libarchive.org is the home for ongoing +* https://www.libarchive.org is the home for ongoing libarchive development, including documentation, and links to the libarchive mailing lists. * To report an issue, use the issue tracker at @@ -23,6 +23,7 @@ This distribution bundle includes the following major components: * **tar**: the 'bsdtar' program is a full-featured 'tar' implementation built on libarchive * **cpio**: the 'bsdcpio' program is a different interface to essentially the same functionality * **cat**: the 'bsdcat' program is a simple replacement tool for zcat, bzcat, xzcat, and such +* **unzip**: the 'bsdunzip' program is a simple replacement tool for Info-ZIP's unzip * **examples**: Some small example programs that you may find useful. * **examples/minitar**: a compact sample demonstrating use of libarchive. * **contrib**: Various items sent to me by third parties; please contact the authors with any questions. @@ -37,6 +38,7 @@ The top-level directory contains the following information files: * **configure** - configuration script, see INSTALL for details. If your copy of the source lacks a `configure` script, you can try to construct it by running the script in `build/autogen.sh` (or use `cmake`). The following files in the top-level directory are used by the 'configure' script: + * `Makefile.am`, `aclocal.m4`, `configure.ac` - used to build this distribution, only needed by maintainers * `Makefile.in`, `config.h.in` - templates used by configure script @@ -71,6 +73,7 @@ know about any errors or omissions you find. ## Supported Formats Currently, the library automatically detects and reads the following formats: + * Old V7 tar archives * POSIX ustar * GNU tar format (including GNU long filenames, long link names, and sparse files) @@ -85,13 +88,14 @@ Currently, the library automatically detects and reads the following formats: * ZIPX archives (with support for bzip2, ppmd8, lzma and xz compressed entries) * GNU and BSD 'ar' archives * 'mtree' format - * 7-Zip archives + * 7-Zip archives (including archives that use zstandard compression) * Microsoft CAB format * LHA and LZH archives * RAR and RAR 5.0 archives (with some limitations due to RAR's proprietary status) * XAR archives The library also detects and handles any of the following before evaluating the archive: + * uuencoded files * files with RPM wrapper * gzip compression @@ -103,6 +107,7 @@ The library also detects and handles any of the following before evaluating the * zstandard compression The library can create archives in any of the following formats: + * POSIX ustar * POSIX pax interchange format * "restricted" pax format, which will create ustar archives except for @@ -122,6 +127,7 @@ The library can create archives in any of the following formats: * XAR archives When creating archives, the result can be filtered with any of the following: + * uuencode * gzip compression * bzip2 compression @@ -187,6 +193,17 @@ questions we are asked about libarchive: functions. On those platforms, libarchive will use the non-thread-safe functions. Patches to improve this are of great interest to us. +* The function `archive_write_disk_header()` is _not_ thread safe on + POSIX machines and could lead to security issue resulting in world + writeable directories. Thus it must be mutexed by the calling code. + This is due to calling `umask(oldumask = umask(0))`, which sets the + umask for the whole process to 0 for a short time frame. + In case other thread calls the same function in parallel, it might + get interrupted by it and cause the executable to use umask=0 for the + remaining execution. + This will then lead to implicitely created directories to have 777 + permissions without sticky bit. + * In particular, libarchive's modules to read or write a directory tree do use `chdir()` to optimize the directory traversals. This can cause problems for programs that expect to do disk access from diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000000..6ca188b603fe --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,19 @@ +# Security Policy + +If you have discovered a security vulnerability in this project, please report it +privately. **Do not disclose it as a public issue.** This gives us time to work with you +to fix the issue before public exposure, reducing the chance that the exploit will be +used before a patch is released. + +You may submit the report in the following ways: + +- send an email to security@libarchive.de; and/or +- send us a [private vulnerability report](https://github.com/libarchive/libarchive/security/advisories/new) + +Please provide the following information in your report: + +- A description of the vulnerability and its impact +- How to reproduce the issue + +This project is maintained by volunteers on a reasonable-effort basis. As such, we ask +that you give me 90 days to work on a fix before public exposure. diff --git a/build/ci/build.sh b/build/ci/build.sh index 79f26d758f35..0cc131cfd8cb 100755 --- a/build/ci/build.sh +++ b/build/ci/build.sh @@ -97,9 +97,6 @@ if [ -n "${DEBUG}" ]; then else export CFLAGS="-g -fsanitize=address" fi - if [ "${BS}" = "cmake" ]; then - CMAKE_ARGS="${CMAKE_ARGS} -DCMAKE_C_CFLAGS=-g -fsanitize=address" - fi fi if [ -z "${ACTIONS}" ]; then ACTIONS="autogen configure build test install" diff --git a/build/ci/github_actions/ci.cmd b/build/ci/github_actions/ci.cmd index 7adb98f913a5..990475d1b8f0 100755 --- a/build/ci/github_actions/ci.cmd +++ b/build/ci/github_actions/ci.cmd @@ -1,7 +1,7 @@ @ECHO OFF -SET ZLIB_VERSION=1.2.11 -SET BZIP2_VERSION=b7a672291188a6469f71dd13ad14f2f9a7344fc8 -SET XZ_VERSION=5.2.5 +SET ZLIB_VERSION=1.3 +SET BZIP2_VERSION=1ea1ac188ad4b9cb662e3f8314673c63df95a589 +SET XZ_VERSION=5.4.4 IF NOT "%BE%"=="mingw-gcc" ( IF NOT "%BE%"=="msvc" ( ECHO Environment variable BE must be mingw-gcc or msvc @@ -9,9 +9,18 @@ IF NOT "%BE%"=="mingw-gcc" ( ) ) +REM v1.5.6 has a bug with the CMake files & MSVC +REM https://github.com/facebook/zstd/issues/3999 +REM Fall back to 1.5.5 for MSVC until fixed +IF "%BE%"=="msvc" ( + SET ZSTD_VERSION=1.5.5 +) ELSE ( + SET ZSTD_VERSION=1.5.6 +) + SET ORIGPATH=%PATH% IF "%BE%"=="mingw-gcc" ( - SET MINGWPATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\cmake\bin;C:\ProgramData\chocolatey\lib\mingw\tools\install\mingw64\bin + SET MINGWPATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\cmake\bin;C:\ProgramData\mingw64\mingw64\bin ) IF "%1"=="deplibs" ( @@ -43,6 +52,14 @@ IF "%1"=="deplibs" ( echo Unpacking xz-%XZ_VERSION%.zip C:\windows\system32\tar.exe -x -f xz-%XZ_VERSION%.zip || EXIT /b 1 ) + IF NOT EXIST zstd-%ZSTD_VERSION%.zip ( + echo Downloading https://github.com/facebook/zstd/archive/refs/tags/v%ZSTD_VERSION%.zip + curl -L -o zstd-%ZSTD_VERSION%.zip https://github.com/facebook/zstd/archive/refs/tags/v%ZSTD_VERSION%.zip || EXIT /b 1 + ) + IF NOT EXIST zstd-%ZSTD_VERSION% ( + echo Unpacking zstd-%ZSTD_VERSION%.zip + C:\windows\system32\tar.exe -x -f zstd-%ZSTD_VERSION%.zip || EXIT /b 1 + ) CD zlib-%ZLIB_VERSION% IF "%BE%"=="mingw-gcc" ( SET PATH=%MINGWPATH% @@ -82,16 +99,28 @@ IF "%1"=="deplibs" ( cmake --build . --target ALL_BUILD --config Release || EXIT /b 1 cmake --build . --target INSTALL --config Release || EXIT /b 1 ) + CD .. + CD zstd-%ZSTD_VERSION%\build\cmake + 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 17 2022" -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" ( IF "%BE%"=="mingw-gcc" ( SET PATH=%MINGWPATH% MKDIR 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" -D LIBLZMA_LIBRARY="C:/Program Files (x86)/xz/lib/liblzma.a" -D LIBLZMA_INCLUDE_DIR="C:/Program Files (x86)/xz/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_static.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" -D ZSTD_LIBRARY="C:/Program Files (x86)/zstd/lib/libzstd.a" -D ZSTD_INCLUDE_DIR="C:/Program Files (x86)/zstd/include" ..\.. || EXIT /b 1 ) ELSE IF "%BE%"=="msvc" ( MKDIR build_ci\cmake CD build_ci\cmake - cmake -G "Visual Studio 17 2022" -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 + cmake -G "Visual Studio 17 2022" -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_static.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" -D ZSTD_LIBRARY="C:/Program Files (x86)/zstd/lib/zstd_static.lib" -D ZSTD_INCLUDE_DIR="C:/Program Files (x86)/zstd/include" ..\.. || EXIT /b 1 ) ) ELSE IF "%1%"=="build" ( IF "%BE%"=="mingw-gcc" ( diff --git a/build/cmake/FindLibGCC.cmake b/build/cmake/FindLIBGCC.cmake index 5883ff802642..5883ff802642 100644 --- a/build/cmake/FindLibGCC.cmake +++ b/build/cmake/FindLIBGCC.cmake diff --git a/build/cmake/FindMbedTLS.cmake b/build/cmake/FindMbedTLS.cmake index a91639589218..aa40485c3ecd 100644 --- a/build/cmake/FindMbedTLS.cmake +++ b/build/cmake/FindMbedTLS.cmake @@ -7,7 +7,7 @@ find_library(MBEDCRYPTO_LIBRARY mbedcrypto) set(MBEDTLS_LIBRARIES "${MBEDTLS_LIBRARY}" "${MBEDX509_LIBRARY}" "${MBEDCRYPTO_LIBRARY}") include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(MBEDTLS DEFAULT_MSG +find_package_handle_standard_args(MbedTLS DEFAULT_MSG MBEDTLS_INCLUDE_DIRS MBEDTLS_LIBRARY MBEDX509_LIBRARY MBEDCRYPTO_LIBRARY) mark_as_advanced(MBEDTLS_INCLUDE_DIRS MBEDTLS_LIBRARY MBEDX509_LIBRARY MBEDCRYPTO_LIBRARY) diff --git a/build/cmake/FindPCRE2POSIX.cmake b/build/cmake/FindPCRE2POSIX.cmake new file mode 100644 index 000000000000..4104f3791aa8 --- /dev/null +++ b/build/cmake/FindPCRE2POSIX.cmake @@ -0,0 +1,34 @@ +# - Find pcre2posix
+# Find the native PCRE2-8 and PCRE2-POSIX include and libraries
+#
+# PCRE2_INCLUDE_DIR - where to find pcre2posix.h, etc.
+# PCRE2POSIX_LIBRARIES - List of libraries when using libpcre2-posix.
+# PCRE2_LIBRARIES - List of libraries when using libpcre2-8.
+# PCRE2POSIX_FOUND - True if libpcre2-posix found.
+# PCRE2_FOUND - True if libpcre2-8 found.
+
+IF (PCRE2_INCLUDE_DIR)
+ # Already in cache, be silent
+ SET(PCRE2_FIND_QUIETLY TRUE)
+ENDIF (PCRE2_INCLUDE_DIR)
+
+FIND_PATH(PCRE2_INCLUDE_DIR pcre2posix.h)
+FIND_LIBRARY(PCRE2POSIX_LIBRARY NAMES pcre2-posix libpcre2-posix pcre2-posix-static)
+FIND_LIBRARY(PCRE2_LIBRARY NAMES pcre2-8 libpcre2-8 pcre2-8-static)
+
+# handle the QUIETLY and REQUIRED arguments and set PCRE2POSIX_FOUND to TRUE if
+# all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(PCRE2POSIX DEFAULT_MSG PCRE2POSIX_LIBRARY PCRE2_INCLUDE_DIR)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(PCRE2 DEFAULT_MSG PCRE2_LIBRARY)
+
+IF(PCRE2POSIX_FOUND)
+ SET(PCRE2POSIX_LIBRARIES ${PCRE2POSIX_LIBRARY})
+ SET(HAVE_LIBPCRE2POSIX 1)
+ SET(HAVE_PCRE2POSIX_H 1)
+ENDIF(PCRE2POSIX_FOUND)
+
+IF(PCRE2_FOUND)
+ SET(PCRE2_LIBRARIES ${PCRE2_LIBRARY})
+ SET(HAVE_LIBPCRE2 1)
+ENDIF(PCRE2_FOUND)
diff --git a/build/cmake/config.h.in b/build/cmake/config.h.in index b7f8db7a2e2d..045a6b41657e 100644 --- a/build/cmake/config.h.in +++ b/build/cmake/config.h.in @@ -164,7 +164,7 @@ typedef unsigned char uint8_t; #define HAVE_UINT8_T #endif -#if !defined(HAVE_UINT16_T) +#if !defined(HAVE_UINT8_T) #error No 8-bit unsigned integer type was found. #endif @@ -207,6 +207,9 @@ typedef uint64_t uintmax_t; /* MD5 via ARCHIVE_CRYPTO_MD5_LIBSYSTEM supported. */ #cmakedefine ARCHIVE_CRYPTO_MD5_LIBSYSTEM 1 +/* MD5 via ARCHIVE_CRYPTO_MD5_MBEDTLS supported. */ +#cmakedefine ARCHIVE_CRYPTO_MD5_MBEDTLS 1 + /* MD5 via ARCHIVE_CRYPTO_MD5_NETTLE supported. */ #cmakedefine ARCHIVE_CRYPTO_MD5_NETTLE 1 @@ -222,6 +225,9 @@ typedef uint64_t uintmax_t; /* RMD160 via ARCHIVE_CRYPTO_RMD160_NETTLE supported. */ #cmakedefine ARCHIVE_CRYPTO_RMD160_NETTLE 1 +/* RMD160 via ARCHIVE_CRYPTO_RMD160_MBEDTLS supported. */ +#cmakedefine ARCHIVE_CRYPTO_RMD160_MBEDTLS 1 + /* RMD160 via ARCHIVE_CRYPTO_RMD160_OPENSSL supported. */ #cmakedefine ARCHIVE_CRYPTO_RMD160_OPENSSL 1 @@ -231,6 +237,9 @@ typedef uint64_t uintmax_t; /* SHA1 via ARCHIVE_CRYPTO_SHA1_LIBSYSTEM supported. */ #cmakedefine ARCHIVE_CRYPTO_SHA1_LIBSYSTEM 1 +/* SHA1 via ARCHIVE_CRYPTO_SHA1_MBEDTLS supported. */ +#cmakedefine ARCHIVE_CRYPTO_SHA1_MBEDTLS 1 + /* SHA1 via ARCHIVE_CRYPTO_SHA1_NETTLE supported. */ #cmakedefine ARCHIVE_CRYPTO_SHA1_NETTLE 1 @@ -252,6 +261,9 @@ typedef uint64_t uintmax_t; /* SHA256 via ARCHIVE_CRYPTO_SHA256_LIBSYSTEM supported. */ #cmakedefine ARCHIVE_CRYPTO_SHA256_LIBSYSTEM 1 +/* SHA256 via ARCHIVE_CRYPTO_SHA256_MBEDTLS supported. */ +#cmakedefine ARCHIVE_CRYPTO_SHA256_MBEDTLS 1 + /* SHA256 via ARCHIVE_CRYPTO_SHA256_NETTLE supported. */ #cmakedefine ARCHIVE_CRYPTO_SHA256_NETTLE 1 @@ -273,6 +285,9 @@ typedef uint64_t uintmax_t; /* SHA384 via ARCHIVE_CRYPTO_SHA384_LIBSYSTEM supported. */ #cmakedefine ARCHIVE_CRYPTO_SHA384_LIBSYSTEM 1 +/* SHA384 via ARCHIVE_CRYPTO_SHA384_MBEDTLS supported. */ +#cmakedefine ARCHIVE_CRYPTO_SHA384_MBEDTLS 1 + /* SHA384 via ARCHIVE_CRYPTO_SHA384_NETTLE supported. */ #cmakedefine ARCHIVE_CRYPTO_SHA384_NETTLE 1 @@ -294,6 +309,9 @@ typedef uint64_t uintmax_t; /* SHA512 via ARCHIVE_CRYPTO_SHA512_LIBSYSTEM supported. */ #cmakedefine ARCHIVE_CRYPTO_SHA512_LIBSYSTEM 1 +/* SHA512 via ARCHIVE_CRYPTO_SHA512_MBEDTLS supported. */ +#cmakedefine ARCHIVE_CRYPTO_SHA512_MBEDTLS 1 + /* SHA512 via ARCHIVE_CRYPTO_SHA512_NETTLE supported. */ #cmakedefine ARCHIVE_CRYPTO_SHA512_NETTLE 1 @@ -316,13 +334,16 @@ typedef uint64_t uintmax_t; #cmakedefine ARCHIVE_XATTR_LINUX 1 /* Version number of bsdcpio */ -#cmakedefine BSDCPIO_VERSION_STRING "${BSDCPIO_VERSION_STRING}" +#cmakedefine BSDCPIO_VERSION_STRING "@BSDCPIO_VERSION_STRING@" /* Version number of bsdtar */ -#cmakedefine BSDTAR_VERSION_STRING "${BSDTAR_VERSION_STRING}" +#cmakedefine BSDTAR_VERSION_STRING "@BSDTAR_VERSION_STRING@" /* Version number of bsdcat */ -#cmakedefine BSDCAT_VERSION_STRING "${BSDCAT_VERSION_STRING}" +#cmakedefine BSDCAT_VERSION_STRING "@BSDCAT_VERSION_STRING@" + +/* Version number of bsdunzip */ +#cmakedefine BSDUNZIP_VERSION_STRING "@BSDUNZIP_VERSION_STRING@" /* Define to 1 if you have the `acl_create_entry' function. */ #cmakedefine HAVE_ACL_CREATE_ENTRY 1 @@ -366,7 +387,7 @@ typedef uint64_t uintmax_t; /* Define to 1 if you have the <attr/xattr.h> header file. */ #cmakedefine HAVE_ATTR_XATTR_H 1 -/* Define to 1 if you have the <Bcrypt.h> header file. */ +/* Define to 1 if you have the <bcrypt.h> header file. */ #cmakedefine HAVE_BCRYPT_H 1 /* Define to 1 if you have the <bsdxml.h> header file. */ @@ -570,6 +591,12 @@ typedef uint64_t uintmax_t; /* Define to 1 if you have the `flistxattr' function. */ #cmakedefine HAVE_FLISTXATTR 1 +/* Define to 1 if you have the `fnmatch' function. */ +#cmakedefine HAVE_FNMATCH 1 + +/* Define to 1 if you have the <fnmatch.h> header file. */ +#cmakedefine HAVE_FNMATCH_H 1 + /* Define to 1 if you have the `fork' function. */ #cmakedefine HAVE_FORK 1 @@ -618,6 +645,9 @@ typedef uint64_t uintmax_t; /* Define to 1 if you have the `getgrnam_r' function. */ #cmakedefine HAVE_GETGRNAM_R 1 +/* Define to 1 if you have the `getline' function. */ +#cmakedefine HAVE_GETLINE 1 + /* Define to 1 if you have the `getpid' function. */ #cmakedefine HAVE_GETPID 1 @@ -723,6 +753,12 @@ typedef uint64_t uintmax_t; /* Define to 1 if you have the `pcreposix' library (-lpcreposix). */ #cmakedefine HAVE_LIBPCREPOSIX 1 +/* Define to 1 if you have the `pcre2-8' library (-lpcre2-8). */ +#cmakedefine HAVE_LIBPCRE2 1 + +/* Define to 1 if you have the `pcreposix' library (-lpcre2posix). */ +#cmakedefine HAVE_LIBPCRE2POSIX 1 + /* Define to 1 if you have the `xml2' library (-lxml2). */ #cmakedefine HAVE_LIBXML2 1 @@ -738,9 +774,8 @@ typedef uint64_t uintmax_t; /* Define to 1 if you have the `zstd' library (-lzstd). */ #cmakedefine HAVE_LIBZSTD 1 -/* Define to 1 if you have the `zstd' library (-lzstd) with compression - support. */ -#cmakedefine HAVE_LIBZSTD_COMPRESSOR 1 +/* Define to 1 if you have the ZSTD_compressStream function. */ +#cmakedefine HAVE_ZSTD_compressStream 1 /* Define to 1 if you have the <limits.h> header file. */ #cmakedefine HAVE_LIMITS_H 1 @@ -827,6 +862,15 @@ typedef uint64_t uintmax_t; /* Define to 1 if you have the <lzo/lzoconf.h> header file. */ #cmakedefine HAVE_LZO_LZOCONF_H 1 +/* Define to 1 if you have the <mbedtls/aes.h> header file. */ +#cmakedefine HAVE_MBEDTLS_AES_H 1 + +/* Define to 1 if you have the <mbedtls/md.h> header file. */ +#cmakedefine HAVE_MBEDTLS_MD_H 1 + +/* Define to 1 if you have the <mbedtls/pkcs5.h> header file. */ +#cmakedefine HAVE_MBEDTLS_PKCS5_H 1 + /* Define to 1 if you have the `mbrtowc' function. */ #cmakedefine HAVE_MBRTOWC 1 @@ -878,12 +922,18 @@ typedef uint64_t uintmax_t; /* Define to 1 if you have the `openat' function. */ #cmakedefine HAVE_OPENAT 1 +/* Define to 1 if you have the <openssl/evp.h> header file. */ +#cmakedefine HAVE_OPENSSL_EVP_H 1 + /* Define to 1 if you have the <paths.h> header file. */ #cmakedefine HAVE_PATHS_H 1 /* Define to 1 if you have the <pcreposix.h> header file. */ #cmakedefine HAVE_PCREPOSIX_H 1 +/* Define to 1 if you have the <pcre2posix.h> header file. */ +#cmakedefine HAVE_PCRE2POSIX_H 1 + /* Define to 1 if you have the `pipe' function. */ #cmakedefine HAVE_PIPE 1 @@ -990,6 +1040,12 @@ typedef uint64_t uintmax_t; /* Define to 1 if you have the `strrchr' function. */ #cmakedefine HAVE_STRRCHR 1 +/* Define to 1 if the system has the type `struct statfs'. */ +#cmakedefine HAVE_STRUCT_STATFS 1 + +/* Define to 1 if `f_iosize' is a member of `struct statfs'. */ +#cmakedefine HAVE_STRUCT_STATFS_F_IOSIZE 1 + /* Define to 1 if `f_namemax' is a member of `struct statfs'. */ #cmakedefine HAVE_STRUCT_STATFS_F_NAMEMAX 1 @@ -1073,6 +1129,9 @@ typedef uint64_t uintmax_t; /* Define to 1 if you have the <sys/poll.h> header file. */ #cmakedefine HAVE_SYS_POLL_H 1 +/* Define to 1 if you have the <sys/queue.h> header file. */ +#cmakedefine HAVE_SYS_QUEUE_H 1 + /* Define to 1 if you have the <sys/richacl.h> header file. */ #cmakedefine HAVE_SYS_RICHACL_H 1 @@ -1212,8 +1271,8 @@ typedef uint64_t uintmax_t; /* Define to 1 if you have the <zstd.h> header file. */ #cmakedefine HAVE_ZSTD_H 1 -/* Define to 1 if you have the `_ctime64_s' function. */ -#cmakedefine HAVE__CTIME64_S 1 +/* Define to 1 if you have the `ctime_s' function. */ +#cmakedefine HAVE_CTIME_S 1 /* Define to 1 if you have the `_fseeki64' function. */ #cmakedefine HAVE__FSEEKI64 1 @@ -1221,23 +1280,23 @@ typedef uint64_t uintmax_t; /* Define to 1 if you have the `_get_timezone' function. */ #cmakedefine HAVE__GET_TIMEZONE 1 -/* Define to 1 if you have the `_gmtime64_s' function. */ -#cmakedefine HAVE__GMTIME64_S 1 +/* Define to 1 if you have the `gmtime_s' function. */ +#cmakedefine HAVE_GMTIME_S 1 -/* Define to 1 if you have the `_localtime64_s' function. */ -#cmakedefine HAVE__LOCALTIME64_S 1 +/* Define to 1 if you have the `localtime_s' function. */ +#cmakedefine HAVE_LOCALTIME_S 1 -/* Define to 1 if you have the `_mkgmtime64' function. */ -#cmakedefine HAVE__MKGMTIME64 1 +/* Define to 1 if you have the `_mkgmtime' function. */ +#cmakedefine HAVE__MKGMTIME 1 /* Define as const if the declaration of iconv() needs const. */ -#define ICONV_CONST ${ICONV_CONST} +#define ICONV_CONST @ICONV_CONST@ /* Version number of libarchive as a single integer */ -#cmakedefine LIBARCHIVE_VERSION_NUMBER "${LIBARCHIVE_VERSION_NUMBER}" +#cmakedefine LIBARCHIVE_VERSION_NUMBER "@LIBARCHIVE_VERSION_NUMBER@" /* Version number of libarchive */ -#cmakedefine LIBARCHIVE_VERSION_STRING "${LIBARCHIVE_VERSION_STRING}" +#cmakedefine LIBARCHIVE_VERSION_STRING "@LIBARCHIVE_VERSION_STRING@" /* Define to 1 if `lstat' dereferences a symlink specified with a trailing slash. */ @@ -1255,7 +1314,7 @@ typedef uint64_t uintmax_t; #cmakedefine NO_MINUS_C_MINUS_O 1 /* The size of `wchar_t', as computed by sizeof. */ -#cmakedefine SIZEOF_WCHAR_T ${SIZEOF_WCHAR_T} +#cmakedefine SIZEOF_WCHAR_T @SIZEOF_WCHAR_T@ /* Define to 1 if strerror_r returns char *. */ #cmakedefine STRERROR_R_CHAR_P 1 @@ -1291,59 +1350,59 @@ typedef uint64_t uintmax_t; #endif /* SAFE_TO_DEFINE_EXTENSIONS */ /* Version number of package */ -#cmakedefine VERSION "${VERSION}" +#cmakedefine VERSION "@VERSION@" /* Number of bits in a file offset, on hosts where this is settable. */ -#cmakedefine _FILE_OFFSET_BITS ${_FILE_OFFSET_BITS} +#cmakedefine _FILE_OFFSET_BITS @_FILE_OFFSET_BITS@ /* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ #cmakedefine _LARGEFILE_SOURCE 1 /* Define for large files, on AIX-style hosts. */ -#cmakedefine _LARGE_FILES ${_LARGE_FILES} +#cmakedefine _LARGE_FILES @_LARGE_FILES@ /* Define to control Windows SDK version */ #ifndef NTDDI_VERSION -#cmakedefine NTDDI_VERSION ${NTDDI_VERSION} +#cmakedefine NTDDI_VERSION @NTDDI_VERSION@ #endif // NTDDI_VERSION #ifndef _WIN32_WINNT -#cmakedefine _WIN32_WINNT ${_WIN32_WINNT} +#cmakedefine _WIN32_WINNT @_WIN32_WINNT@ #endif // _WIN32_WINNT #ifndef WINVER -#cmakedefine WINVER ${WINVER} +#cmakedefine WINVER @WINVER@ #endif // WINVER /* Define to empty if `const' does not conform to ANSI C. */ -#cmakedefine const ${const} +#cmakedefine const @const@ /* Define to `int' if <sys/types.h> doesn't define. */ -#cmakedefine gid_t ${gid_t} +#cmakedefine gid_t @gid_t@ /* Define to `unsigned long' if <sys/types.h> does not define. */ -#cmakedefine id_t ${id_t} +#cmakedefine id_t @id_t@ /* Define to `int' if <sys/types.h> does not define. */ -#cmakedefine mode_t ${mode_t} +#cmakedefine mode_t @mode_t@ /* Define to `long long' if <sys/types.h> does not define. */ -#cmakedefine off_t ${off_t} +#cmakedefine off_t @off_t@ /* Define to `int' if <sys/types.h> doesn't define. */ -#cmakedefine pid_t ${pid_t} +#cmakedefine pid_t @pid_t@ /* Define to `unsigned int' if <sys/types.h> does not define. */ -#cmakedefine size_t ${size_t} +#cmakedefine size_t @size_t@ /* Define to `int' if <sys/types.h> does not define. */ -#cmakedefine ssize_t ${ssize_t} +#cmakedefine ssize_t @ssize_t@ /* Define to `int' if <sys/types.h> doesn't define. */ -#cmakedefine uid_t ${uid_t} +#cmakedefine uid_t @uid_t@ /* Define to `int' if <sys/types.h> does not define. */ -#cmakedefine intptr_t ${intptr_t} +#cmakedefine intptr_t @intptr_t@ /* Define to `unsigned int' if <sys/types.h> does not define. */ -#cmakedefine uintptr_t ${uintptr_t} +#cmakedefine uintptr_t @uintptr_t@ diff --git a/build/pkgconfig/libarchive.pc.in b/build/pkgconfig/libarchive.pc.in index 4b631e635ccf..1f51e77f1679 100644 --- a/build/pkgconfig/libarchive.pc.in +++ b/build/pkgconfig/libarchive.pc.in @@ -10,3 +10,4 @@ Cflags: -I${includedir} Cflags.private: -DLIBARCHIVE_STATIC Libs: -L${libdir} -larchive Libs.private: @LIBS@ +Requires.private: @LIBSREQUIRED@ diff --git a/build/utils/gen_archive_string_composition_h.sh b/build/utils/gen_archive_string_composition_h.sh index 558e9c0c7cb5..93012fe68ff9 100755 --- a/build/utils/gen_archive_string_composition_h.sh +++ b/build/utils/gen_archive_string_composition_h.sh @@ -39,9 +39,6 @@ cat > ${outfile} <<CR_END * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * \$FreeBSD\$ - * */ /* diff --git a/build/version b/build/version index 49c9756b959e..fcdfc39dcee6 100644 --- a/build/version +++ b/build/version @@ -1 +1 @@ -3006001dev +3007003 diff --git a/cat/bsdcat.1 b/cat/bsdcat.1 index 036623e4e4d6..9fa66d60e1e6 100644 --- a/cat/bsdcat.1 +++ b/cat/bsdcat.1 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd March 1, 2014 .Dt BSDCAT 1 .Os diff --git a/cat/bsdcat.c b/cat/bsdcat.c index bdb9c40b9150..19d3de65cea4 100644 --- a/cat/bsdcat.c +++ b/cat/bsdcat.c @@ -24,7 +24,6 @@ */ #include "bsdcat_platform.h" -__FBSDID("$FreeBSD$"); #include <stdio.h> #ifdef HAVE_STDLIB_H @@ -37,6 +36,9 @@ __FBSDID("$FreeBSD$"); #include <string.h> #endif +#include <archive.h> +#include <archive_entry.h> + #include "bsdcat.h" #include "err.h" @@ -48,7 +50,7 @@ static const char *bsdcat_current_path; static int exit_status = 0; -void +static __LA_NORETURN void usage(FILE *stream, int eval) { const char *p; @@ -58,7 +60,7 @@ usage(FILE *stream, int eval) exit(eval); } -static void +static __LA_NORETURN void version(void) { printf("bsdcat %s - %s \n", @@ -67,7 +69,15 @@ version(void) exit(0); } -void +static void +bsdcat_print_error(void) +{ + lafe_warnc(0, "%s: %s", + bsdcat_current_path, archive_error_string(a)); + exit_status = 1; +} + +static void bsdcat_next(void) { if (a != NULL) { @@ -82,15 +92,7 @@ bsdcat_next(void) archive_read_support_format_raw(a); } -void -bsdcat_print_error(void) -{ - lafe_warnc(0, "%s: %s", - bsdcat_current_path, archive_error_string(a)); - exit_status = 1; -} - -void +static void bsdcat_read_to_stdout(const char* filename) { int r; @@ -130,12 +132,16 @@ main(int argc, char **argv) switch (c) { case 'h': usage(stdout, 0); - break; + /* NOTREACHED */ + /* Fallthrough */ case OPTION_VERSION: version(); - break; + /* NOTREACHED */ + /* Fallthrough */ default: usage(stderr, 1); + /* Fallthrough */ + /* NOTREACHED */ } } diff --git a/cat/bsdcat.h b/cat/bsdcat.h index 6467d6e3d310..504757a44040 100644 --- a/cat/bsdcat.h +++ b/cat/bsdcat.h @@ -34,9 +34,6 @@ #include "config.h" #endif -#include <archive.h> -#include <archive_entry.h> - struct bsdcat { /* Option parser state */ int getopt_state; @@ -53,9 +50,5 @@ enum { }; int bsdcat_getopt(struct bsdcat *); -void usage(FILE *stream, int eval); -void bsdcat_next(void); -void bsdcat_print_error(void); -void bsdcat_read_to_stdout(const char* filename); #endif diff --git a/cat/bsdcat_platform.h b/cat/bsdcat_platform.h index 10b711322c37..78a6113e6f01 100644 --- a/cat/bsdcat_platform.h +++ b/cat/bsdcat_platform.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/usr.bin/tar/bsdtar_platform.h,v 1.26 2008/12/06 07:37:14 kientzle Exp $ */ /* @@ -42,16 +40,6 @@ #include "config.h" #endif -/* Get a real definition for __FBSDID if we can */ -#if HAVE_SYS_CDEFS_H -#include <sys/cdefs.h> -#endif - -/* If not, define it so as to avoid dangling semicolons. */ -#ifndef __FBSDID -#define __FBSDID(a) struct _undefined_hack -#endif - #ifdef HAVE_LIBARCHIVE /* If we're using the platform libarchive, include system headers. */ #include <archive.h> @@ -64,12 +52,14 @@ /* How to mark functions that don't return. */ /* This facilitates use of some newer static code analysis tools. */ -#undef __LA_DEAD +#undef __LA_NORETURN #if defined(__GNUC__) && (__GNUC__ > 2 || \ - (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) -#define __LA_DEAD __attribute__((__noreturn__)) -#else -#define __LA_DEAD + (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) +#define __LA_NORETURN __attribute__((__noreturn__)) +#elif defined(_MSC_VER) +#define __LA_NORETURN __declspec(noreturn) +#else +#define __LA_NORETURN #endif #endif /* !BSDCAT_PLATFORM_H_INCLUDED */ diff --git a/cat/cmdline.c b/cat/cmdline.c index cae19beb7d4c..ea1e0eed6d0a 100644 --- a/cat/cmdline.c +++ b/cat/cmdline.c @@ -24,11 +24,10 @@ */ /* - * Command line parser for tar. + * Command line parser for bsdcat. */ #include "bsdcat_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include <errno.h> @@ -44,12 +43,12 @@ __FBSDID("$FreeBSD$"); #include "err.h" /* - * Short options for tar. Please keep this sorted. + * Short options for bsdcat. Please keep this sorted. */ static const char *short_options = "h"; /* - * Long options for tar. Please keep this list sorted. + * Long options for bsdcat. Please keep this list sorted. * * The symbolic names for options that lack a short equivalent are * defined in bsdcat.h. Also note that so far I've found no need @@ -61,7 +60,7 @@ static const struct bsdcat_option { const char *name; int required; /* 1 if this option requires an argument. */ int equivalent; /* Equivalent short option. */ -} tar_longopts[] = { +} bsdcat_longopts[] = { { "help", 0, 'h' }, { "version", 0, OPTION_VERSION }, { NULL, 0, 0 } @@ -90,7 +89,7 @@ static const struct bsdcat_option { * -W long options: There's an obscure GNU convention (only rarely * supported even there) that allows "-W option=argument" as an * alternative way to support long options. This was supported in - * early bsdcat as a way to access long options on platforms that did + * early bsdtar as a way to access long options on platforms that did * not support getopt_long() and is preserved here for backwards * compatibility. (Of course, if I'd started with a custom * command-line parser from the beginning, I would have had normal @@ -223,7 +222,7 @@ bsdcat_getopt(struct bsdcat *bsdcat) } /* Search the table for an unambiguous match. */ - for (popt = tar_longopts; popt->name != NULL; popt++) { + for (popt = bsdcat_longopts; popt->name != NULL; popt++) { /* Short-circuit if first chars don't match. */ if (popt->name[0] != bsdcat->getopt_word[0]) continue; diff --git a/cat/test/test.h b/cat/test/test.h index 350bcad63464..ec83d476b6b8 100644 --- a/cat/test/test.h +++ b/cat/test/test.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ /* Every test program should #include "test.h" as the first thing. */ diff --git a/configure.ac b/configure.ac index 2c9e1f957e11..503bb75ac9f8 100644 --- a/configure.ac +++ b/configure.ac @@ -4,15 +4,16 @@ 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.6.1dev]) -m4_define([LIBARCHIVE_VERSION_N],[3006001]) +m4_define([LIBARCHIVE_VERSION_S],[3.7.3]) +m4_define([LIBARCHIVE_VERSION_N],[3007003]) dnl bsdtar and bsdcpio versioning tracks libarchive m4_define([BSDTAR_VERSION_S],LIBARCHIVE_VERSION_S()) m4_define([BSDCPIO_VERSION_S],LIBARCHIVE_VERSION_S()) m4_define([BSDCAT_VERSION_S],LIBARCHIVE_VERSION_S()) +m4_define([BSDUNZIP_VERSION_S],LIBARCHIVE_VERSION_S()) -AC_PREREQ([2.69]) +AC_PREREQ([2.71]) # # Now starts the "real" configure script. @@ -59,6 +60,8 @@ AC_DEFINE([BSDTAR_VERSION_STRING],"BSDTAR_VERSION_S()", [Version number of bsdtar]) AC_DEFINE([BSDCAT_VERSION_STRING],"BSDTAR_VERSION_S()", [Version number of bsdcat]) +AC_DEFINE([BSDUNZIP_VERSION_STRING],"BSDUNZIP_VERSION_S()", + [Version number of bsdunzip]) # The shell variables here must be the same as the AC_SUBST() variables # below, but the shell variable names apparently cannot be the same as @@ -66,6 +69,7 @@ AC_DEFINE([BSDCAT_VERSION_STRING],"BSDTAR_VERSION_S()", BSDCPIO_VERSION_STRING=BSDCPIO_VERSION_S() BSDTAR_VERSION_STRING=BSDTAR_VERSION_S() BSDCAT_VERSION_STRING=BSDCAT_VERSION_S() +BSDUNZIP_VERSION_STRING=BSDUNZIP_VERSION_S() LIBARCHIVE_VERSION_STRING=LIBARCHIVE_VERSION_S() LIBARCHIVE_VERSION_NUMBER=LIBARCHIVE_VERSION_N() @@ -76,6 +80,7 @@ AC_SUBST(ARCHIVE_LIBTOOL_VERSION) AC_SUBST(BSDCPIO_VERSION_STRING) AC_SUBST(BSDTAR_VERSION_STRING) AC_SUBST(BSDCAT_VERSION_STRING) +AC_SUBST(BSDUNZIP_VERSION_STRING) AC_SUBST(LIBARCHIVE_VERSION_STRING) AC_SUBST(LIBARCHIVE_VERSION_NUMBER) @@ -99,13 +104,12 @@ AM_CONDITIONAL([INC_CYGWIN_FILES], [test $inc_cygwin_files = yes]) dnl Defines that are required for specific platforms (e.g. -D_POSIX_SOURCE, etc) PLATFORMCPPFLAGS= case "$host_os" in - *mingw* ) PLATFORMCPPFLAGS=-D__USE_MINGW_ANSI_STDIO ;; + *mingw* ) PLATFORMCPPFLAGS=-D__USE_MINGW_ANSI_STDIO -D__MINGW_USE_VC2005_COMPAT ;; esac AC_SUBST(PLATFORMCPPFLAGS) # Checks for programs. AC_PROG_CC -AC_PROG_CC_C99 AM_PROG_CC_C_O AC_PROG_CPP AC_USE_SYSTEM_EXTENSIONS @@ -268,12 +272,64 @@ case $host in ;; esac +# +# Options for building bsdunzip. +# +# Default is to build bsdunzip, but allow people to override that. +# Bsdunzip has not yet been ported for Windows +# +case "$host_os" in + *mingw* | *msys*) + enable_bsdunzip=no + ;; + *) + AC_ARG_ENABLE([bsdunzip], + [AS_HELP_STRING([--enable-bsdunzip], [enable build of bsdunzip (default)]) + AS_HELP_STRING([--enable-bsdunzip=static], [force static build of bsdunzip]) + AS_HELP_STRING([--enable-bsdunzip=shared], [force dynamic build of bsdunzip]) + AS_HELP_STRING([--disable-bsdunzip], [disable build of bsdunzip])], + [], [enable_bsdunzip=yes]) + ;; +esac + +case "$enable_bsdunzip" in +yes) + if test "$enable_static" = "no"; then + static_bsdunzip=no + else + static_bsdunzip=yes + fi + build_bsdunzip=yes + ;; +dynamic|shared) + if test "$enable_shared" = "no"; then + AC_MSG_FAILURE([Shared linking of bsdunzip requires shared libarchive]) + fi + build_bsdunzip=yes + static_bsdunzip=no + ;; +static) + build_bsdunzip=yes + static_bsdunzip=yes + ;; +no) + build_bsdunzip=no + static_bsdunzip=no + ;; +*) + AC_MSG_FAILURE([Unsupported value for --enable-bsdunzip]) + ;; +esac + +AM_CONDITIONAL([BUILD_BSDUNZIP], [ test "$build_bsdunzip" = yes ]) +AM_CONDITIONAL([STATIC_BSDUNZIP], [ test "$static_bsdunzip" = yes ]) + # Checks for header files. AC_HEADER_DIRENT AC_HEADER_SYS_WAIT AC_CHECK_HEADERS([acl/libacl.h attr/xattr.h]) AC_CHECK_HEADERS([copyfile.h ctype.h]) -AC_CHECK_HEADERS([errno.h ext2fs/ext2_fs.h fcntl.h grp.h]) +AC_CHECK_HEADERS([errno.h ext2fs/ext2_fs.h fcntl.h fnmatch.h grp.h]) AC_CACHE_CHECK([whether EXT2_IOC_GETFLAGS is usable], [ac_cv_have_decl_EXT2_IOC_GETFLAGS], @@ -306,7 +362,7 @@ AC_CHECK_HEADERS([locale.h membership.h paths.h poll.h pthread.h pwd.h]) AC_CHECK_HEADERS([readpassphrase.h signal.h spawn.h]) AC_CHECK_HEADERS([stdarg.h stdint.h stdlib.h string.h]) AC_CHECK_HEADERS([sys/acl.h sys/cdefs.h sys/ea.h sys/extattr.h]) -AC_CHECK_HEADERS([sys/ioctl.h sys/mkdev.h sys/mount.h]) +AC_CHECK_HEADERS([sys/ioctl.h sys/mkdev.h sys/mount.h sys/queue.h]) AC_CHECK_HEADERS([sys/param.h sys/poll.h sys/richacl.h]) AC_CHECK_HEADERS([sys/select.h sys/statfs.h sys/statvfs.h sys/sysmacros.h]) AC_CHECK_HEADERS([sys/time.h sys/utime.h sys/utsname.h sys/vfs.h sys/xattr.h]) @@ -378,6 +434,9 @@ if test "x$with_iconv" != "xno"; then AC_CHECK_HEADERS([localcharset.h]) am_save_LIBS="$LIBS" LIBS="${LIBS} ${LIBICONV}" + if test -n "$LIBICONV"; then + LIBSREQUIRED="$LIBSREQUIRED${LIBSREQUIRED:+ }iconv" + fi AC_CHECK_FUNCS([locale_charset]) LIBS="${am_save_LIBS}" if test "x$ac_cv_func_locale_charset" != "xyes"; then @@ -402,7 +461,7 @@ if test "x$with_zstd" != "xno"; then AC_CHECK_HEADERS([zstd.h]) AC_CHECK_LIB(zstd,ZSTD_decompressStream) AC_CHECK_LIB(zstd,ZSTD_compressStream, - AC_DEFINE([HAVE_LIBZSTD_COMPRESSOR], [1], [Define to 1 if you have the `zstd' library (-lzstd) with compression support.])) + AC_DEFINE([HAVE_ZSTD_compressStream], [1], [Define to 1 if you have the `zstd' library (-lzstd) with compression support.])) fi AC_ARG_WITH([lzma], @@ -423,11 +482,24 @@ if test "x$with_lzma" != "xno"; then [#if LZMA_VERSION < 50020000] [#error unsupported] [#endif]], - [[lzma_stream_encoder_mt(0, 0);]])], + [[int ignored __attribute__((unused)); ignored = lzma_stream_encoder_mt(0, 0);]])], [ac_cv_lzma_has_mt=yes], [ac_cv_lzma_has_mt=no])]) if test "x$ac_cv_lzma_has_mt" != xno; then AC_DEFINE([HAVE_LZMA_STREAM_ENCODER_MT], [1], [Define to 1 if you have the `lzma_stream_encoder_mt' function.]) fi + + AC_CACHE_CHECK( + [whether we have ARM64 filter support in lzma], + ac_cv_lzma_has_arm64, + [AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[#include <lzma.h>] + [#ifndef LZMA_FILTER_ARM64] + [#error unsupported] + [#endif]])], + [ac_cv_lzma_has_arm64=yes], [ac_cv_lzma_has_arm64=no])]) + if test "x$ac_cv_lzma_has_arm64" != xno; then + AC_DEFINE([HAVE_LZMA_FILTER_ARM64], [1], [Define to 1 if you have the `LZMA_FILTER_ARM64' macro.]) + fi fi AC_ARG_WITH([lzo2], @@ -480,6 +552,7 @@ AC_ARG_ENABLE([posix-regex-lib], AS_HELP_STRING([--enable-posix-regex-lib=libc], [use libc POSIX regular expression support]) AS_HELP_STRING([--enable-posix-regex-lib=libregex], [use libregex POSIX regular expression support]) AS_HELP_STRING([--enable-posix-regex-lib=libpcreposix], [use libpcreposix POSIX regular expression support]) + AS_HELP_STRING([--enable-posix-regex-lib=libpcre2posix], [use libpcre2-posix POSIX regular expression support]) AS_HELP_STRING([--disable-posix-regex-lib], [don't enable POSIX regular expression support])], [], [enable_posix_regex_lib=auto]) @@ -531,6 +604,39 @@ if test -z $posix_regex_lib_found && (test "$enable_posix_regex_lib" = "auto" || posix_regex_lib_found=1 fi fi +if test -z $posix_regex_lib_found && (test "$enable_posix_regex_lib" = "auto" || test "$enable_posix_regex_lib" = "libpcre2posix"); then + AC_CHECK_HEADERS([pcre2posix.h]) + AC_CHECK_LIB(pcre2-posix,regcomp) + if test "x$ac_cv_lib_pcre2posix_regcomp" != xyes; then + AC_MSG_NOTICE(trying libpcre2posix check again with libpcre2-8) + unset ac_cv_lib_pcre2posix_regcomp + AC_CHECK_LIB(pcre2,pcre2_regexec) + AC_CHECK_LIB(pcre2-posix,pcre2_regcomp) + if test "x$ac_cv_lib_pcre2_pcre_exec" = xyes && test "x$ac_cv_lib_pcre2posix_regcomp" = xyes; then + AC_MSG_CHECKING(if PCRE2_STATIC needs to be defined) + AC_LINK_IFELSE( + [AC_LANG_SOURCE(#include <pcre2posix.h> + int main() { return pcre2_regcomp(NULL, NULL, 0); })], + [without_pcre2_static=yes], + [without_pcre2_static=no]) + AC_LINK_IFELSE( + [AC_LANG_SOURCE(#define PCRE2_STATIC + #include <pcre2posix.h> + int main() { return pcre2_regcomp(NULL, NULL, 0); })], + [with_pcre2_static=yes], + [with_pcre2_static=no]) + if test "x$without_pcre2_static" != xyes && test "x$with_pcre2_static" = xyes; then + AC_MSG_RESULT(yes) + AC_DEFINE([PCRE2_STATIC], [1], [Define to 1 if PCRE2_STATIC needs to be defined.]) + elif test "x$without_pcre2_static" = xyes || test "x$with_pcre2_static" = xyes; then + AC_MSG_RESULT(no) + fi + posix_regex_lib_found=1 + fi + else + posix_regex_lib_found=1 + fi +fi # TODO: Give the user the option of using a pre-existing system # libarchive. This will define HAVE_LIBARCHIVE which will cause @@ -542,21 +648,35 @@ fi # Checks for supported compiler flags AX_APPEND_COMPILE_FLAGS([-Wall -Wformat -Wformat-security]) -# Place the functions and data into separate sections, allowing the linker -# to garbage collect the unused ones. +# Place the functions and data into separate sections, allowing GNU style +# linkers to garbage collect the unused ones. save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,--gc-sections" AC_MSG_CHECKING([whether ld supports --gc-sections]) AC_LINK_IFELSE( [AC_LANG_SOURCE([static char UnusedFunc() { return 5; } int main() { return 0;}])], [AC_MSG_RESULT([yes]) - GC_SECTIONS="-Wl,--gc-sections"; + DEAD_CODE_REMOVAL="-Wl,--gc-sections"; AX_APPEND_COMPILE_FLAGS([-ffunction-sections -fdata-sections])], [AC_MSG_RESULT([no]) - GC_SECTIONS="";]) + DEAD_CODE_REMOVAL="";]) LDFLAGS=$save_LDFLAGS -AC_SUBST(GC_SECTIONS) +if test "$DEAD_CODE_REMOVAL" == ""; then + # Macos linkers have a -dead_strip flag, which is similar to --gc-sections. + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,-dead_strip" + AC_MSG_CHECKING([whether ld supports -dead_strip]) + AC_LINK_IFELSE( + [AC_LANG_SOURCE([static char UnusedFunc() { return 5; } int main() { return 0;}])], + [AC_MSG_RESULT([yes]) + DEAD_CODE_REMOVAL="-Wl,-dead_strip";], + [AC_MSG_RESULT([no]) + DEAD_CODE_REMOVAL="";]) + LDFLAGS=$save_LDFLAGS +fi + +AC_SUBST(DEAD_CODE_REMOVAL) # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST @@ -654,7 +774,7 @@ AC_CHECK_TYPE([wchar_t], AX_COMPILE_CHECK_SIZEOF(int) AX_COMPILE_CHECK_SIZEOF(long) -AC_HEADER_TIME +AC_CHECK_HEADERS_ONCE([sys/time.h]) # Checks for library functions. AC_PROG_GCC_TRADITIONAL @@ -672,10 +792,10 @@ AC_FUNC_VPRINTF # workarounds, we use 'void *' for 'struct SECURITY_ATTRIBUTES *' AC_CHECK_STDCALL_FUNC([CreateHardLinkA],[const char *, const char *, void *]) AC_CHECK_FUNCS([arc4random_buf chflags chown chroot ctime_r]) -AC_CHECK_FUNCS([fchdir fchflags fchmod fchown fcntl fdopendir fork]) +AC_CHECK_FUNCS([fchdir fchflags fchmod fchown fcntl fdopendir fnmatch fork]) AC_CHECK_FUNCS([fstat fstatat fstatfs fstatvfs ftruncate]) AC_CHECK_FUNCS([futimens futimes futimesat]) -AC_CHECK_FUNCS([geteuid getpid getgrgid_r getgrnam_r]) +AC_CHECK_FUNCS([geteuid getline getpid getgrgid_r getgrnam_r]) AC_CHECK_FUNCS([getpwnam_r getpwuid_r getvfsbyname gmtime_r]) AC_CHECK_FUNCS([lchflags lchmod lchown link linkat localtime_r lstat lutimes]) AC_CHECK_FUNCS([mbrtowc memmove memset]) @@ -686,8 +806,24 @@ AC_CHECK_FUNCS([select setenv setlocale sigaction statfs statvfs]) 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]) +AC_CHECK_FUNCS([_fseeki64 _get_timezone]) +AC_CHECK_DECL([cmtime_s], + [AC_DEFINE(HAVE_CMTIME_S, 1, [cmtime_s function])], + [], + [#include <time.h>]) +AC_CHECK_DECL([gmtime_s], + [AC_DEFINE(HAVE_GMTIME_S, 1, [gmtime_s function])], + [], + [#include <time.h>]) +AC_CHECK_TYPE([localtime_s], + [AC_DEFINE(HAVE_LOCALTIME_S, 1, [localtime_s function])], + [], + [#include <time.h>]) +AC_CHECK_DECL([_mkgmtime], + [AC_DEFINE(HAVE__MKGMTIME, 1, [_mkgmtime function])], + [], + [#include <time.h>]) + # detects cygwin-1.7, as opposed to older versions AC_CHECK_FUNCS([cygwin_conv_path]) @@ -1209,24 +1345,8 @@ fi if test "x$with_openssl" != "xno"; then AC_CHECK_HEADERS([openssl/evp.h]) saved_LIBS=$LIBS - case "$host_os" in - *mingw* | *cygwin* | *msys*) - case "$host_cpu" in - x86_64) - AC_CHECK_LIB(eay64,OPENSSL_config) - if test "x$ac_cv_lib_eay64_main" != "xyes"; then - AC_CHECK_LIB(eay32,OPENSSL_config) - fi - ;; - *) - AC_CHECK_LIB(eay32,OPENSSL_config) - ;; - esac - ;; - *) - AC_CHECK_LIB(crypto,OPENSSL_config) - ;; - esac + LIBSREQUIRED="$LIBSREQUIRED${LIBSREQUIRED:+ }libcrypto" + AC_CHECK_LIB(crypto,OPENSSL_config) CRYPTO_CHECK(MD5, OPENSSL, md5) CRYPTO_CHECK(RMD160, OPENSSL, rmd160) CRYPTO_CHECK(SHA1, OPENSSL, sha1) @@ -1236,6 +1356,8 @@ if test "x$with_openssl" != "xno"; then AC_CHECK_FUNCS([PKCS5_PBKDF2_HMAC_SHA1]) fi +AC_SUBST(LIBSREQUIRED) + # Probe libmd AFTER OpenSSL/libcrypto. # The two are incompatible and OpenSSL is more complete. AC_CHECK_HEADERS([md5.h ripemd.h sha.h sha256.h sha512.h]) @@ -1260,6 +1382,18 @@ case "$host_os" in ;; esac +dnl Visibility annotations... +saved_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -fvisibility=hidden -Werror" +AC_MSG_CHECKING(whether compiler supports visibility annotations) +AC_LINK_IFELSE([AC_LANG_PROGRAM([ + int foo( void ) __attribute__((visibility("default"))); + ])], + [CFLAGS="$saved_CFLAGS -fvisibility=hidden -D__LIBARCHIVE_ENABLE_VISIBILITY"; + AC_MSG_RESULT(yes)], + [CFLAGS="$saved_CFLAGS" + AC_MSG_RESULT(no)]) + # Ensure test directories are present if building out-of-tree AC_CONFIG_COMMANDS([mkdirs], [mkdir -p libarchive/test tar/test cat/test cpio/test]) diff --git a/contrib/android/config/android.h b/contrib/android/config/android.h index 8e18312449ed..0ccb20c4e8c4 100644 --- a/contrib/android/config/android.h +++ b/contrib/android/config/android.h @@ -180,5 +180,5 @@ #define SIZEOF_WCHAR_T 4 #define STDC_HEADERS 1 #define STRERROR_R_CHAR_P 1 -#define TIME_WITH_SYS_TIME 1 +#define HAVE_SYS_TIME_H 1 #endif diff --git a/contrib/android/config/linux_host.h b/contrib/android/config/linux_host.h index 709b657c9da7..371c6cc480ad 100644 --- a/contrib/android/config/linux_host.h +++ b/contrib/android/config/linux_host.h @@ -183,7 +183,7 @@ #define SIZEOF_WCHAR_T 4 #define STDC_HEADERS 1 #define STRERROR_R_CHAR_P 1 -#define TIME_WITH_SYS_TIME 1 +#define HAVE_SYS_TIME_H 1 #define _GNU_SOURCE 1 #endif diff --git a/contrib/android/config/windows_host.h b/contrib/android/config/windows_host.h index 2d899d1e75c6..5210a4db5c7f 100644 --- a/contrib/android/config/windows_host.h +++ b/contrib/android/config/windows_host.h @@ -160,7 +160,7 @@ /* Define to 1 if you have the <attr/xattr.h> header file. */ /* #undef HAVE_ATTR_XATTR_H */ -/* Define to 1 if you have the <Bcrypt.h> header file. */ +/* Define to 1 if you have the <bcrypt.h> header file. */ #define HAVE_BCRYPT_H /* Define to 1 if you have the <bzlib.h> header file. */ @@ -442,6 +442,12 @@ /* Define to 1 if you have the `pcreposix' library (-lpcreposix). */ /* #undef HAVE_LIBPCREPOSIX */ +/* Define to 1 if you have the `pcre2-8' library (-lpcre2-8). */ +/* #undef HAVE_LIBPCRE2 */ + +/* Define to 1 if you have the `pcre2-posix' library (-lpcre2-posix). */ +/* #undef HAVE_LIBPCRE2POSIX */ + /* Define to 1 if you have the `regex' library (-lregex). */ /* #undef HAVE_LIBREGEX */ @@ -593,6 +599,9 @@ /* Define to 1 if you have the <pcreposix.h> header file. */ /* #undef HAVE_PCREPOSIX_H */ +/* Define to 1 if you have the <pcre2posix.h> header file. */ +/* #undef HAVE_PCRE2POSIX_H */ + /* Define to 1 if you have the `pipe' function. */ /* #undef HAVE_PIPE */ @@ -905,8 +914,8 @@ /* Define to 1 if you have the <zlib.h> header file. */ /* #undef HAVE_ZLIB_H */ -/* Define to 1 if you have the `_ctime64_s' function. */ -#define HAVE__CTIME64_S 1 +/* Define to 1 if you have the `ctime_s' function. */ +#define HAVE_CTIME_S 1 /* Define to 1 if you have the `_fseeki64' function. */ #define HAVE__FSEEKI64 1 @@ -914,11 +923,11 @@ /* Define to 1 if you have the `_get_timezone' function. */ /* #undef HAVE__GET_TIMEZONE */ -/* Define to 1 if you have the `_localtime64_s' function. */ -#define HAVE__LOCALTIME64_S 1 +/* Define to 1 if you have the `localtime_s' function. */ +#define HAVE_LOCALTIME_S 1 -/* Define to 1 if you have the `_mkgmtime64' function. */ -/* #define HAVE__MKGMTIME64 1 */ +/* Define to 1 if you have the `_mkgmtime' function. */ +/* #define HAVE__MKGMTIME 1 */ /* Define as const if the declaration of iconv() needs const. */ /* #undef ICONV_CONST */ @@ -952,7 +961,7 @@ /* #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 +#define HAVE_SYS_TIME_H 1 diff --git a/contrib/archivetest.c b/contrib/archivetest.c index e4a25e3c911d..794221fbb524 100644 --- a/contrib/archivetest.c +++ b/contrib/archivetest.c @@ -83,6 +83,7 @@ static void printhelp() " -f filename Filename to verify\n" " -h Show this help\n" " -q Quiet mode\n" + " -r Enforce raw archive format\n" " -s Verify only headers (skip data)\n\n" "If no filename is specified, data is read from standard input.\n" "\n%s\n", archive_version_details()); @@ -110,15 +111,17 @@ int main(int argc, char *argv[]) const char *p; char buffer[4096]; int c; - int v, skip_data; + int v, skip_data, raw; int r = ARCHIVE_OK; int format_printed; + mode_t mode; filename = NULL; skip_data = 0; + raw = 0; v = 1; - while ((c = getopt (argc, argv, "f:hqs")) != -1) { + while ((c = getopt (argc, argv, "f:hrqs")) != -1) { switch (c) { case 'f': filename = optarg; @@ -129,6 +132,9 @@ int main(int argc, char *argv[]) case 'q': v = 0; break; + case 'r': + raw = 1; + break; case 's': skip_data = 1; break; @@ -153,7 +159,10 @@ int main(int argc, char *argv[]) a = archive_read_new(); archive_read_support_filter_all(a); - archive_read_support_format_all(a); + if (raw) + archive_read_support_format_raw(a); + else + archive_read_support_format_all(a); v_print(v, "Data source: "); @@ -191,16 +200,18 @@ int main(int argc, char *argv[]) if (r == ARCHIVE_EOF) break; p = archive_entry_pathname(entry); + mode = archive_entry_mode(entry); v_print(v, "Entry %d: %s, pathname", c, errnostr(r)); if (p == NULL || p[0] == '\0') v_print(v, " unreadable"); else v_print(v, ": %s", p); + v_print(v, ", mode: %o", mode); v_print(v, ", data: "); if (skip_data) { v_print(v, "skipping"); } else { - while ((r = archive_read_data(a, buffer, 4096) > 0)) + while ((r = archive_read_data(a, buffer, 4096)) > 0) ; if (r == ARCHIVE_FATAL) { v_print(v, "ERROR\nError string: %s\n", diff --git a/contrib/shar/Makefile b/contrib/shar/Makefile index 3bd94d4192cb..2e344fe0dc86 100644 --- a/contrib/shar/Makefile +++ b/contrib/shar/Makefile @@ -1,5 +1,3 @@ -# $FreeBSD$ - PROG= shar SRCS= shar.c tree.c diff --git a/contrib/shar/shar.1 b/contrib/shar/shar.1 index 31561978f05c..a50efead99c8 100644 --- a/contrib/shar/shar.1 +++ b/contrib/shar/shar.1 @@ -30,7 +30,6 @@ .\" SUCH DAMAGE. .\" .\" @(#)shar.1 8.1 (Berkeley) 6/6/93 -.\" $FreeBSD$ .\" .Dd April 17, 2008 .Dt SHAR 1 diff --git a/contrib/shar/shar.c b/contrib/shar/shar.c index 63161fc9ea94..1648ab0d2d05 100644 --- a/contrib/shar/shar.c +++ b/contrib/shar/shar.c @@ -24,11 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include <sys/cdefs.h> -#ifdef __FBSDID -__FBSDID("$FreeBSD$"); -#endif - #include <sys/stat.h> #include <sys/types.h> diff --git a/contrib/shar/tree.c b/contrib/shar/tree.c index a80d8366bdeb..666224c331d2 100644 --- a/contrib/shar/tree.c +++ b/contrib/shar/tree.c @@ -43,7 +43,6 @@ * regular dir or via fchdir(2) for a symlink). */ #include "tree_config.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> diff --git a/contrib/shar/tree.h b/contrib/shar/tree.h index ff38f5346c1c..82e974507b4b 100644 --- a/contrib/shar/tree.h +++ b/contrib/shar/tree.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ /*- diff --git a/contrib/shar/tree_config.h b/contrib/shar/tree_config.h index 8dfd90baf685..6af27dcfbf64 100644 --- a/contrib/shar/tree_config.h +++ b/contrib/shar/tree_config.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #ifndef TREE_CONFIG_H_INCLUDED #define TREE_CONFIG_H_INCLUDED @@ -57,14 +55,6 @@ #error Oops: No config.h and no built-in configuration in bsdtar_platform.h. #endif /* !HAVE_CONFIG_H */ -/* No non-FreeBSD platform will have __FBSDID, so just define it here. */ -#ifdef __FreeBSD__ -#include <sys/cdefs.h> /* For __FBSDID */ -#else -/* Just leaving this macro replacement empty leads to a dangling semicolon. */ -#define __FBSDID(a) struct _undefined_hack -#endif - #ifdef HAVE_LIBARCHIVE /* If we're using the platform libarchive, include system headers. */ #include <archive.h> diff --git a/contrib/untar.c b/contrib/untar.c index 2550e510a5a1..6d5e88e2f097 100644 --- a/contrib/untar.c +++ b/contrib/untar.c @@ -40,11 +40,25 @@ #include <windows.h> #endif -/* Parse an octal number, ignoring leading and trailing nonsense. */ +#define BLOCKSIZE 512 + +/* System call to create a directory. */ static int +system_mkdir(char *pathname, int mode) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + (void)mode; /* UNUSED */ + return _mkdir(pathname); +#else + return mkdir(pathname, mode); +#endif +} + +/* Parse an octal number, ignoring leading and trailing nonsense. */ +static unsigned long parseoct(const char *p, size_t n) { - int i = 0; + unsigned long i = 0; while ((*p < '0' || *p > '7') && n > 0) { ++p; @@ -64,7 +78,7 @@ static int is_end_of_archive(const char *p) { int n; - for (n = 511; n >= 0; --n) + for (n = 0; n < BLOCKSIZE; ++n) if (p[n] != '\0') return (0); return (1); @@ -82,12 +96,7 @@ create_dir(char *pathname, int mode) pathname[strlen(pathname) - 1] = '\0'; /* Try creating the directory. */ -#if defined(_WIN32) && !defined(__CYGWIN__) - r = _mkdir(pathname); -#else - r = mkdir(pathname, mode); -#endif - + r = system_mkdir(pathname, mode); if (r != 0) { /* On failure, try creating parent directory. */ p = strrchr(pathname, '/'); @@ -95,11 +104,7 @@ create_dir(char *pathname, int mode) *p = '\0'; create_dir(pathname, 0755); *p = '/'; -#if defined(_WIN32) && !defined(__CYGWIN__) - r = _mkdir(pathname); -#else - r = mkdir(pathname, mode); -#endif + r = system_mkdir(pathname, mode); } } if (r != 0) @@ -130,7 +135,7 @@ static int verify_checksum(const char *p) { int n, u = 0; - for (n = 0; n < 512; ++n) { + for (n = 0; n < BLOCKSIZE; ++n) { if (n < 148 || n > 155) /* Standard tar checksum adds unsigned bytes. */ u += ((unsigned char *)p)[n]; @@ -138,25 +143,25 @@ verify_checksum(const char *p) u += 0x20; } - return (u == parseoct(p + 148, 8)); + return (u == (int)parseoct(p + 148, 8)); } /* Extract a tar archive. */ static void untar(FILE *a, const char *path) { - char buff[512]; + char buff[BLOCKSIZE]; FILE *f = NULL; size_t bytes_read; - int filesize; + unsigned long filesize; printf("Extracting from %s\n", path); for (;;) { - bytes_read = fread(buff, 1, 512, a); - if (bytes_read < 512) { + bytes_read = fread(buff, 1, BLOCKSIZE, a); + if (bytes_read < BLOCKSIZE) { fprintf(stderr, - "Short read on %s: expected 512, got %d\n", - path, (int)bytes_read); + "Short read on %s: expected %d, got %d\n", + path, BLOCKSIZE, (int)bytes_read); return; } if (is_end_of_archive(buff)) { @@ -183,7 +188,7 @@ untar(FILE *a, const char *path) break; case '5': printf(" Extracting dir %s\n", buff); - create_dir(buff, parseoct(buff + 100, 8)); + create_dir(buff, (int)parseoct(buff + 100, 8)); filesize = 0; break; case '6': @@ -191,19 +196,19 @@ untar(FILE *a, const char *path) break; default: printf(" Extracting file %s\n", buff); - f = create_file(buff, parseoct(buff + 100, 8)); + f = create_file(buff, (int)parseoct(buff + 100, 8)); break; } while (filesize > 0) { - bytes_read = fread(buff, 1, 512, a); - if (bytes_read < 512) { + bytes_read = fread(buff, 1, BLOCKSIZE, a); + if (bytes_read < BLOCKSIZE) { fprintf(stderr, - "Short read on %s: Expected 512, got %d\n", - path, (int)bytes_read); + "Short read on %s: Expected %d, got %d\n", + path, BLOCKSIZE, (int)bytes_read); return; } - if (filesize < 512) - bytes_read = filesize; + if (filesize < BLOCKSIZE) + bytes_read = (size_t)filesize; if (f != NULL) { if (fwrite(buff, 1, bytes_read, f) != bytes_read) diff --git a/cpio/bsdcpio.1 b/cpio/bsdcpio.1 index 01b508e122f8..c52764a8c4f7 100644 --- a/cpio/bsdcpio.1 +++ b/cpio/bsdcpio.1 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd September 16, 2014 .Dt CPIO 1 .Os diff --git a/cpio/cmdline.c b/cpio/cmdline.c index 2683524e4ed0..312d762c8f46 100644 --- a/cpio/cmdline.c +++ b/cpio/cmdline.c @@ -26,7 +26,6 @@ #include "cpio_platform.h" -__FBSDID("$FreeBSD: src/usr.bin/cpio/cmdline.c,v 1.5 2008/12/06 07:30:40 kientzle Exp $"); #ifdef HAVE_ERRNO_H #include <errno.h> diff --git a/cpio/config_freebsd.h b/cpio/config_freebsd.h index 00c4c737f737..1cba09653cb5 100644 --- a/cpio/config_freebsd.h +++ b/cpio/config_freebsd.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/usr.bin/cpio/config_freebsd.h,v 1.3 2008/12/06 07:30:40 kientzle Exp $ */ /* A hand-tooled configuration for FreeBSD. */ diff --git a/cpio/cpio.c b/cpio/cpio.c index 68a6301a8789..c9af535f6d0a 100644 --- a/cpio/cpio.c +++ b/cpio/cpio.c @@ -26,7 +26,6 @@ #include "cpio_platform.h" -__FBSDID("$FreeBSD: src/usr.bin/cpio/cpio.c,v 1.15 2008/12/06 07:30:40 kientzle Exp $"); #include <sys/types.h> #include <archive.h> @@ -108,22 +107,22 @@ static int entry_to_archive(struct cpio *, struct archive_entry *); static int file_to_archive(struct cpio *, const char *); static void free_cache(struct name_cache *cache); static void list_item_verbose(struct cpio *, struct archive_entry *); -static void long_help(void) __LA_DEAD; +static __LA_NORETURN void long_help(void); static const char *lookup_gname(struct cpio *, gid_t gid); static int lookup_gname_helper(struct cpio *, const char **name, id_t gid); static const char *lookup_uname(struct cpio *, uid_t uid); static int lookup_uname_helper(struct cpio *, const char **name, id_t uid); -static void mode_in(struct cpio *) __LA_DEAD; -static void mode_list(struct cpio *) __LA_DEAD; +static __LA_NORETURN void mode_in(struct cpio *); +static __LA_NORETURN void mode_list(struct cpio *); static void mode_out(struct cpio *); static void mode_pass(struct cpio *, const char *); static const char *remove_leading_slash(const char *); static int restore_time(struct cpio *, struct archive_entry *, const char *, int fd); -static void usage(void) __LA_DEAD; -static void version(void) __LA_DEAD; +static __LA_NORETURN void usage(void); +static __LA_NORETURN void version(void); static const char * passphrase_callback(struct archive *, void *); static void passphrase_free(char *); @@ -251,7 +250,7 @@ main(int argc, char *argv[]) break; case 'h': long_help(); - break; + /* NOTREACHED */ case 'I': /* NetBSD/OpenBSD */ cpio->filename = cpio->argument; break; @@ -358,7 +357,7 @@ main(int argc, char *argv[]) break; case OPTION_VERSION: /* GNU convention */ version(); - break; + /* NOTREACHED */ #if 0 /* * cpio_getopt() handles -W specially, so it's not @@ -427,7 +426,7 @@ main(int argc, char *argv[]) mode_list(cpio); else mode_in(cpio); - break; + /* NOTREACHED */ case 'p': if (*cpio->argv == NULL || **cpio->argv == '\0') lafe_errc(1, 0, @@ -442,6 +441,8 @@ main(int argc, char *argv[]) archive_match_free(cpio->matching); free_cache(cpio->gname_cache); free_cache(cpio->uname_cache); + archive_read_close(cpio->archive_read_disk); + archive_read_free(cpio->archive_read_disk); free(cpio->destdir); passphrase_free(cpio->ppbuff); return (cpio->return_value); @@ -1144,20 +1145,16 @@ list_item_verbose(struct cpio *cpio, struct archive_entry *entry) { char size[32]; char date[32]; - char uids[16], gids[16]; + char uids[22], gids[22]; const char *uname, *gname; FILE *out = stdout; const char *fmt; time_t mtime; static time_t now; 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 (!now) time(&now); @@ -1205,19 +1202,17 @@ list_item_verbose(struct cpio *cpio, struct archive_entry *entry) else fmt = cpio->day_first ? "%e %b %H:%M" : "%b %e %H:%M"; #endif -#if defined(HAVE_LOCALTIME_R) +#if defined(HAVE_LOCALTIME_S) + ltime = localtime_s(&tmbuf, &mtime) ? NULL : &tmbuf; +#elif defined(HAVE_LOCALTIME_R) ltime = localtime_r(&mtime, &tmbuf); -#elif defined(HAVE__LOCALTIME64_S) - tmptime = mtime; - terr = _localtime64_s(&tmbuf, &tmptime); - if (terr) - ltime = NULL; - else - ltime = &tmbuf; #else ltime = localtime(&mtime); #endif - strftime(date, sizeof(date), fmt, ltime); + if (ltime != NULL) + strftime(date, sizeof(date), fmt, ltime); + else + strcpy(date, "invalid mtime"); fprintf(out, "%s%3d %-8s %-8s %8s %12s %s", archive_entry_strmode(entry), diff --git a/cpio/cpio.h b/cpio/cpio.h index a71b6649d35f..3e97c0900b73 100644 --- a/cpio/cpio.h +++ b/cpio/cpio.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/usr.bin/cpio/cpio.h,v 1.7 2008/12/06 07:30:40 kientzle Exp $ */ #ifndef CPIO_H_INCLUDED diff --git a/cpio/cpio_platform.h b/cpio/cpio_platform.h index 58d2edbcd7a4..263404b40dab 100644 --- a/cpio/cpio_platform.h +++ b/cpio/cpio_platform.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/usr.bin/cpio/cpio_platform.h,v 1.2 2008/12/06 07:15:42 kientzle Exp $ */ /* @@ -46,16 +44,6 @@ #include "cpio_windows.h" #endif -/* Get a real definition for __FBSDID if we can */ -#if HAVE_SYS_CDEFS_H -#include <sys/cdefs.h> -#endif - -/* If not, define it so as to avoid dangling semicolons. */ -#ifndef __FBSDID -#define __FBSDID(a) struct _undefined_hack -#endif - #ifdef HAVE_LIBARCHIVE /* If we're using the platform libarchive, include system headers. */ #include <archive.h> @@ -69,9 +57,11 @@ /* How to mark functions that don't return. */ #if defined(__GNUC__) && (__GNUC__ > 2 || \ (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) -#define __LA_DEAD __attribute__((__noreturn__)) +#define __LA_NORETURN __attribute__((__noreturn__)) +#elif defined(_MSC_VER) +#define __LA_NORETURN __declspec(noreturn) #else -#define __LA_DEAD +#define __LA_NORETURN #endif #endif /* !CPIO_PLATFORM_H_INCLUDED */ diff --git a/cpio/cpio_windows.c b/cpio/cpio_windows.c index 63f6df0397d2..c888a3897d56 100644 --- a/cpio/cpio_windows.c +++ b/cpio/cpio_windows.c @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #if defined(_WIN32) && !defined(__CYGWIN__) @@ -156,7 +154,11 @@ cpio_CreateFile(const char *path, DWORD dwDesiredAccess, DWORD dwShareMode, { 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); @@ -164,12 +166,25 @@ cpio_CreateFile(const char *path, DWORD dwDesiredAccess, DWORD dwShareMode, return (handle); if (GetLastError() != ERROR_PATH_NOT_FOUND) return (handle); +#endif wpath = 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 & 0x000F0000; + createExParams.lpSecurityAttributes = lpSecurityAttributes; + createExParams.hTemplateFile = hTemplateFile; + handle = CreateFile2(wpath, dwDesiredAccess, dwShareMode, + dwCreationDisposition, &createExParams); +#else handle = CreateFileW(wpath, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); +#endif free(wpath); return (handle); } diff --git a/cpio/cpio_windows.h b/cpio/cpio_windows.h index 970a63df663d..6b88c389ab40 100644 --- a/cpio/cpio_windows.h +++ b/cpio/cpio_windows.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #ifndef CPIO_WINDOWS_H #define CPIO_WINDOWS_H 1 diff --git a/cpio/test/test.h b/cpio/test/test.h index 1dadf68890bf..f8f3a4038b57 100644 --- a/cpio/test/test.h +++ b/cpio/test/test.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ /* Every test program should #include "test.h" as the first thing. */ diff --git a/cpio/test/test_0.c b/cpio/test/test_0.c index fa52def7eaf3..c09df5e137c4 100644 --- a/cpio/test/test_0.c +++ b/cpio/test/test_0.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * This first test does basic sanity checks on the environment. For diff --git a/cpio/test/test_basic.c b/cpio/test/test_basic.c index 3d7d86a0ee78..993d555b831c 100644 --- a/cpio/test/test_basic.c +++ b/cpio/test/test_basic.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/cpio/test/test_basic.c,v 1.4 2008/08/25 06:39:29 kientzle Exp $"); static void verify_files(const char *msg) diff --git a/cpio/test/test_cmdline.c b/cpio/test/test_cmdline.c index 2dd7d651dc57..f4e05ee58599 100644 --- a/cpio/test/test_cmdline.c +++ b/cpio/test/test_cmdline.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Test the command-line parsing. diff --git a/cpio/test/test_extract_cpio_Z.c b/cpio/test/test_extract_cpio_Z.c index f908fc5b84f5..257d70d04211 100644 --- a/cpio/test/test_extract_cpio_Z.c +++ b/cpio/test/test_extract_cpio_Z.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_Z) { diff --git a/cpio/test/test_extract_cpio_bz2.c b/cpio/test/test_extract_cpio_bz2.c index 9525e63ae906..08fe1fe53468 100644 --- a/cpio/test/test_extract_cpio_bz2.c +++ b/cpio/test/test_extract_cpio_bz2.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_bz2) { diff --git a/cpio/test/test_extract_cpio_grz.c b/cpio/test/test_extract_cpio_grz.c index f1a080597e34..969b30e44de5 100644 --- a/cpio/test/test_extract_cpio_grz.c +++ b/cpio/test/test_extract_cpio_grz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_grz) { diff --git a/cpio/test/test_extract_cpio_gz.c b/cpio/test/test_extract_cpio_gz.c index 19cee510c857..16296146f87e 100644 --- a/cpio/test/test_extract_cpio_gz.c +++ b/cpio/test/test_extract_cpio_gz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_gz) { diff --git a/cpio/test/test_extract_cpio_lrz.c b/cpio/test/test_extract_cpio_lrz.c index 67667585e431..7ef213f74aac 100644 --- a/cpio/test/test_extract_cpio_lrz.c +++ b/cpio/test/test_extract_cpio_lrz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_lrz) { diff --git a/cpio/test/test_extract_cpio_lz.c b/cpio/test/test_extract_cpio_lz.c index 4454e7b191e9..bfdf87869b37 100644 --- a/cpio/test/test_extract_cpio_lz.c +++ b/cpio/test/test_extract_cpio_lz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_lz) { diff --git a/cpio/test/test_extract_cpio_lz4.c b/cpio/test/test_extract_cpio_lz4.c index c16247be2bef..f8cf5f8fab0d 100644 --- a/cpio/test/test_extract_cpio_lz4.c +++ b/cpio/test/test_extract_cpio_lz4.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_lz4) { diff --git a/cpio/test/test_extract_cpio_lzma.c b/cpio/test/test_extract_cpio_lzma.c index ae630d6119d8..81fc3c236ab5 100644 --- a/cpio/test/test_extract_cpio_lzma.c +++ b/cpio/test/test_extract_cpio_lzma.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_lzma) { diff --git a/cpio/test/test_extract_cpio_lzo.c b/cpio/test/test_extract_cpio_lzo.c index 99476af95318..d54d4f712374 100644 --- a/cpio/test/test_extract_cpio_lzo.c +++ b/cpio/test/test_extract_cpio_lzo.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_lzo) { diff --git a/cpio/test/test_extract_cpio_xz.c b/cpio/test/test_extract_cpio_xz.c index 60f1b5a9de84..faeea202e050 100644 --- a/cpio/test/test_extract_cpio_xz.c +++ b/cpio/test/test_extract_cpio_xz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_xz) { diff --git a/cpio/test/test_extract_cpio_zstd.c b/cpio/test/test_extract_cpio_zstd.c index 289f33d0583c..31421c3b60d7 100644 --- a/cpio/test/test_extract_cpio_zstd.c +++ b/cpio/test/test_extract_cpio_zstd.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_zstd) { diff --git a/cpio/test/test_format_newc.c b/cpio/test/test_format_newc.c index 6e3b9e359bbd..ee0087d4ca94 100644 --- a/cpio/test/test_format_newc.c +++ b/cpio/test/test_format_newc.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/cpio/test/test_format_newc.c,v 1.2 2008/08/22 02:09:10 kientzle Exp $"); /* Number of bytes needed to pad 'n' to multiple of 'block', assuming * that 'block' is a power of two. This trick can be more easily diff --git a/cpio/test/test_gcpio_compat.c b/cpio/test/test_gcpio_compat.c index 9bb988990e4c..82c71ec3cd21 100644 --- a/cpio/test/test_gcpio_compat.c +++ b/cpio/test/test_gcpio_compat.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/cpio/test/test_gcpio_compat.c,v 1.2 2008/08/22 02:27:06 kientzle Exp $"); static void unpack_test(const char *from, const char *options, const char *se) diff --git a/cpio/test/test_gcpio_compat_ref.bin.uu b/cpio/test/test_gcpio_compat_ref.bin.uu index 745d8ab7851a..f2ffad975644 100644 --- a/cpio/test/test_gcpio_compat_ref.bin.uu +++ b/cpio/test/test_gcpio_compat_ref.bin.uu @@ -1,4 +1,3 @@ -$FreeBSD$ begin 644 test_gcpio_compat_ref.bin MQW%9`*IWI('H`^@#`@````U'=YD%````"@!F:6QE```Q,C,T-38W.#D*QW%9 M`*IWI('H`^@#`@````U'=YD)````"@!L:6YK9FEL90``,3(S-#4V-S@Y"L=Q diff --git a/cpio/test/test_gcpio_compat_ref.crc.uu b/cpio/test/test_gcpio_compat_ref.crc.uu index df8dde05bd82..56ba62c9ed1f 100644 --- a/cpio/test/test_gcpio_compat_ref.crc.uu +++ b/cpio/test/test_gcpio_compat_ref.crc.uu @@ -1,4 +1,3 @@ -$FreeBSD$ begin 644 test_gcpio_compat_ref.crc M,#<P-S`R,#`S,S<W86$P,#`P.#%A-#`P,#`P,V4X,#`P,#`S93@P,#`P,#`P M,C0W,&0Y.3<W,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#4Y,#`P,#`P,#`P,#`P diff --git a/cpio/test/test_gcpio_compat_ref.newc.uu b/cpio/test/test_gcpio_compat_ref.newc.uu index 1e29ba907bb4..449c083c311c 100644 --- a/cpio/test/test_gcpio_compat_ref.newc.uu +++ b/cpio/test/test_gcpio_compat_ref.newc.uu @@ -1,4 +1,3 @@ -$FreeBSD$ begin 644 test_gcpio_compat_ref.newc M,#<P-S`Q,#`S,S<W86$P,#`P.#%A-#`P,#`P,V4X,#`P,#`S93@P,#`P,#`P M,C0W,&0Y.3<W,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#4Y,#`P,#`P,#`P,#`P diff --git a/cpio/test/test_gcpio_compat_ref.ustar.uu b/cpio/test/test_gcpio_compat_ref.ustar.uu index 77989f4aed06..2f6a44057eac 100644 --- a/cpio/test/test_gcpio_compat_ref.ustar.uu +++ b/cpio/test/test_gcpio_compat_ref.ustar.uu @@ -1,4 +1,3 @@ -$FreeBSD$ begin 644 test_gcpio_compat_ref.ustar M9FEL90`````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` diff --git a/cpio/test/test_missing_file.c b/cpio/test/test_missing_file.c index a908f5301bc6..784d53cfe141 100644 --- a/cpio/test/test_missing_file.c +++ b/cpio/test/test_missing_file.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_missing_file) { diff --git a/cpio/test/test_option_0.c b/cpio/test/test_option_0.c index bc4aecd2afc2..fbe6f7ac4a85 100644 --- a/cpio/test/test_option_0.c +++ b/cpio/test/test_option_0.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_0) { diff --git a/cpio/test/test_option_B_upper.c b/cpio/test/test_option_B_upper.c index b040354b6053..79dc91efb5ba 100644 --- a/cpio/test/test_option_B_upper.c +++ b/cpio/test/test_option_B_upper.c @@ -23,8 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); - DEFINE_TEST(test_option_B_upper) { diff --git a/cpio/test/test_option_C_upper.c b/cpio/test/test_option_C_upper.c index c8e63fd34fb5..f9fd7e159339 100644 --- a/cpio/test/test_option_C_upper.c +++ b/cpio/test/test_option_C_upper.c @@ -23,8 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); - DEFINE_TEST(test_option_C_upper) { diff --git a/cpio/test/test_option_J_upper.c b/cpio/test/test_option_J_upper.c index 1d7d05131b3d..f76d3b236913 100644 --- a/cpio/test/test_option_J_upper.c +++ b/cpio/test/test_option_J_upper.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_J_upper) { @@ -43,6 +42,7 @@ DEFINE_TEST(test_option_J_upper) if (strstr(p, "compression not available") != NULL) { skipping("This version of bsdcpio was compiled " "without xz support"); + free(p); return; } failure("-J option is broken"); diff --git a/cpio/test/test_option_L_upper.c b/cpio/test/test_option_L_upper.c index cab41b61d749..b6fb713f110f 100644 --- a/cpio/test/test_option_L_upper.c +++ b/cpio/test/test_option_L_upper.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/cpio/test/test_option_L.c,v 1.2 2008/08/24 06:21:00 kientzle Exp $"); /* This is a little pointless, as Windows doesn't support symlinks * (except for the seriously crippled CreateSymbolicLink API) so these diff --git a/cpio/test/test_option_Z_upper.c b/cpio/test/test_option_Z_upper.c index ff388427e372..aa408e4e548c 100644 --- a/cpio/test/test_option_Z_upper.c +++ b/cpio/test/test_option_Z_upper.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_Z_upper) { diff --git a/cpio/test/test_option_a.c b/cpio/test/test_option_a.c index e96bdf3cab5b..885eb12c80f5 100644 --- a/cpio/test/test_option_a.c +++ b/cpio/test/test_option_a.c @@ -28,7 +28,6 @@ #elif defined(HAVE_SYS_UTIME_H) #include <sys/utime.h> #endif -__FBSDID("$FreeBSD: src/usr.bin/cpio/test/test_option_a.c,v 1.3 2008/08/24 06:21:00 kientzle Exp $"); static struct { const char *name; diff --git a/cpio/test/test_option_b64encode.c b/cpio/test/test_option_b64encode.c index 7c15a8230606..501976c202a1 100644 --- a/cpio/test/test_option_b64encode.c +++ b/cpio/test/test_option_b64encode.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_b64encode) { diff --git a/cpio/test/test_option_c.c b/cpio/test/test_option_c.c index 013caed56030..0b6bed2fac93 100644 --- a/cpio/test/test_option_c.c +++ b/cpio/test/test_option_c.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static int is_octal(const char *p, size_t l) @@ -37,10 +36,10 @@ is_octal(const char *p, size_t l) return (1); } -static int +static long long int from_octal(const char *p, size_t l) { - int r = 0; + long long int r = 0; while (l > 0) { r *= 8; @@ -161,7 +160,7 @@ DEFINE_TEST(test_option_c) assertEqualInt(from_octal(e + 24, 6), uid); /* uid */ assertEqualInt(gid, from_octal(e + 30, 6)); /* gid */ assertEqualMem(e + 36, "000001", 6); /* nlink */ - failure("file entries should have rdev == 0 (dev was 0%o)", + failure("file entries should have rdev == 0 (dev was 0%llo)", from_octal(e + 6, 6)); assertEqualMem(e + 42, "000000", 6); /* rdev */ t = from_octal(e + 48, 11); /* mtime */ diff --git a/cpio/test/test_option_d.c b/cpio/test/test_option_d.c index 9ff14539698f..b96430e4f37a 100644 --- a/cpio/test/test_option_d.c +++ b/cpio/test/test_option_d.c @@ -23,8 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); - DEFINE_TEST(test_option_d) { diff --git a/cpio/test/test_option_f.c b/cpio/test/test_option_f.c index 784e0858431b..72383884ac1e 100644 --- a/cpio/test/test_option_f.c +++ b/cpio/test/test_option_f.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Unpack the archive in a new dir. diff --git a/cpio/test/test_option_f.cpio.uu b/cpio/test/test_option_f.cpio.uu index 42c63c39685e..60b74173f413 100644 --- a/cpio/test/test_option_f.cpio.uu +++ b/cpio/test/test_option_f.cpio.uu @@ -1,4 +1,3 @@ -$FreeBSD$ begin 644 test_option_f.cpio M,#<P-S`W,#`P,3,Q-C(Q-38Q,3`P-C0T,#`Q-S4P,#`Q-S4P,#`P,#`Q,#`P M,#`P,3`W,S4Q,3(U,C8P,#`P,#4P,#`P,#`P,#`P,&$Q,C,`,#<P-S`W,#`P diff --git a/cpio/test/test_option_grzip.c b/cpio/test/test_option_grzip.c index 7e7dd2c8e6f3..cd898cd9228f 100644 --- a/cpio/test/test_option_grzip.c +++ b/cpio/test/test_option_grzip.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_grzip) { diff --git a/cpio/test/test_option_help.c b/cpio/test/test_option_help.c index 56234306f539..cf69c76496d5 100644 --- a/cpio/test/test_option_help.c +++ b/cpio/test/test_option_help.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Test that "--help", "-h", and "-W help" options all work and diff --git a/cpio/test/test_option_l.c b/cpio/test/test_option_l.c index 5c76e688e6e9..3f4390a6ff22 100644 --- a/cpio/test/test_option_l.c +++ b/cpio/test/test_option_l.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_l) { diff --git a/cpio/test/test_option_lrzip.c b/cpio/test/test_option_lrzip.c index 8d9c0d576cc3..4c46f1c65bba 100644 --- a/cpio/test/test_option_lrzip.c +++ b/cpio/test/test_option_lrzip.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_lrzip) { diff --git a/cpio/test/test_option_lz4.c b/cpio/test/test_option_lz4.c index ebd376736f42..4c5186d55ccc 100644 --- a/cpio/test/test_option_lz4.c +++ b/cpio/test/test_option_lz4.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_lz4) { diff --git a/cpio/test/test_option_lzma.c b/cpio/test/test_option_lzma.c index b7cad3d1e99a..3c2648b827cd 100644 --- a/cpio/test/test_option_lzma.c +++ b/cpio/test/test_option_lzma.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_lzma) { diff --git a/cpio/test/test_option_lzop.c b/cpio/test/test_option_lzop.c index aa40ef5b6392..b787b720a878 100644 --- a/cpio/test/test_option_lzop.c +++ b/cpio/test/test_option_lzop.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_lzop) { diff --git a/cpio/test/test_option_m.c b/cpio/test/test_option_m.c index de880b2883e1..f2f297e10572 100644 --- a/cpio/test/test_option_m.c +++ b/cpio/test/test_option_m.c @@ -23,8 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); - DEFINE_TEST(test_option_m) { diff --git a/cpio/test/test_option_m.cpio.uu b/cpio/test/test_option_m.cpio.uu index 3d2002355e55..0c36ac4fdfd5 100644 --- a/cpio/test/test_option_m.cpio.uu +++ b/cpio/test/test_option_m.cpio.uu @@ -1,4 +1,3 @@ -$FreeBSD$ begin 644 test_option_m.cpio M,#<P-S`W,#`P,3,Q-#4P,#8T,3`P-C0T,#`Q-S4P,#`Q-S4P,#`P,#`Q,#`P M,#`P,#`P,#`P,#`P,#$P,#`P,#4P,#`P,#`P,#`P,&9I;&4`,#<P-S`W,#`P diff --git a/cpio/test/test_option_passphrase.c b/cpio/test/test_option_passphrase.c index ae77a23fcb74..d409b30c81cf 100644 --- a/cpio/test/test_option_passphrase.c +++ b/cpio/test/test_option_passphrase.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_passphrase) { diff --git a/cpio/test/test_option_t.c b/cpio/test/test_option_t.c index eaa73fa3a016..953e4a80651e 100644 --- a/cpio/test/test_option_t.c +++ b/cpio/test/test_option_t.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_LOCALE_H #include <locale.h> @@ -36,6 +35,10 @@ DEFINE_TEST(test_option_t) time_t mtime; char date[32]; char date2[32]; + struct tm *tmptr; +#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S) + struct tm tmbuf; +#endif /* List reference archive, make sure the TOC is correct. */ extract_reference_file("test_option_t.cpio"); @@ -87,11 +90,18 @@ DEFINE_TEST(test_option_t) #ifdef HAVE_LOCALE_H setlocale(LC_ALL, ""); #endif +#if defined(HAVE_LOCALTIME_S) + tmptr = localtime_s(&tmbuf, &mtime) ? NULL : &tmbuf; +#elif defined(HAVE_LOCALTIME_R) + tmptr = localtime_r(&mtime, &tmbuf); +#else + tmptr = localtime(&mtime); +#endif #if defined(_WIN32) && !defined(__CYGWIN__) - strftime(date2, sizeof(date2)-1, "%b %d %Y", localtime(&mtime)); + strftime(date2, sizeof(date2)-1, "%b %d %Y", tmptr); _snprintf(date, sizeof(date)-1, "%12.12s file", date2); #else - strftime(date2, sizeof(date2)-1, "%b %e %Y", localtime(&mtime)); + strftime(date2, sizeof(date2)-1, "%b %e %Y", tmptr); snprintf(date, sizeof(date)-1, "%12.12s file", date2); #endif assertEqualMem(p + 42, date, strlen(date)); diff --git a/cpio/test/test_option_t.cpio.uu b/cpio/test/test_option_t.cpio.uu index 055fe747d06f..d0bf60bf7d9d 100644 --- a/cpio/test/test_option_t.cpio.uu +++ b/cpio/test/test_option_t.cpio.uu @@ -1,4 +1,3 @@ -$FreeBSD$ begin 644 test_option_t.cpio M,#<P-S`W,#`P,3,Q-#4P,#8T,3`P-C0T,#`Q-S4P,#`Q-S4P,#`P,#`Q,#`P M,#`P,#`P,#`P,#`P,#$P,#`P,#4P,#`P,#`P,#`P,&9I;&4`,#<P-S`W,#`P diff --git a/cpio/test/test_option_t.stdout.uu b/cpio/test/test_option_t.stdout.uu index 2457706eceed..c5144bb68029 100644 --- a/cpio/test/test_option_t.stdout.uu +++ b/cpio/test/test_option_t.stdout.uu @@ -1,4 +1,3 @@ -$FreeBSD$ begin 644 test_option_t.stdout %9FEL90H` ` diff --git a/cpio/test/test_option_tv.stdout.uu b/cpio/test/test_option_tv.stdout.uu index e28888ac4747..ad9481360f35 100644 --- a/cpio/test/test_option_tv.stdout.uu +++ b/cpio/test/test_option_tv.stdout.uu @@ -1,4 +1,3 @@ -$FreeBSD: src/usr.bin/cpio/test/test_option_tv.stdout.uu,v 1.2 2008/11/29 20:22:02 kientzle Exp $ begin 644 test_option_tv.stdout M+7)W+7(M+7(M+2`@(#$@=&EM("`@("`@=&EM("`@("`@("`@("`@(#`@1&5C /(#,Q("`Q.38Y(&9I;&4* diff --git a/cpio/test/test_option_u.c b/cpio/test/test_option_u.c index cc790b1c0af2..fe5b863af0e2 100644 --- a/cpio/test/test_option_u.c +++ b/cpio/test/test_option_u.c @@ -28,7 +28,6 @@ #elif defined(HAVE_SYS_UTIME_H) #include <sys/utime.h> #endif -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_u) { diff --git a/cpio/test/test_option_uuencode.c b/cpio/test/test_option_uuencode.c index a42a0e03096f..28662ddfb659 100644 --- a/cpio/test/test_option_uuencode.c +++ b/cpio/test/test_option_uuencode.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_uuencode) { diff --git a/cpio/test/test_option_xz.c b/cpio/test/test_option_xz.c index f0d3b33d45b8..9116ecace3a7 100644 --- a/cpio/test/test_option_xz.c +++ b/cpio/test/test_option_xz.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_xz) { diff --git a/cpio/test/test_option_y.c b/cpio/test/test_option_y.c index 989b5f1aaf6e..a78dff8cf4ea 100644 --- a/cpio/test/test_option_y.c +++ b/cpio/test/test_option_y.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/cpio/test/test_option_y.c,v 1.2 2008/08/24 06:21:00 kientzle Exp $"); DEFINE_TEST(test_option_y) { diff --git a/cpio/test/test_option_z.c b/cpio/test/test_option_z.c index 803232d045c2..9a1500d77f32 100644 --- a/cpio/test/test_option_z.c +++ b/cpio/test/test_option_z.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_z) { diff --git a/cpio/test/test_option_zstd.c b/cpio/test/test_option_zstd.c index 29b8c78b94aa..10c3ed9784e8 100644 --- a/cpio/test/test_option_zstd.c +++ b/cpio/test/test_option_zstd.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_zstd) { diff --git a/cpio/test/test_owner_parse.c b/cpio/test/test_owner_parse.c index bef02da7badf..fc6f18943f5d 100644 --- a/cpio/test/test_owner_parse.c +++ b/cpio/test/test_owner_parse.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #include "../cpio.h" #include "err.h" diff --git a/cpio/test/test_passthrough_dotdot.c b/cpio/test/test_passthrough_dotdot.c index bb04341a4c79..831c1f81c1cb 100644 --- a/cpio/test/test_passthrough_dotdot.c +++ b/cpio/test/test_passthrough_dotdot.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/cpio/test/test_passthrough_dotdot.c,v 1.4 2008/08/24 06:21:00 kientzle Exp $"); /* * Verify that "cpio -p .." works. diff --git a/cpio/test/test_passthrough_reverse.c b/cpio/test/test_passthrough_reverse.c index 674e52bc0a18..7ae0e6602a34 100644 --- a/cpio/test/test_passthrough_reverse.c +++ b/cpio/test/test_passthrough_reverse.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/cpio/test/test_passthrough_reverse.c,v 1.2 2008/08/24 06:21:00 kientzle Exp $"); /* * As reported by Bernd Walter: Some people are in the habit of diff --git a/libarchive/CMakeLists.txt b/libarchive/CMakeLists.txt index e1d76a5198d3..b79091cac582 100644 --- a/libarchive/CMakeLists.txt +++ b/libarchive/CMakeLists.txt @@ -5,6 +5,10 @@ # ############################################ +if (ANDROID) + include_directories(${PROJECT_SOURCE_DIR}/contrib/android/include) +endif() + # Public headers SET(include_HEADERS archive.h @@ -78,6 +82,7 @@ SET(libarchive_SOURCES archive_read_set_format.c archive_read_set_options.c archive_read_support_filter_all.c + archive_read_support_filter_by_code.c archive_read_support_filter_bzip2.c archive_read_support_filter_compress.c archive_read_support_filter_gzip.c @@ -238,24 +243,33 @@ ELSEIF(ARCHIVE_ACL_SUNOS) ENDIF() # Libarchive is a shared library -ADD_LIBRARY(archive SHARED ${libarchive_SOURCES} ${include_HEADERS}) -TARGET_INCLUDE_DIRECTORIES(archive PUBLIC .) -TARGET_LINK_LIBRARIES(archive ${ADDITIONAL_LIBS}) -SET_TARGET_PROPERTIES(archive PROPERTIES SOVERSION ${SOVERSION}) +IF(BUILD_SHARED_LIBS) + ADD_LIBRARY(archive SHARED ${libarchive_SOURCES} ${include_HEADERS}) + TARGET_INCLUDE_DIRECTORIES(archive PUBLIC .) + TARGET_LINK_LIBRARIES(archive ${ADDITIONAL_LIBS}) + SET_TARGET_PROPERTIES(archive PROPERTIES SOVERSION ${SOVERSION}) +ENDIF(BUILD_SHARED_LIBS) # archive_static is a static library ADD_LIBRARY(archive_static STATIC ${libarchive_SOURCES} ${include_HEADERS}) +TARGET_INCLUDE_DIRECTORIES(archive_static PUBLIC .) TARGET_LINK_LIBRARIES(archive_static ${ADDITIONAL_LIBS}) SET_TARGET_PROPERTIES(archive_static PROPERTIES COMPILE_DEFINITIONS LIBARCHIVE_STATIC) # On Posix systems, libarchive.so and libarchive.a can co-exist. -IF(NOT WIN32 OR CYGWIN) +IF(NOT WIN32 OR CYGWIN OR NOT BUILD_SHARED_LIBS) SET_TARGET_PROPERTIES(archive_static PROPERTIES OUTPUT_NAME archive) -ENDIF(NOT WIN32 OR CYGWIN) +ENDIF(NOT WIN32 OR CYGWIN OR NOT BUILD_SHARED_LIBS) IF(ENABLE_INSTALL) # How to install the libraries - INSTALL(TARGETS archive archive_static + IF(BUILD_SHARED_LIBS) + INSTALL(TARGETS archive + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib) + ENDIF(BUILD_SHARED_LIBS) + INSTALL(TARGETS archive_static RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) diff --git a/libarchive/archive.h b/libarchive/archive.h index 930ad5767968..2e3a9f31cd33 100644 --- a/libarchive/archive.h +++ b/libarchive/archive.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/lib/libarchive/archive.h.in,v 1.50 2008/05/26 17:00:22 kientzle Exp $ */ #ifndef ARCHIVE_H_INCLUDED @@ -36,7 +34,7 @@ * assert that ARCHIVE_VERSION_NUMBER >= 2012108. */ /* Note: Compiler will complain if this does not match archive_entry.h! */ -#define ARCHIVE_VERSION_NUMBER 3006001 +#define ARCHIVE_VERSION_NUMBER 3007003 #include <sys/stat.h> #include <stddef.h> /* for wchar_t */ @@ -120,6 +118,8 @@ typedef ssize_t la_ssize_t; # 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 +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.6.1dev" +#define ARCHIVE_VERSION_ONLY_STRING "3.7.3" #define ARCHIVE_VERSION_STRING "libarchive " ARCHIVE_VERSION_ONLY_STRING __LA_DECL const char * archive_version_string(void); @@ -533,6 +533,10 @@ __LA_DECL int archive_read_open_filenames(struct archive *, const char **_filenames, size_t _block_size); __LA_DECL int archive_read_open_filename_w(struct archive *, const wchar_t *_filename, size_t _block_size); +#if defined(_WIN32) && !defined(__CYGWIN__) +__LA_DECL int archive_read_open_filenames_w(struct archive *, + const wchar_t **_filenames, size_t _block_size); +#endif /* archive_read_open_file() is a deprecated synonym for ..._open_filename(). */ __LA_DECL int archive_read_open_file(struct archive *, const char *_filename, size_t _block_size) __LA_DEPRECATED; diff --git a/libarchive/archive_acl.c b/libarchive/archive_acl.c index ead7e36e49ec..254324c71309 100644 --- a/libarchive/archive_acl.c +++ b/libarchive/archive_acl.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include <errno.h> diff --git a/libarchive/archive_acl_private.h b/libarchive/archive_acl_private.h index af108162c664..750b4dd7d898 100644 --- a/libarchive/archive_acl_private.h +++ b/libarchive/archive_acl_private.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #ifndef ARCHIVE_ACL_PRIVATE_H_INCLUDED diff --git a/libarchive/archive_check_magic.c b/libarchive/archive_check_magic.c index 1f40072f81d8..d12f0c496e27 100644 --- a/libarchive/archive_check_magic.c +++ b/libarchive/archive_check_magic.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_check_magic.c 201089 2009-12-28 02:20:23Z kientzle $"); #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> @@ -62,7 +61,7 @@ errmsg(const char *m) } } -static __LA_DEAD void +static __LA_NORETURN void diediedie(void) { #if defined(_WIN32) && !defined(__CYGWIN__) && defined(_DEBUG) @@ -99,13 +98,12 @@ archive_handle_type_name(unsigned m) } } - -static char * +static void write_all_states(char *buff, unsigned int states) { unsigned int lowbit; - buff[0] = '\0'; + *buff = '\0'; /* A trick for computing the lowest set bit. */ while ((lowbit = states & (1 + ~states)) != 0) { @@ -114,7 +112,6 @@ write_all_states(char *buff, unsigned int states) if (states != 0) strcat(buff, "/"); } - return buff; } /* @@ -160,16 +157,19 @@ __archive_check_magic(struct archive *a, unsigned int magic, if ((a->state & state) == 0) { /* If we're already FATAL, don't overwrite the error. */ - if (a->state != ARCHIVE_STATE_FATAL) + if (a->state != ARCHIVE_STATE_FATAL) { + write_all_states(states1, a->state); + write_all_states(states2, state); archive_set_error(a, -1, "INTERNAL ERROR: Function '%s' invoked with" " archive structure in state '%s'," " should be in state '%s'", function, - write_all_states(states1, a->state), - write_all_states(states2, state)); + states1, + states2); + } a->state = ARCHIVE_STATE_FATAL; return (ARCHIVE_FATAL); } - return ARCHIVE_OK; + return (ARCHIVE_OK); } diff --git a/libarchive/archive_cmdline.c b/libarchive/archive_cmdline.c index 5c519cd17f1b..2e5428cae516 100644 --- a/libarchive/archive_cmdline.c +++ b/libarchive/archive_cmdline.c @@ -25,8 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_STRING_H # include <string.h> #endif diff --git a/libarchive/archive_cmdline_private.h b/libarchive/archive_cmdline_private.h index 57a19494fd7a..7495dfed55dd 100644 --- a/libarchive/archive_cmdline_private.h +++ b/libarchive/archive_cmdline_private.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #ifndef ARCHIVE_CMDLINE_PRIVATE_H diff --git a/libarchive/archive_crc32.h b/libarchive/archive_crc32.h index 4f1aed305930..98a4e2cf8f7f 100644 --- a/libarchive/archive_crc32.h +++ b/libarchive/archive_crc32.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/archive_crc32.h 201102 2009-12-28 03:11:36Z kientzle $ */ #ifndef ARCHIVE_CRC32_H diff --git a/libarchive/archive_cryptor.c b/libarchive/archive_cryptor.c index 112baf161348..437dba06be62 100644 --- a/libarchive/archive_cryptor.c +++ b/libarchive/archive_cryptor.c @@ -424,8 +424,8 @@ static int aes_ctr_release(archive_crypto_ctx *ctx) { EVP_CIPHER_CTX_free(ctx->ctx); - memset(ctx->key, 0, ctx->key_len); - memset(ctx->nonce, 0, sizeof(ctx->nonce)); + OPENSSL_cleanse(ctx->key, ctx->key_len); + OPENSSL_cleanse(ctx->nonce, sizeof(ctx->nonce)); return 0; } diff --git a/libarchive/archive_digest.c b/libarchive/archive_digest.c index 410df01563df..3776831b21c9 100644 --- a/libarchive/archive_digest.c +++ b/libarchive/archive_digest.c @@ -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, 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, ALG_ID algId) +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 @@ win_crypto_init(Digest_CTX *ctx, ALG_ID algId) ctx->valid = 1; return (ARCHIVE_OK); } +#endif /* * Update a Message digest. @@ -81,23 +107,37 @@ win_crypto_Update(Digest_CTX *ctx, const unsigned char *buf, size_t len) if (!ctx->valid) return (ARCHIVE_FAILED); +#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA + BCryptHashData(ctx->hHash, + (PUCHAR)(uintptr_t)buf, + (ULONG)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 @@ __archive_md5init(archive_md5_ctx *ctx) { 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 @@ __archive_md5final(archive_md5_ctx *ctx, void *md) 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 @@ __archive_ripemd160init(archive_rmd160_ctx *ctx) { 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 @@ __archive_sha1init(archive_sha1_ctx *ctx) { 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 @@ __archive_sha1final(archive_sha1_ctx *ctx, void *md) 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 @@ __archive_sha256init(archive_sha256_ctx *ctx) { 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 @@ __archive_sha256final(archive_sha256_ctx *ctx, void *md) 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 @@ __archive_sha384init(archive_sha384_ctx *ctx) { 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 @@ __archive_sha384final(archive_sha384_ctx *ctx, void *md) 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 @@ __archive_sha512init(archive_sha512_ctx *ctx) { 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 @@ __archive_sha512final(archive_sha512_ctx *ctx, void *md) 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 diff --git a/libarchive/archive_digest_private.h b/libarchive/archive_digest_private.h index 9b3bd6621bf3..339b4edca48d 100644 --- a/libarchive/archive_digest_private.h +++ b/libarchive/archive_digest_private.h @@ -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 { @@ -172,6 +181,7 @@ typedef struct { HCRYPTHASH hash; } Digest_CTX; #endif +#endif /* typedefs */ #if defined(ARCHIVE_CRYPTO_MD5_LIBC) diff --git a/libarchive/archive_endian.h b/libarchive/archive_endian.h index e6d3f2ce5e70..83b2efa531ef 100644 --- a/libarchive/archive_endian.h +++ b/libarchive/archive_endian.h @@ -23,8 +23,6 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: head/lib/libarchive/archive_endian.h 201085 2009-12-28 02:17:15Z kientzle $ - * * Borrowed from FreeBSD's <sys/endian.h> */ diff --git a/libarchive/archive_entry.3 b/libarchive/archive_entry.3 index 2f62a4be233e..0fc0f8cc2fe6 100644 --- a/libarchive/archive_entry.3 +++ b/libarchive/archive_entry.3 @@ -23,8 +23,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_ENTRY 3 .Os diff --git a/libarchive/archive_entry.c b/libarchive/archive_entry.c index ca7a4bdb50e7..9463233e6a42 100644 --- a/libarchive/archive_entry.c +++ b/libarchive/archive_entry.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_entry.c 201096 2009-12-28 02:41:27Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> @@ -372,6 +371,12 @@ archive_entry_filetype(struct archive_entry *entry) return (AE_IFMT & entry->acl.mode); } +int +archive_entry_filetype_is_set(struct archive_entry *entry) +{ + return (entry->ae_set & AE_SET_FILETYPE); +} + void archive_entry_fflags(struct archive_entry *entry, unsigned long *set, unsigned long *clear) @@ -425,6 +430,12 @@ archive_entry_gid(struct archive_entry *entry) return (entry->ae_stat.aest_gid); } +int +archive_entry_gid_is_set(struct archive_entry *entry) +{ + return (entry->ae_set & AE_SET_GID); +} + const char * archive_entry_gname(struct archive_entry *entry) { @@ -568,6 +579,13 @@ archive_entry_nlink(struct archive_entry *entry) 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 +593,13 @@ archive_entry_pathname(struct archive_entry *entry) 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); @@ -617,6 +642,12 @@ archive_entry_perm(struct archive_entry *entry) return (~AE_IFMT & entry->acl.mode); } +int +archive_entry_perm_is_set(struct archive_entry *entry) +{ + return (entry->ae_set & AE_SET_PERM); +} + dev_t archive_entry_rdev(struct archive_entry *entry) { @@ -745,6 +776,12 @@ archive_entry_uid(struct archive_entry *entry) return (entry->ae_stat.aest_uid); } +int +archive_entry_uid_is_set(struct archive_entry *entry) +{ + return (entry->ae_set & AE_SET_UID); +} + const char * archive_entry_uname(struct archive_entry *entry) { @@ -813,6 +850,7 @@ archive_entry_set_filetype(struct archive_entry *entry, unsigned int type) entry->stat_valid = 0; entry->acl.mode &= ~AE_IFMT; entry->acl.mode |= AE_IFMT & type; + entry->ae_set |= AE_SET_FILETYPE; } void @@ -847,6 +885,7 @@ archive_entry_set_gid(struct archive_entry *entry, la_int64_t g) { entry->stat_valid = 0; entry->ae_stat.aest_gid = g; + entry->ae_set |= AE_SET_GID; } void @@ -1131,6 +1170,7 @@ archive_entry_set_mode(struct archive_entry *entry, mode_t m) { entry->stat_valid = 0; entry->acl.mode = m; + entry->ae_set |= AE_SET_PERM | AE_SET_FILETYPE; } void @@ -1206,6 +1246,7 @@ archive_entry_set_perm(struct archive_entry *entry, mode_t p) entry->stat_valid = 0; entry->acl.mode &= AE_IFMT; entry->acl.mode |= ~AE_IFMT & p; + entry->ae_set |= AE_SET_PERM; } void @@ -1340,6 +1381,7 @@ archive_entry_set_uid(struct archive_entry *entry, la_int64_t u) { entry->stat_valid = 0; entry->ae_stat.aest_uid = u; + entry->ae_set |= AE_SET_UID; } void diff --git a/libarchive/archive_entry.h b/libarchive/archive_entry.h index d5cb30de7585..df9cb765f7e8 100644 --- a/libarchive/archive_entry.h +++ b/libarchive/archive_entry.h @@ -22,15 +22,13 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/archive_entry.h 201096 2009-12-28 02:41:27Z kientzle $ */ #ifndef ARCHIVE_ENTRY_H_INCLUDED #define ARCHIVE_ENTRY_H_INCLUDED /* Note: Compiler will complain if this does not match archive.h! */ -#define ARCHIVE_VERSION_NUMBER 3006001 +#define ARCHIVE_VERSION_NUMBER 3007003 /* * Note: archive_entry.h is for use outside of libarchive; the @@ -122,6 +120,8 @@ typedef ssize_t la_ssize_t; # 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 @@ -249,11 +249,13 @@ __LA_DECL int archive_entry_dev_is_set(struct archive_entry *); __LA_DECL dev_t archive_entry_devmajor(struct archive_entry *); __LA_DECL dev_t archive_entry_devminor(struct archive_entry *); __LA_DECL __LA_MODE_T archive_entry_filetype(struct archive_entry *); +__LA_DECL int archive_entry_filetype_is_set(struct archive_entry *); __LA_DECL void archive_entry_fflags(struct archive_entry *, unsigned long * /* set */, unsigned long * /* clear */); __LA_DECL const char *archive_entry_fflags_text(struct archive_entry *); __LA_DECL la_int64_t archive_entry_gid(struct archive_entry *); +__LA_DECL int archive_entry_gid_is_set(struct archive_entry *); __LA_DECL const char *archive_entry_gname(struct archive_entry *); __LA_DECL const char *archive_entry_gname_utf8(struct archive_entry *); __LA_DECL const wchar_t *archive_entry_gname_w(struct archive_entry *); @@ -272,6 +274,7 @@ __LA_DECL const char *archive_entry_pathname(struct archive_entry *); __LA_DECL const char *archive_entry_pathname_utf8(struct archive_entry *); __LA_DECL const wchar_t *archive_entry_pathname_w(struct archive_entry *); __LA_DECL __LA_MODE_T archive_entry_perm(struct archive_entry *); +__LA_DECL int archive_entry_perm_is_set(struct archive_entry *); __LA_DECL dev_t archive_entry_rdev(struct archive_entry *); __LA_DECL dev_t archive_entry_rdevmajor(struct archive_entry *); __LA_DECL dev_t archive_entry_rdevminor(struct archive_entry *); @@ -285,6 +288,7 @@ __LA_DECL const char *archive_entry_symlink_utf8(struct archive_entry *); __LA_DECL int archive_entry_symlink_type(struct archive_entry *); __LA_DECL const wchar_t *archive_entry_symlink_w(struct archive_entry *); __LA_DECL la_int64_t archive_entry_uid(struct archive_entry *); +__LA_DECL int archive_entry_uid_is_set(struct archive_entry *); __LA_DECL const char *archive_entry_uname(struct archive_entry *); __LA_DECL const char *archive_entry_uname_utf8(struct archive_entry *); __LA_DECL const wchar_t *archive_entry_uname_w(struct archive_entry *); diff --git a/libarchive/archive_entry_copy_bhfi.c b/libarchive/archive_entry_copy_bhfi.c index 77bf38e450f2..d5317a5eab5b 100644 --- a/libarchive/archive_entry_copy_bhfi.c +++ b/libarchive/archive_entry_copy_bhfi.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #include "archive_private.h" #include "archive_entry.h" diff --git a/libarchive/archive_entry_copy_stat.c b/libarchive/archive_entry_copy_stat.c index ac83868e8f8a..f9c2e8469b1e 100644 --- a/libarchive/archive_entry_copy_stat.c +++ b/libarchive/archive_entry_copy_stat.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_entry_copy_stat.c 189466 2009-03-07 00:52:02Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> diff --git a/libarchive/archive_entry_link_resolver.c b/libarchive/archive_entry_link_resolver.c index c7d59497a7cf..6c6173430250 100644 --- a/libarchive/archive_entry_link_resolver.c +++ b/libarchive/archive_entry_link_resolver.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_entry_link_resolver.c 201100 2009-12-28 03:05:31Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> diff --git a/libarchive/archive_entry_locale.h b/libarchive/archive_entry_locale.h index 803c0368bb69..1b90c57eabf2 100644 --- a/libarchive/archive_entry_locale.h +++ b/libarchive/archive_entry_locale.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #ifndef ARCHIVE_ENTRY_LOCALE_H_INCLUDED diff --git a/libarchive/archive_entry_private.h b/libarchive/archive_entry_private.h index cf4deb24ec83..3423966c60f3 100644 --- a/libarchive/archive_entry_private.h +++ b/libarchive/archive_entry_private.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/archive_entry_private.h 201096 2009-12-28 02:41:27Z kientzle $ */ #ifndef ARCHIVE_ENTRY_PRIVATE_H_INCLUDED @@ -147,6 +145,10 @@ struct archive_entry { #define AE_SET_SIZE 64 #define AE_SET_INO 128 #define AE_SET_DEV 256 +#define AE_SET_PERM 512 +#define AE_SET_FILETYPE 1024 +#define AE_SET_UID 2048 +#define AE_SET_GID 4096 /* * Use aes here so that we get transparent mbs<->wcs conversions. diff --git a/libarchive/archive_entry_sparse.c b/libarchive/archive_entry_sparse.c index 74917b37b804..b81684d18730 100644 --- a/libarchive/archive_entry_sparse.c +++ b/libarchive/archive_entry_sparse.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #include "archive.h" #include "archive_entry.h" diff --git a/libarchive/archive_entry_stat.c b/libarchive/archive_entry_stat.c index 71a407b1f8b3..c4906838ed0f 100644 --- a/libarchive/archive_entry_stat.c +++ b/libarchive/archive_entry_stat.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_entry_stat.c 201100 2009-12-28 03:05:31Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> diff --git a/libarchive/archive_entry_strmode.c b/libarchive/archive_entry_strmode.c index af2517a32199..5faa2faeefa0 100644 --- a/libarchive/archive_entry_strmode.c +++ b/libarchive/archive_entry_strmode.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: src/lib/libarchive/archive_entry_strmode.c,v 1.4 2008/06/15 05:14:01 kientzle Exp $"); #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> diff --git a/libarchive/archive_entry_time.3 b/libarchive/archive_entry_time.3 index d0563eaef43a..0f1dbb025127 100644 --- a/libarchive/archive_entry_time.3 +++ b/libarchive/archive_entry_time.3 @@ -23,8 +23,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_ENTRY_TIME 3 .Os diff --git a/libarchive/archive_entry_xattr.c b/libarchive/archive_entry_xattr.c index 5fe726b99d0c..14848a5ab2c4 100644 --- a/libarchive/archive_entry_xattr.c +++ b/libarchive/archive_entry_xattr.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_entry_xattr.c 201096 2009-12-28 02:41:27Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> diff --git a/libarchive/archive_getdate.c b/libarchive/archive_getdate.c index 39e224cb9010..69eebb0a079f 100644 --- a/libarchive/archive_getdate.c +++ b/libarchive/archive_getdate.c @@ -28,10 +28,6 @@ */ #include "archive_platform.h" -#ifdef __FreeBSD__ -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); -#endif #include <ctype.h> #include <stdio.h> @@ -698,13 +694,9 @@ Convert(time_t Month, time_t Day, time_t Year, 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; @@ -731,15 +723,10 @@ Convert(time_t Month, time_t Day, time_t Year, 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 +742,21 @@ DSTcorrect(time_t Start, time_t Future) 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 +771,15 @@ RelativeDate(time_t Start, time_t zone, int dstmode, { 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 +798,16 @@ RelativeMonth(time_t Start, time_t Timezone, time_t RelMonth) 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 +947,6 @@ __archive_get_date(time_t now, const char *p) 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 +955,26 @@ __archive_get_date(time_t now, const char *p) 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 +1016,10 @@ __archive_get_date(time_t now, const char *p) * 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 diff --git a/libarchive/archive_getdate.h b/libarchive/archive_getdate.h index 900a8f692e98..cfd49ddf7ebb 100644 --- a/libarchive/archive_getdate.h +++ b/libarchive/archive_getdate.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #ifndef ARCHIVE_GETDATE_H_INCLUDED diff --git a/libarchive/archive_hmac.c b/libarchive/archive_hmac.c index 2a9d04c8d8f1..edb3bf5abd42 100644 --- a/libarchive/archive_hmac.c +++ b/libarchive/archive_hmac.c @@ -230,10 +230,28 @@ __hmac_sha1_cleanup(archive_hmac_sha1_ctx *ctx) 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 @@ static void __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; } diff --git a/libarchive/archive_hmac_private.h b/libarchive/archive_hmac_private.h index 13a67d4955a5..d0fda7f9667a 100644 --- a/libarchive/archive_hmac_private.h +++ b/libarchive/archive_hmac_private.h @@ -74,9 +74,18 @@ typedef mbedtls_md_context_t archive_hmac_sha1_ctx; 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 diff --git a/libarchive/archive_match.c b/libarchive/archive_match.c index 04747b1f6663..fc8a4ce8127b 100644 --- a/libarchive/archive_match.c +++ b/libarchive/archive_match.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include <errno.h> diff --git a/libarchive/archive_openssl_evp_private.h b/libarchive/archive_openssl_evp_private.h index ebb06702d0c5..8ac4772808e6 100644 --- a/libarchive/archive_openssl_evp_private.h +++ b/libarchive/archive_openssl_evp_private.h @@ -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) diff --git a/libarchive/archive_options.c b/libarchive/archive_options.c index 6496025a5f6b..92647c9b41c1 100644 --- a/libarchive/archive_options.c +++ b/libarchive/archive_options.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include <errno.h> diff --git a/libarchive/archive_options_private.h b/libarchive/archive_options_private.h index 9a7f8080d2f6..3e49222dabdf 100644 --- a/libarchive/archive_options_private.h +++ b/libarchive/archive_options_private.h @@ -27,8 +27,6 @@ #define ARCHIVE_OPTIONS_PRIVATE_H_INCLUDED #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #include "archive_private.h" typedef int (*option_handler)(struct archive *a, diff --git a/libarchive/archive_pack_dev.c b/libarchive/archive_pack_dev.c index d95444d979f2..3c6209b98405 100644 --- a/libarchive/archive_pack_dev.c +++ b/libarchive/archive_pack_dev.c @@ -33,13 +33,6 @@ #include "archive_platform.h" -#if HAVE_SYS_CDEFS_H -#include <sys/cdefs.h> -#endif -#if !defined(lint) -__RCSID("$NetBSD$"); -#endif /* not lint */ - #ifdef HAVE_LIMITS_H #include <limits.h> #endif diff --git a/libarchive/archive_pathmatch.c b/libarchive/archive_pathmatch.c index 0867a268eefe..19e0889ffe55 100644 --- a/libarchive/archive_pathmatch.c +++ b/libarchive/archive_pathmatch.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_STRING_H #include <string.h> diff --git a/libarchive/archive_pathmatch.h b/libarchive/archive_pathmatch.h index 9995142921e5..3f406ff7435f 100644 --- a/libarchive/archive_pathmatch.h +++ b/libarchive/archive_pathmatch.h @@ -22,8 +22,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #ifndef ARCHIVE_PATHMATCH_H diff --git a/libarchive/archive_platform.h b/libarchive/archive_platform.h index 3426975de349..24e8b50323d0 100644 --- a/libarchive/archive_platform.h +++ b/libarchive/archive_platform.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/archive_platform.h 201090 2009-12-28 02:22:04Z kientzle $ */ /* !!ONLY FOR USE INTERNALLY TO LIBARCHIVE!! */ @@ -87,19 +85,6 @@ * headers as required. */ -/* Get a real definition for __FBSDID or __RCSID if we can */ -#if HAVE_SYS_CDEFS_H -#include <sys/cdefs.h> -#endif - -/* If not, define them so as to avoid dangling semicolons. */ -#ifndef __FBSDID -#define __FBSDID(a) struct _undefined_hack -#endif -#ifndef __RCSID -#define __RCSID(a) struct _undefined_hack -#endif - /* Try to get standard C99-style integer type definitions. */ #if HAVE_INTTYPES_H #include <inttypes.h> @@ -195,8 +180,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 diff --git a/libarchive/archive_platform_acl.h b/libarchive/archive_platform_acl.h index 264e6de375a1..48556f87feed 100644 --- a/libarchive/archive_platform_acl.h +++ b/libarchive/archive_platform_acl.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ /* !!ONLY FOR USE INTERNALLY TO LIBARCHIVE!! */ diff --git a/libarchive/archive_platform_xattr.h b/libarchive/archive_platform_xattr.h index ad4b90ab7b2a..2ae222f61ef8 100644 --- a/libarchive/archive_platform_xattr.h +++ b/libarchive/archive_platform_xattr.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ /* !!ONLY FOR USE INTERNALLY TO LIBARCHIVE!! */ diff --git a/libarchive/archive_private.h b/libarchive/archive_private.h index b2a2cda250eb..0f05169b7d25 100644 --- a/libarchive/archive_private.h +++ b/libarchive/archive_private.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/archive_private.h 201098 2009-12-28 02:58:14Z kientzle $ */ #ifndef ARCHIVE_PRIVATE_H_INCLUDED @@ -40,10 +38,12 @@ #include "archive_string.h" #if defined(__GNUC__) && (__GNUC__ > 2 || \ - (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) -#define __LA_DEAD __attribute__((__noreturn__)) + (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) +#define __LA_NORETURN __attribute__((__noreturn__)) +#elif defined(_MSC_VER) +#define __LA_NORETURN __declspec(noreturn) #else -#define __LA_DEAD +#define __LA_NORETURN #endif #if defined(__GNUC__) && (__GNUC__ > 2 || \ @@ -153,7 +153,7 @@ int __archive_check_magic(struct archive *, unsigned int magic, return ARCHIVE_FATAL; \ } while (0) -void __archive_errx(int retvalue, const char *msg) __LA_DEAD; +__LA_NORETURN void __archive_errx(int retvalue, const char *msg); void __archive_ensure_cloexec_flag(int fd); int __archive_mktemp(const char *tmpdir); diff --git a/libarchive/archive_random.c b/libarchive/archive_random.c index 9d1aa493f0c8..8c48d2d3b5a9 100644 --- a/libarchive/archive_random.c +++ b/libarchive/archive_random.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_STDLIB_H #include <stdlib.h> @@ -51,16 +50,27 @@ __FBSDID("$FreeBSD$"); #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 +85,20 @@ int 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, (ULONG)nbytes, 0); + BCryptCloseAlgorithmProvider(hAlg, 0); + if (!BCRYPT_SUCCESS(status)) + return ARCHIVE_FAILED; + + return ARCHIVE_OK; +# else HCRYPTPROV hProv; BOOL success; @@ -92,6 +116,10 @@ archive_random(void *buf, size_t nbytes) } /* 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 +284,7 @@ arc4_getbyte(void) } 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(); diff --git a/libarchive/archive_read.3 b/libarchive/archive_read.3 index cbedd0a19129..c81c98be2759 100644 --- a/libarchive/archive_read.3 +++ b/libarchive/archive_read.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_READ 3 .Os diff --git a/libarchive/archive_read.c b/libarchive/archive_read.c index 45a38aed02b6..d71fc2b7cc04 100644 --- a/libarchive/archive_read.c +++ b/libarchive/archive_read.c @@ -32,7 +32,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read.c 201157 2009-12-29 05:30:23Z kientzle $"); #ifdef HAVE_ERRNO_H #include <errno.h> diff --git a/libarchive/archive_read_add_passphrase.3 b/libarchive/archive_read_add_passphrase.3 index ca60d4fc62f7..c35cfeb34cd5 100644 --- a/libarchive/archive_read_add_passphrase.3 +++ b/libarchive/archive_read_add_passphrase.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd September 14, 2014 .Dt ARCHIVE_READ_ADD_PASSPHRASE 3 .Os diff --git a/libarchive/archive_read_add_passphrase.c b/libarchive/archive_read_add_passphrase.c index f0b1ab93300f..c67d1df3d1b8 100644 --- a/libarchive/archive_read_add_passphrase.c +++ b/libarchive/archive_read_add_passphrase.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include <errno.h> diff --git a/libarchive/archive_read_append_filter.c b/libarchive/archive_read_append_filter.c index 25dc4b2a2b7f..74eead83e0e7 100644 --- a/libarchive/archive_read_append_filter.c +++ b/libarchive/archive_read_append_filter.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include <errno.h> diff --git a/libarchive/archive_read_data.3 b/libarchive/archive_read_data.3 index 78c0c9000419..694f29264ec1 100644 --- a/libarchive/archive_read_data.3 +++ b/libarchive/archive_read_data.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_READ_DATA 3 .Os diff --git a/libarchive/archive_read_data_into_fd.c b/libarchive/archive_read_data_into_fd.c index b4398f1ecce8..8fd5e12442bc 100644 --- a/libarchive/archive_read_data_into_fd.c +++ b/libarchive/archive_read_data_into_fd.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_data_into_fd.c,v 1.16 2008/05/23 05:01:29 cperciva Exp $"); #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> @@ -95,8 +94,13 @@ archive_read_data_into_fd(struct archive *a, int fd) "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) { diff --git a/libarchive/archive_read_disk.3 b/libarchive/archive_read_disk.3 index 8b568d7b0568..7cde3c232713 100644 --- a/libarchive/archive_read_disk.3 +++ b/libarchive/archive_read_disk.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd April 3, 2017 .Dt ARCHIVE_READ_DISK 3 .Os diff --git a/libarchive/archive_read_disk_entry_from_file.c b/libarchive/archive_read_disk_entry_from_file.c index ab0270bc2850..d89f435554f6 100644 --- a/libarchive/archive_read_disk_entry_from_file.c +++ b/libarchive/archive_read_disk_entry_from_file.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD"); /* This is the tree-walking code for POSIX systems. */ #if !defined(_WIN32) || defined(__CYGWIN__) diff --git a/libarchive/archive_read_disk_posix.c b/libarchive/archive_read_disk_posix.c index 2b39e672b49c..76a4fa44de72 100644 --- a/libarchive/archive_read_disk_posix.c +++ b/libarchive/archive_read_disk_posix.c @@ -29,14 +29,10 @@ #if !defined(_WIN32) || defined(__CYGWIN__) #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #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 +50,8 @@ __FBSDID("$FreeBSD$"); #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. @@ -1671,6 +1669,11 @@ setup_current_filesystem(struct archive_read_disk *a) 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); } @@ -1861,8 +1864,17 @@ setup_current_filesystem(struct archive_read_disk *a) #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); } @@ -1943,6 +1955,11 @@ setup_current_filesystem(struct archive_read_disk *a) #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); } @@ -1997,6 +2014,11 @@ setup_current_filesystem(struct archive_read_disk *a) 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); } @@ -2103,6 +2125,8 @@ tree_push(struct tree *t, const char *path, int filesystem_id, 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) @@ -2542,7 +2566,11 @@ tree_current_lstat(struct tree *t) #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; diff --git a/libarchive/archive_read_disk_private.h b/libarchive/archive_read_disk_private.h index bc8abc15d15c..cf8da99a029b 100644 --- a/libarchive/archive_read_disk_private.h +++ b/libarchive/archive_read_disk_private.h @@ -22,8 +22,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/archive_read_disk_private.h 201105 2009-12-28 03:20:54Z kientzle $ */ #ifndef ARCHIVE_READ_DISK_PRIVATE_H_INCLUDED diff --git a/libarchive/archive_read_disk_set_standard_lookup.c b/libarchive/archive_read_disk_set_standard_lookup.c index c7fd2471ecbe..3512d343f65b 100644 --- a/libarchive/archive_read_disk_set_standard_lookup.c +++ b/libarchive/archive_read_disk_set_standard_lookup.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_disk_set_standard_lookup.c 201109 2009-12-28 03:30:31Z kientzle $"); #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> diff --git a/libarchive/archive_read_disk_windows.c b/libarchive/archive_read_disk_windows.c index ea32e2aac0ac..6b551f4bb0a7 100644 --- a/libarchive/archive_read_disk_windows.c +++ b/libarchive/archive_read_disk_windows.c @@ -25,7 +25,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #if defined(_WIN32) && !defined(__CYGWIN__) @@ -418,8 +417,19 @@ la_linkname_from_pathw(const wchar_t *path, wchar_t **outbuf, int *linktype) 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); @@ -1066,14 +1076,29 @@ next_entry(struct archive_read_disk *a, struct tree *t, 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, @@ -1544,6 +1569,9 @@ close_and_restore_time(HANDLE h, struct tree *t, struct restore_time *rt) { 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); @@ -1557,8 +1585,16 @@ close_and_restore_time(HANDLE h, struct tree *t, struct restore_time *rt) 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); @@ -2043,11 +2079,24 @@ tree_current_file_information(struct tree *t, BY_HANDLE_FILE_INFORMATION *st, 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; @@ -2253,7 +2302,10 @@ archive_read_disk_entry_from_file(struct archive *_a, } 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()); @@ -2275,8 +2327,18 @@ archive_read_disk_entry_from_file(struct archive *_a, } 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, @@ -2337,8 +2399,19 @@ archive_read_disk_entry_from_file(struct archive *_a, 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, @@ -2365,6 +2438,7 @@ archive_read_disk_entry_from_file(struct archive *_a, return (ARCHIVE_OK); } + r = ARCHIVE_OK; if ((a->flags & ARCHIVE_READDISK_NO_SPARSE) == 0) { r = setup_sparse_from_disk(a, entry, h); if (fd < 0) diff --git a/libarchive/archive_read_extract.3 b/libarchive/archive_read_extract.3 index 858f39742553..f3feb5ad551b 100644 --- a/libarchive/archive_read_extract.3 +++ b/libarchive/archive_read_extract.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_READ_EXTRACT 3 .Os diff --git a/libarchive/archive_read_extract.c b/libarchive/archive_read_extract.c index b7973fa8e006..d2159c64cd83 100644 --- a/libarchive/archive_read_extract.c +++ b/libarchive/archive_read_extract.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_extract.c,v 1.61 2008/05/26 17:00:22 kientzle Exp $"); #ifdef HAVE_ERRNO_H #include <errno.h> diff --git a/libarchive/archive_read_extract2.c b/libarchive/archive_read_extract2.c index 4febd8ce056f..e11cac1590e9 100644 --- a/libarchive/archive_read_extract2.c +++ b/libarchive/archive_read_extract2.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_extract.c,v 1.61 2008/05/26 17:00:22 kientzle Exp $"); #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> diff --git a/libarchive/archive_read_filter.3 b/libarchive/archive_read_filter.3 index 4f5c3518a6ca..72ff240fd393 100644 --- a/libarchive/archive_read_filter.3 +++ b/libarchive/archive_read_filter.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd June 9, 2020 .Dt ARCHIVE_READ_FILTER 3 .Os diff --git a/libarchive/archive_read_format.3 b/libarchive/archive_read_format.3 index f3804ce3796a..990293c83131 100644 --- a/libarchive/archive_read_format.3 +++ b/libarchive/archive_read_format.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_READ_FORMAT 3 .Os diff --git a/libarchive/archive_read_free.3 b/libarchive/archive_read_free.3 index 8371c3a0c60c..7dc121fcaea3 100644 --- a/libarchive/archive_read_free.3 +++ b/libarchive/archive_read_free.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_READ_FREE 3 .Os diff --git a/libarchive/archive_read_header.3 b/libarchive/archive_read_header.3 index 1e97f3a27507..024dc41da831 100644 --- a/libarchive/archive_read_header.3 +++ b/libarchive/archive_read_header.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_READ_HEADER 3 .Os diff --git a/libarchive/archive_read_new.3 b/libarchive/archive_read_new.3 index 8bb6b848b06a..c2b5cddef098 100644 --- a/libarchive/archive_read_new.3 +++ b/libarchive/archive_read_new.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_READ_NEW 3 .Os diff --git a/libarchive/archive_read_open.3 b/libarchive/archive_read_open.3 index f67677823bd0..081b7114bea6 100644 --- a/libarchive/archive_read_open.3 +++ b/libarchive/archive_read_open.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_READ_OPEN 3 .Os diff --git a/libarchive/archive_read_open_fd.c b/libarchive/archive_read_open_fd.c index f59cd07fe6c0..3ee2423d300e 100644 --- a/libarchive/archive_read_open_fd.c +++ b/libarchive/archive_read_open_fd.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_open_fd.c 201103 2009-12-28 03:13:49Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> diff --git a/libarchive/archive_read_open_file.c b/libarchive/archive_read_open_file.c index 101dae6cd9e3..dcf1d4698569 100644 --- a/libarchive/archive_read_open_file.c +++ b/libarchive/archive_read_open_file.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_open_file.c 201093 2009-12-28 02:28:44Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> @@ -154,10 +153,10 @@ file_skip(struct archive *a, void *client_data, int64_t request) #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 diff --git a/libarchive/archive_read_open_filename.c b/libarchive/archive_read_open_filename.c index 561289b694be..dd2e16022844 100644 --- a/libarchive/archive_read_open_filename.c +++ b/libarchive/archive_read_open_filename.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_open_filename.c 201093 2009-12-28 02:28:44Z kientzle $"); #ifdef HAVE_SYS_IOCTL_H #include <sys/ioctl.h> @@ -155,55 +154,73 @@ no_memory: return (ARCHIVE_FATAL); } +/* + * This function is an implementation detail of archive_read_open_filename_w, + * which is exposed as a separate API on Windows. + */ +#if !defined(_WIN32) || defined(__CYGWIN__) +static +#endif int -archive_read_open_filename_w(struct archive *a, const wchar_t *wfilename, +archive_read_open_filenames_w(struct archive *a, const wchar_t **wfilenames, size_t block_size) { - struct read_file_data *mine = (struct read_file_data *)calloc(1, - sizeof(*mine) + wcslen(wfilename) * sizeof(wchar_t)); - if (!mine) + struct read_file_data *mine; + const wchar_t *wfilename = NULL; + if (wfilenames) + wfilename = *(wfilenames++); + + archive_clear_error(a); + do { - archive_set_error(a, ENOMEM, "No memory"); - return (ARCHIVE_FATAL); - } - mine->fd = -1; - mine->block_size = block_size; + if (wfilename == NULL) + wfilename = L""; + mine = (struct read_file_data *)calloc(1, + sizeof(*mine) + wcslen(wfilename) * sizeof(wchar_t)); + if (mine == NULL) + goto no_memory; + mine->block_size = block_size; + mine->fd = -1; - if (wfilename == NULL || wfilename[0] == L'\0') { - mine->filename_type = FNT_STDIN; - } else { + if (wfilename == NULL || wfilename[0] == L'\0') { + mine->filename_type = FNT_STDIN; + } else { #if defined(_WIN32) && !defined(__CYGWIN__) - mine->filename_type = FNT_WCS; - wcscpy(mine->filename.w, wfilename); + mine->filename_type = FNT_WCS; + wcscpy(mine->filename.w, wfilename); #else - /* - * POSIX system does not support a wchar_t interface for - * open() system call, so we have to translate a wchar_t - * filename to multi-byte one and use it. - */ - struct archive_string fn; - - archive_string_init(&fn); - if (archive_string_append_from_wcs(&fn, wfilename, - wcslen(wfilename)) != 0) { - if (errno == ENOMEM) - archive_set_error(a, errno, - "Can't allocate memory"); - else - archive_set_error(a, EINVAL, - "Failed to convert a wide-character" - " filename to a multi-byte filename"); + /* + * POSIX system does not support a wchar_t interface for + * open() system call, so we have to translate a wchar_t + * filename to multi-byte one and use it. + */ + struct archive_string fn; + + archive_string_init(&fn); + if (archive_string_append_from_wcs(&fn, wfilename, + wcslen(wfilename)) != 0) { + if (errno == ENOMEM) + archive_set_error(a, errno, + "Can't allocate memory"); + else + archive_set_error(a, EINVAL, + "Failed to convert a wide-character" + " filename to a multi-byte filename"); + archive_string_free(&fn); + free(mine); + return (ARCHIVE_FATAL); + } + mine->filename_type = FNT_MBS; + strcpy(mine->filename.m, fn.s); archive_string_free(&fn); - free(mine); - return (ARCHIVE_FATAL); - } - mine->filename_type = FNT_MBS; - strcpy(mine->filename.m, fn.s); - archive_string_free(&fn); #endif - } - if (archive_read_append_callback_data(a, mine) != (ARCHIVE_OK)) - return (ARCHIVE_FATAL); + } + if (archive_read_append_callback_data(a, mine) != (ARCHIVE_OK)) + return (ARCHIVE_FATAL); + if (wfilenames == NULL) + break; + wfilename = *(wfilenames++); + } while (wfilename != NULL && wfilename[0] != '\0'); archive_read_set_open_callback(a, file_open); archive_read_set_read_callback(a, file_read); archive_read_set_skip_callback(a, file_skip); @@ -212,6 +229,19 @@ archive_read_open_filename_w(struct archive *a, const wchar_t *wfilename, archive_read_set_seek_callback(a, file_seek); return (archive_read_open1(a)); +no_memory: + archive_set_error(a, ENOMEM, "No memory"); + return (ARCHIVE_FATAL); +} + +int +archive_read_open_filename_w(struct archive *a, const wchar_t *wfilename, + size_t block_size) +{ + const wchar_t *wfilenames[2]; + wfilenames[0] = wfilename; + wfilenames[1] = NULL; + return archive_read_open_filenames_w(a, wfilenames, block_size); } static int diff --git a/libarchive/archive_read_open_memory.c b/libarchive/archive_read_open_memory.c index 311be47046a2..a057ce643890 100644 --- a/libarchive/archive_read_open_memory.c +++ b/libarchive/archive_read_open_memory.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_open_memory.c,v 1.6 2007/07/06 15:51:59 kientzle Exp $"); #include <errno.h> #include <stdlib.h> diff --git a/libarchive/archive_read_private.h b/libarchive/archive_read_private.h index 383405d52908..0c374f487eba 100644 --- a/libarchive/archive_read_private.h +++ b/libarchive/archive_read_private.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/archive_read_private.h 201088 2009-12-28 02:18:55Z kientzle $ */ #ifndef ARCHIVE_READ_PRIVATE_H_INCLUDED diff --git a/libarchive/archive_read_set_format.c b/libarchive/archive_read_set_format.c index 796dcdcced11..c74361b20c13 100644 --- a/libarchive/archive_read_set_format.c +++ b/libarchive/archive_read_set_format.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include <errno.h> diff --git a/libarchive/archive_read_set_options.3 b/libarchive/archive_read_set_options.3 index b2db4cbcb893..ef18dfaa271a 100644 --- a/libarchive/archive_read_set_options.3 +++ b/libarchive/archive_read_set_options.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd January 31, 2020 .Dt ARCHIVE_READ_OPTIONS 3 .Os @@ -255,6 +253,27 @@ have been concatenated together. Without this option, only the contents of the first concatenated archive would be read. .El +.It Format zip +.Bl -tag -compact -width indent +.It Cm compat-2x +Libarchive 2.x incorrectly encoded Unicode filenames on +some platforms. +This option mimics the libarchive 2.x filename handling +so that such archives can be read correctly. +.It Cm hdrcharset +The value is used as a character set name that will be +used when translating file names. +.It Cm ignorecrc32 +Skip the CRC32 check. +Mostly used for testing. +.It Cm mac-ext +Support Mac OS metadata extension that records data in special +files beginning with a period and underscore. +Defaults to enabled on Mac OS, disabled on other platforms. +Use +.Cm !mac-ext +to disable. +.El .El .\" .Sh ERRORS diff --git a/libarchive/archive_read_set_options.c b/libarchive/archive_read_set_options.c index 2bd9b811eaf4..c0a4b420734e 100644 --- a/libarchive/archive_read_set_options.c +++ b/libarchive/archive_read_set_options.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #include "archive_read_private.h" #include "archive_options_private.h" diff --git a/libarchive/archive_read_support_filter_all.c b/libarchive/archive_read_support_filter_all.c index edb508c1dfd8..cb46d120d102 100644 --- a/libarchive/archive_read_support_filter_all.c +++ b/libarchive/archive_read_support_filter_all.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #include "archive.h" #include "archive_private.h" diff --git a/libarchive/archive_read_support_filter_by_code.c b/libarchive/archive_read_support_filter_by_code.c index 94c4af695f4d..ce50d8cdf884 100644 --- a/libarchive/archive_read_support_filter_by_code.c +++ b/libarchive/archive_read_support_filter_by_code.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #include "archive.h" #include "archive_private.h" diff --git a/libarchive/archive_read_support_filter_bzip2.c b/libarchive/archive_read_support_filter_bzip2.c index 793d605c8725..0392d450a203 100644 --- a/libarchive/archive_read_support_filter_bzip2.c +++ b/libarchive/archive_read_support_filter_bzip2.c @@ -25,8 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_ERRNO_H #include <errno.h> #endif @@ -192,7 +190,7 @@ bzip2_reader_init(struct archive_read_filter *self) self->code = ARCHIVE_FILTER_BZIP2; self->name = "bzip2"; - state = (struct private_data *)calloc(sizeof(*state), 1); + state = (struct private_data *)calloc(1, sizeof(*state)); out_block = (unsigned char *)malloc(out_block_size); if (state == NULL || out_block == NULL) { archive_set_error(&self->archive->archive, ENOMEM, @@ -230,7 +228,7 @@ bzip2_filter_read(struct archive_read_filter *self, const void **p) /* 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 (;;) { @@ -288,7 +286,7 @@ bzip2_filter_read(struct archive_read_filter *self, const void **p) 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; diff --git a/libarchive/archive_read_support_filter_compress.c b/libarchive/archive_read_support_filter_compress.c index 05b80a576ac1..29ae72abef71 100644 --- a/libarchive/archive_read_support_filter_compress.c +++ b/libarchive/archive_read_support_filter_compress.c @@ -64,7 +64,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include <errno.h> @@ -218,7 +217,7 @@ compress_bidder_init(struct archive_read_filter *self) self->code = ARCHIVE_FILTER_COMPRESS; self->name = "compress (.Z)"; - state = (struct private_data *)calloc(sizeof(*state), 1); + state = (struct private_data *)calloc(1, sizeof(*state)); out_block = malloc(out_block_size); if (state == NULL || out_block == NULL) { free(out_block); diff --git a/libarchive/archive_read_support_filter_grzip.c b/libarchive/archive_read_support_filter_grzip.c index d4d1737cd97e..15b6757cb90c 100644 --- a/libarchive/archive_read_support_filter_grzip.c +++ b/libarchive/archive_read_support_filter_grzip.c @@ -25,9 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - - #ifdef HAVE_ERRNO_H #include <errno.h> #endif diff --git a/libarchive/archive_read_support_filter_gzip.c b/libarchive/archive_read_support_filter_gzip.c index 4135a6361802..152ea9bdbd7c 100644 --- a/libarchive/archive_read_support_filter_gzip.c +++ b/libarchive/archive_read_support_filter_gzip.c @@ -25,9 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - - #ifdef HAVE_ERRNO_H #include <errno.h> #endif @@ -310,7 +307,7 @@ gzip_bidder_init(struct archive_read_filter *self) self->code = ARCHIVE_FILTER_GZIP; self->name = "gzip"; - state = (struct private_data *)calloc(sizeof(*state), 1); + state = (struct private_data *)calloc(1, sizeof(*state)); out_block = (unsigned char *)malloc(out_block_size); if (state == NULL || out_block == NULL) { free(out_block); diff --git a/libarchive/archive_read_support_filter_lrzip.c b/libarchive/archive_read_support_filter_lrzip.c index a2389894f1d8..a562d538ed81 100644 --- a/libarchive/archive_read_support_filter_lrzip.c +++ b/libarchive/archive_read_support_filter_lrzip.c @@ -25,9 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - - #ifdef HAVE_ERRNO_H #include <errno.h> #endif diff --git a/libarchive/archive_read_support_filter_lz4.c b/libarchive/archive_read_support_filter_lz4.c index ae0b08003f80..bccf4fb8f82d 100644 --- a/libarchive/archive_read_support_filter_lz4.c +++ b/libarchive/archive_read_support_filter_lz4.c @@ -25,8 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_ERRNO_H #include <errno.h> #endif @@ -225,7 +223,7 @@ lz4_reader_init(struct archive_read_filter *self) self->code = ARCHIVE_FILTER_LZ4; self->name = "lz4"; - state = (struct private_data *)calloc(sizeof(*state), 1); + state = (struct private_data *)calloc(1, sizeof(*state)); if (state == NULL) { archive_set_error(&self->archive->archive, ENOMEM, "Can't allocate data for lz4 decompression"); @@ -449,8 +447,10 @@ lz4_filter_read_descriptor(struct archive_read_filter *self) chsum = __archive_xxhash.XXH32(read_buf, (int)descriptor_bytes -1, 0); chsum = (chsum >> 8) & 0xff; chsum_verifier = read_buf[descriptor_bytes-1] & 0xff; +#ifndef DONT_FAIL_ON_CRC_ERROR if (chsum != chsum_verifier) goto malformed_error; +#endif __archive_read_filter_consume(self->upstream, descriptor_bytes); @@ -520,8 +520,10 @@ lz4_filter_read_data_block(struct archive_read_filter *self, const void **p) read_buf + 4, (int)compressed_size, 0); unsigned int chsum_block = archive_le32dec(read_buf + 4 + compressed_size); +#ifndef DONT_FAIL_ON_CRC_ERROR if (chsum != chsum_block) goto malformed_error; +#endif } @@ -580,7 +582,7 @@ lz4_filter_read_data_block(struct archive_read_filter *self, const void **p) 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, @@ -652,10 +654,12 @@ lz4_filter_read_default_stream(struct archive_read_filter *self, const void **p) 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, diff --git a/libarchive/archive_read_support_filter_lzop.c b/libarchive/archive_read_support_filter_lzop.c index afd2d4d0c49a..e971063dc68f 100644 --- a/libarchive/archive_read_support_filter_lzop.c +++ b/libarchive/archive_read_support_filter_lzop.c @@ -26,8 +26,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_UNISTD_H #include <unistd.h> #endif @@ -187,7 +185,7 @@ lzop_bidder_init(struct archive_read_filter *self) self->code = ARCHIVE_FILTER_LZOP; self->name = "lzop"; - state = (struct read_lzop *)calloc(sizeof(*state), 1); + state = (struct read_lzop *)calloc(1, sizeof(*state)); if (state == NULL) { archive_set_error(&self->archive->archive, ENOMEM, "Can't allocate data for lzop decompression"); @@ -282,8 +280,10 @@ consume_header(struct archive_read_filter *self) checksum = crc32(crc32(0, NULL, 0), p, len); else checksum = adler32(adler32(0, NULL, 0), p, len); +#ifndef DONT_FAIL_ON_CRC_ERROR if (archive_be32dec(p + len) != checksum) goto corrupted; +#endif __archive_read_filter_consume(self->upstream, len + 4); if (flags & EXTRA_FIELD) { /* Skip extra field */ diff --git a/libarchive/archive_read_support_filter_none.c b/libarchive/archive_read_support_filter_none.c index 95e5cfdb15dc..9eb8e54ae960 100644 --- a/libarchive/archive_read_support_filter_none.c +++ b/libarchive/archive_read_support_filter_none.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #include "archive.h" #include "archive_private.h" diff --git a/libarchive/archive_read_support_filter_program.c b/libarchive/archive_read_support_filter_program.c index 885b2c2056e6..0482c57c18eb 100644 --- a/libarchive/archive_read_support_filter_program.c +++ b/libarchive/archive_read_support_filter_program.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_WAIT_H # include <sys/wait.h> diff --git a/libarchive/archive_read_support_filter_rpm.c b/libarchive/archive_read_support_filter_rpm.c index 67a979cd78f6..87e9f2ec1939 100644 --- a/libarchive/archive_read_support_filter_rpm.c +++ b/libarchive/archive_read_support_filter_rpm.c @@ -141,7 +141,7 @@ rpm_bidder_init(struct archive_read_filter *self) self->code = ARCHIVE_FILTER_RPM; self->name = "rpm"; - rpm = (struct rpm *)calloc(sizeof(*rpm), 1); + rpm = (struct rpm *)calloc(1, sizeof(*rpm)); if (rpm == NULL) { archive_set_error(&self->archive->archive, ENOMEM, "Can't allocate data for rpm"); diff --git a/libarchive/archive_read_support_filter_uu.c b/libarchive/archive_read_support_filter_uu.c index 209b2a1593a0..689ceb8f8760 100644 --- a/libarchive/archive_read_support_filter_uu.c +++ b/libarchive/archive_read_support_filter_uu.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include <errno.h> @@ -37,6 +36,7 @@ __FBSDID("$FreeBSD$"); #endif #include "archive.h" +#include "archive_entry.h" #include "archive_private.h" #include "archive_read_private.h" @@ -57,12 +57,17 @@ struct uudecode { #define ST_UUEND 2 #define ST_READ_BASE64 3 #define ST_IGNORE 4 + mode_t mode; + int mode_set; + char *name; }; static int uudecode_bidder_bid(struct archive_read_filter_bidder *, struct archive_read_filter *filter); static int uudecode_bidder_init(struct archive_read_filter *); +static int uudecode_read_header(struct archive_read_filter *, + struct archive_entry *entry); static ssize_t uudecode_filter_read(struct archive_read_filter *, const void **); static int uudecode_filter_close(struct archive_read_filter *); @@ -355,6 +360,7 @@ static const struct archive_read_filter_vtable uudecode_reader_vtable = { .read = uudecode_filter_read, .close = uudecode_filter_close, + .read_header = uudecode_read_header }; static int @@ -367,7 +373,7 @@ uudecode_bidder_init(struct archive_read_filter *self) self->code = ARCHIVE_FILTER_UU; self->name = "uu"; - uudecode = (struct uudecode *)calloc(sizeof(*uudecode), 1); + uudecode = (struct uudecode *)calloc(1, sizeof(*uudecode)); out_buff = malloc(OUT_BUFF_SIZE); in_buff = malloc(IN_BUFF_SIZE); if (uudecode == NULL || out_buff == NULL || in_buff == NULL) { @@ -385,6 +391,8 @@ uudecode_bidder_init(struct archive_read_filter *self) uudecode->in_allocated = IN_BUFF_SIZE; uudecode->out_buff = out_buff; uudecode->state = ST_FIND_HEAD; + uudecode->mode_set = 0; + uudecode->name = NULL; self->vtable = &uudecode_reader_vtable; return (ARCHIVE_OK); @@ -430,6 +438,22 @@ ensure_in_buff_size(struct archive_read_filter *self, return (ARCHIVE_OK); } +static int +uudecode_read_header(struct archive_read_filter *self, struct archive_entry *entry) +{ + + struct uudecode *uudecode; + uudecode = (struct uudecode *)self->data; + + if (uudecode->mode_set != 0) + archive_entry_set_mode(entry, S_IFREG | uudecode->mode); + + if (uudecode->name != NULL) + archive_entry_set_pathname(entry, uudecode->name); + + return (ARCHIVE_OK); +} + static ssize_t uudecode_filter_read(struct archive_read_filter *self, const void **buff) { @@ -439,7 +463,7 @@ uudecode_filter_read(struct archive_read_filter *self, const void **buff) ssize_t avail_in, ravail; ssize_t used; ssize_t total; - ssize_t len, llen, nl; + ssize_t len, llen, nl, namelen; uudecode = (struct uudecode *)self->data; @@ -544,6 +568,28 @@ read_more: uudecode->state = ST_READ_UU; else uudecode->state = ST_READ_BASE64; + uudecode->mode = (mode_t)( + ((int)(b[l] - '0') * 64) + + ((int)(b[l+1] - '0') * 8) + + (int)(b[l+2] - '0')); + uudecode->mode_set = 1; + namelen = len - nl - 4 - l; + if (namelen > 1) { + if (uudecode->name != NULL) + free(uudecode->name); + uudecode->name = malloc(namelen + 1); + if (uudecode->name == NULL) { + archive_set_error( + &self->archive->archive, + ENOMEM, + "Can't allocate data for uudecode"); + return (ARCHIVE_FATAL); + } + strncpy(uudecode->name, + (const char *)(b + l + 4), + namelen); + uudecode->name[namelen] = '\0'; + } } break; case ST_READ_UU: @@ -676,6 +722,7 @@ uudecode_filter_close(struct archive_read_filter *self) uudecode = (struct uudecode *)self->data; free(uudecode->in_buff); free(uudecode->out_buff); + free(uudecode->name); free(uudecode); return (ARCHIVE_OK); diff --git a/libarchive/archive_read_support_filter_xz.c b/libarchive/archive_read_support_filter_xz.c index 32ae0be92e0e..e55fb00edb34 100644 --- a/libarchive/archive_read_support_filter_xz.c +++ b/libarchive/archive_read_support_filter_xz.c @@ -26,8 +26,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_ERRNO_H #include <errno.h> #endif @@ -478,7 +476,7 @@ xz_lzma_bidder_init(struct archive_read_filter *self) struct private_data *state; int ret; - state = (struct private_data *)calloc(sizeof(*state), 1); + state = (struct private_data *)calloc(1, sizeof(*state)); out_block = (unsigned char *)malloc(out_block_size); if (state == NULL || out_block == NULL) { archive_set_error(&self->archive->archive, ENOMEM, @@ -612,9 +610,11 @@ lzip_tail(struct archive_read_filter *self) /* 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 */ @@ -654,13 +654,16 @@ xz_filter_read(struct archive_read_filter *self, const void **p) struct private_data *state; size_t decompressed; ssize_t avail_in; + int64_t member_in; int ret; state = (struct private_data *)self->data; + redo: /* Empty our output buffer. */ state->stream.next_out = state->out_block; state->stream.avail_out = state->out_block_size; + member_in = state->member_in; /* Try to fill the output buffer. */ while (state->stream.avail_out > 0 && !state->eof) { @@ -705,9 +708,18 @@ xz_filter_read(struct archive_read_filter *self, const void **p) decompressed = state->stream.next_out - state->out_block; state->total_out += decompressed; state->member_out += decompressed; - if (decompressed == 0) + if (decompressed == 0) { + if (member_in != state->member_in && + self->code == ARCHIVE_FILTER_LZIP && + state->eof) { + ret = lzip_tail(self); + if (ret != ARCHIVE_OK) + return (ret); + if (!state->eof) + goto redo; + } *p = NULL; - else { + } else { *p = state->out_block; if (self->code == ARCHIVE_FILTER_LZIP) { state->crc32 = lzma_crc32(state->out_block, diff --git a/libarchive/archive_read_support_filter_zstd.c b/libarchive/archive_read_support_filter_zstd.c index 39f25f1bf88e..f7326d2430d3 100644 --- a/libarchive/archive_read_support_filter_zstd.c +++ b/libarchive/archive_read_support_filter_zstd.c @@ -25,8 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_ERRNO_H #include <errno.h> #endif @@ -115,9 +113,9 @@ zstd_bidder_bid(struct archive_read_filter_bidder *self, 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 */ @@ -170,14 +168,14 @@ static int 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; self->code = ARCHIVE_FILTER_ZSTD; self->name = "zstd"; - state = (struct private_data *)calloc(sizeof(*state), 1); + state = (struct private_data *)calloc(1, sizeof(*state)); out_block = (unsigned char *)malloc(out_block_size); dstream = ZSTD_createDStream(); @@ -211,6 +209,7 @@ zstd_filter_read(struct archive_read_filter *self, const void **p) ssize_t avail_in; ZSTD_outBuffer out; ZSTD_inBuffer in; + size_t ret; state = (struct private_data *)self->data; @@ -219,7 +218,7 @@ zstd_filter_read(struct archive_read_filter *self, const void **p) /* 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, @@ -249,8 +248,7 @@ zstd_filter_read(struct archive_read_filter *self, const void **p) 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, diff --git a/libarchive/archive_read_support_format_7zip.c b/libarchive/archive_read_support_format_7zip.c index 564ba514a4b1..92495e628f9a 100644 --- a/libarchive/archive_read_support_format_7zip.c +++ b/libarchive/archive_read_support_format_7zip.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include <errno.h> @@ -41,6 +40,9 @@ __FBSDID("$FreeBSD$"); #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 +82,11 @@ __FBSDID("$FreeBSD$"); #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. */ @@ -110,6 +115,30 @@ __FBSDID("$FreeBSD$"); #define kEncodedHeader 0x17 #define kDummy 0x19 +// Check that some windows file attribute constants are defined. +// Reference: https://learn.microsoft.com/en-us/windows/win32/fileio/file-attribute-constants +#ifndef FILE_ATTRIBUTE_READONLY +#define FILE_ATTRIBUTE_READONLY 0x00000001 +#endif + +#ifndef FILE_ATTRIBUTE_HIDDEN +#define FILE_ATTRIBUTE_HIDDEN 0x00000002 +#endif + +#ifndef FILE_ATTRIBUTE_SYSTEM +#define FILE_ATTRIBUTE_SYSTEM 0x00000004 +#endif + +#ifndef FILE_ATTRIBUTE_DIRECTORY +#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 +#endif + +// This value is defined in 7zip with the comment "trick for Unix". +// +// 7z archives created on unix have this bit set in the high 16 bits of +// the attr field along with the unix permissions. +#define FILE_ATTRIBUTE_UNIX_EXTENSION 0x8000 + struct _7z_digests { unsigned char *defineds; uint32_t *digests; @@ -278,6 +307,11 @@ struct _7zip { 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; @@ -397,6 +431,9 @@ static int setup_decode_folder(struct archive_read *, struct _7z_folder *, 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); @@ -725,6 +762,37 @@ archive_read_format_7zip_read_header(struct archive_read *a, archive_entry_set_size(entry, 0); } + // These attributes are supported by the windows implementation of archive_write_disk. + const int supported_attrs = FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM; + + if (zip_entry->attr & supported_attrs) { + char *fflags_text, *ptr; + /* allocate for "rdonly,hidden,system," */ + fflags_text = malloc(22 * sizeof(char)); + if (fflags_text != NULL) { + ptr = fflags_text; + if (zip_entry->attr & FILE_ATTRIBUTE_READONLY) { + strcpy(ptr, "rdonly,"); + ptr = ptr + 7; + } + if (zip_entry->attr & FILE_ATTRIBUTE_HIDDEN) { + strcpy(ptr, "hidden,"); + ptr = ptr + 7; + } + if (zip_entry->attr & FILE_ATTRIBUTE_SYSTEM) { + strcpy(ptr, "system,"); + ptr = ptr + 7; + } + if (ptr > fflags_text) { + /* Delete trailing comma */ + *(ptr - 1) = '\0'; + archive_entry_copy_fflags_text(entry, + fflags_text); + } + free(fflags_text); + } + } + /* If there's no body, force read_data() to return EOF immediately. */ if (zip->entry_bytes_remaining < 1) zip->end_of_entry = 1; @@ -776,7 +844,7 @@ archive_read_format_7zip_read_header(struct archive_read *a, } /* 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); @@ -1027,10 +1095,13 @@ init_decompression(struct archive_read *a, struct _7zip *zip, 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", @@ -1041,6 +1112,8 @@ init_decompression(struct archive_read *a, struct _7zip *zip, zip->bcj_state = 0; if (coder2->codec == _7Z_X86) x86_Init(zip); + else if (coder2->codec == _7Z_ARM) + arm_Init(zip); } break; default: @@ -1137,6 +1210,12 @@ init_decompression(struct archive_read *a, struct _7zip *zip, 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++; @@ -1222,6 +1301,22 @@ init_decompression(struct archive_read *a, struct _7zip *zip, "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) @@ -1292,6 +1387,7 @@ init_decompression(struct archive_read *a, struct _7zip *zip, case _7Z_IA64: case _7Z_ARM: case _7Z_ARMTHUMB: + case _7Z_ARM64: case _7Z_SPARC: case _7Z_DELTA: archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, @@ -1436,9 +1532,9 @@ decompress(struct archive_read *a, struct _7zip *zip, #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. */ @@ -1488,6 +1584,22 @@ decompress(struct archive_read *a, struct _7zip *zip, 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; @@ -1572,16 +1684,23 @@ decompress(struct archive_read *a, struct _7zip *zip, /* * 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); + } } /* @@ -2602,6 +2721,28 @@ read_Header(struct archive_read *a, struct _7z_header_info *h, entries[i].flg |= HAS_STREAM; /* The high 16 bits of attributes is a posix file mode. */ entries[i].mode = entries[i].attr >> 16; + + if (!(entries[i].attr & FILE_ATTRIBUTE_UNIX_EXTENSION)) { + // Only windows permissions specified for this entry. Translate to + // reasonable corresponding unix permissions. + + if (entries[i].attr & FILE_ATTRIBUTE_DIRECTORY) { + if (entries[i].attr & FILE_ATTRIBUTE_READONLY) { + // Read-only directory. + entries[i].mode = AE_IFDIR | 0555; + } else { + // Read-write directory. + entries[i].mode = AE_IFDIR | 0755; + } + } else if (entries[i].attr & FILE_ATTRIBUTE_READONLY) { + // Readonly file. + entries[i].mode = AE_IFREG | 0444; + } else { + // Assume read-write file. + entries[i].mode = AE_IFREG | 0644; + } + } + if (entries[i].flg & HAS_STREAM) { if ((size_t)sindex >= si->ss.unpack_streams) return (-1); @@ -2642,7 +2783,7 @@ read_Header(struct archive_read *a, struct _7z_header_info *h, } entries[i].ssIndex = -1; } - if (entries[i].attr & 0x01) + if (entries[i].attr & FILE_ATTRIBUTE_READONLY) entries[i].mode &= ~0222;/* Read only. */ if ((entries[i].flg & HAS_STREAM) == 0 && indexInFolder == 0) { @@ -2857,8 +2998,10 @@ slurp_central_directory(struct archive_read *a, struct _7zip *zip, /* 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); @@ -2907,9 +3050,11 @@ slurp_central_directory(struct archive_read *a, struct _7zip *zip, /* Check the EncodedHeader CRC.*/ if (r == 0 && zip->header_crc32 != next_header_crc) { +#ifndef DONT_FAIL_ON_CRC_ERROR archive_set_error(&a->archive, -1, "Damaged 7-Zip archive"); r = -1; +#endif } if (r == 0) { if (zip->si.ci.folders[0].digest_defined) @@ -2960,9 +3105,11 @@ slurp_central_directory(struct archive_read *a, struct _7zip *zip, /* 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: @@ -3721,6 +3868,116 @@ x86_Convert(struct _7zip *zip, uint8_t *data, size_t size) 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; +} + /* * Brought from LZMA SDK. * diff --git a/libarchive/archive_read_support_format_all.c b/libarchive/archive_read_support_format_all.c index dea558bbfcc2..5a4e1ab675a5 100644 --- a/libarchive/archive_read_support_format_all.c +++ b/libarchive/archive_read_support_format_all.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_support_format_all.c 174991 2007-12-30 04:58:22Z kientzle $"); #include "archive.h" #include "archive_private.h" diff --git a/libarchive/archive_read_support_format_ar.c b/libarchive/archive_read_support_format_ar.c index 296b7db04114..ca8effb0b0ee 100644 --- a/libarchive/archive_read_support_format_ar.c +++ b/libarchive/archive_read_support_format_ar.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_support_format_ar.c 201101 2009-12-28 03:06:27Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> diff --git a/libarchive/archive_read_support_format_by_code.c b/libarchive/archive_read_support_format_by_code.c index 89e96f1f591f..7ed045f5688c 100644 --- a/libarchive/archive_read_support_format_by_code.c +++ b/libarchive/archive_read_support_format_by_code.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include <errno.h> diff --git a/libarchive/archive_read_support_format_cab.c b/libarchive/archive_read_support_format_cab.c index 950f3d254de6..3b552a84de12 100644 --- a/libarchive/archive_read_support_format_cab.c +++ b/libarchive/archive_read_support_format_cab.c @@ -996,7 +996,7 @@ archive_read_format_cab_read_header(struct archive_read *a, 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 @@ cab_checksum_update(struct archive_read *a, size_t bytes) } 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 @@ cab_checksum_finish(struct archive_read *a) 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 @@ lzx_br_fillup(struct lzx_stream *strm, struct lzx_br *br) (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; diff --git a/libarchive/archive_read_support_format_cpio.c b/libarchive/archive_read_support_format_cpio.c index 6b8ae33a480b..dcff23f694a7 100644 --- a/libarchive/archive_read_support_format_cpio.c +++ b/libarchive/archive_read_support_format_cpio.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_support_format_cpio.c 201163 2009-12-29 05:50:34Z kientzle $"); #ifdef HAVE_ERRNO_H #include <errno.h> @@ -441,7 +440,7 @@ archive_read_format_cpio_read_header(struct archive_read *a, /* 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 +984,14 @@ archive_read_format_cpio_cleanup(struct archive_read *a) 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])); } /* diff --git a/libarchive/archive_read_support_format_empty.c b/libarchive/archive_read_support_format_empty.c index 53fb6cc4743b..0dccd9d9baba 100644 --- a/libarchive/archive_read_support_format_empty.c +++ b/libarchive/archive_read_support_format_empty.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_support_format_empty.c 191524 2009-04-26 18:24:14Z kientzle $"); #include "archive.h" #include "archive_entry.h" diff --git a/libarchive/archive_read_support_format_iso9660.c b/libarchive/archive_read_support_format_iso9660.c index cd7f92f464d6..db5cdb67f1cf 100644 --- a/libarchive/archive_read_support_format_iso9660.c +++ b/libarchive/archive_read_support_format_iso9660.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_support_format_iso9660.c 201246 2009-12-30 05:30:35Z kientzle $"); #ifdef HAVE_ERRNO_H #include <errno.h> @@ -1757,7 +1756,7 @@ parse_file_info(struct archive_read *a, struct file_info *parent, 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; @@ -1901,7 +1900,7 @@ parse_file_info(struct archive_read *a, struct file_info *parent, * 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, @@ -1955,7 +1954,7 @@ parse_file_info(struct archive_read *a, struct file_info *parent, * 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) { @@ -2747,7 +2746,7 @@ next_cache_entry(struct archive_read *a, struct iso9660 *iso9660, * 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. */ @@ -3015,6 +3014,11 @@ heap_add_entry(struct archive_read *a, struct heap_queue *heap, uint64_t file_key, parent_key; int hole, parent; + /* Reserve 16 bits for possible key collisions (needed for linked items) */ + /* For ISO files with more than 65535 entries, reordering will still occur */ + key <<= 16; + key += heap->used & 0xFFFF; + /* Expand our pending files list as necessary. */ if (heap->used >= heap->allocated) { struct file_info **new_pending_files; @@ -3180,11 +3184,11 @@ isodate17(const unsigned char *v) 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. */ diff --git a/libarchive/archive_read_support_format_lha.c b/libarchive/archive_read_support_format_lha.c index bff0f01f41cf..1c64b2900b8e 100644 --- a/libarchive/archive_read_support_format_lha.c +++ b/libarchive/archive_read_support_format_lha.c @@ -739,7 +739,7 @@ archive_read_format_lha_read_header(struct archive_read *a, 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 @@ lha_read_file_header_2(struct archive_read *a, struct lha *lha) } 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 @@ lha_read_file_header_3(struct archive_read *a, struct lha *lha) 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 @@ lha_crc16(uint16_t crc, const void *pp, size_t len) /* 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 @@ lzh_br_fillup(struct lzh_stream *strm, struct lzh_br *br) ((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 @@ lzh_br_fillup(struct lzh_stream *strm, struct lzh_br *br) (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; diff --git a/libarchive/archive_read_support_format_mtree.c b/libarchive/archive_read_support_format_mtree.c index 4a2816325f22..630cff6e3999 100644 --- a/libarchive/archive_read_support_format_mtree.c +++ b/libarchive/archive_read_support_format_mtree.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_support_format_mtree.c 201165 2009-12-29 05:52:13Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> @@ -994,9 +993,11 @@ process_add_entry(struct archive_read *a, struct mtree *mtree, 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; + } } } @@ -1071,7 +1072,7 @@ read_mtree(struct archive_read *a, struct mtree *mtree) 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; } @@ -1250,9 +1251,17 @@ parse_file(struct archive_read *a, struct archive_entry *entry, 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; @@ -1270,7 +1279,13 @@ parse_file(struct archive_read *a, struct archive_entry *entry, 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; } diff --git a/libarchive/archive_read_support_format_rar.c b/libarchive/archive_read_support_format_rar.c index f9cbe2a8810d..99a11d170074 100644 --- a/libarchive/archive_read_support_format_rar.c +++ b/libarchive/archive_read_support_format_rar.c @@ -734,7 +734,7 @@ archive_read_support_format_rar(struct archive *_a) archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW, "archive_read_support_format_rar"); - rar = (struct rar *)calloc(sizeof(*rar), 1); + rar = (struct rar *)calloc(1, sizeof(*rar)); if (rar == NULL) { archive_set_error(&a->archive, ENOMEM, "Can't allocate rar data"); @@ -1007,9 +1007,11 @@ archive_read_format_rar_read_header(struct archive_read *a, 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; @@ -1060,14 +1062,16 @@ archive_read_format_rar_read_header(struct archive_read *a, 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); @@ -1432,9 +1436,11 @@ read_header(struct archive_read *a, struct archive_entry *entry, /* 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; @@ -1824,13 +1830,9 @@ read_exttime(const char *p, struct rar *rar, const char *endp) 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); @@ -1862,15 +1864,10 @@ read_exttime(const char *p, struct rar *rar, const char *endp) 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 @@ -1952,9 +1949,11 @@ read_data_stored(struct archive_read *a, const void **buff, size_t *size, *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); @@ -2045,9 +2044,11 @@ read_data_compressed(struct archive_read *a, const void **buff, size_t *size, *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); @@ -3436,7 +3437,7 @@ compile_program(const uint8_t *bytes, size_t length) prog = calloc(1, sizeof(*prog)); if (!prog) return NULL; - prog->fingerprint = crc32(0, bytes, length) | ((uint64_t)length << 32); + prog->fingerprint = crc32(0, bytes, (unsigned int)length) | ((uint64_t)length << 32); if (membr_bits(&br, 1)) { diff --git a/libarchive/archive_read_support_format_rar5.c b/libarchive/archive_read_support_format_rar5.c index a3cfa72e77c8..e8846a5b0d0d 100644 --- a/libarchive/archive_read_support_format_rar5.c +++ b/libarchive/archive_read_support_format_rar5.c @@ -495,6 +495,11 @@ uint8_t bf_is_table_present(const struct compressed_block_header* hdr) { return (hdr->block_flags_u8 >> 7) & 1; } +static inline +uint8_t bf_is_last_block(const struct compressed_block_header* hdr) { + return (hdr->block_flags_u8 >> 6) & 1; +} + static inline struct rar5* get_context(struct archive_read* a) { return (struct rar5*) a->format->data; } @@ -2475,7 +2480,7 @@ static void update_crc(struct rar5* rar, const uint8_t* p, size_t to_read) { * `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 @@ -2821,11 +2826,13 @@ static int parse_block_header(struct archive_read* a, const uint8_t* p, ^ (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; @@ -3755,7 +3762,12 @@ static int do_uncompress_file(struct archive_read* a) { if(rar->cstate.last_write_ptr == rar->cstate.write_ptr) { /* The block didn't generate any new data, - * so just process a new block. */ + * so just process a new block if this one + * wasn't the last block in the file. */ + if (bf_is_last_block(&rar->last_block_hdr)) { + return ARCHIVE_EOF; + } + continue; } @@ -3911,6 +3923,13 @@ static int do_unpack(struct archive_read* a, struct rar5* rar, 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, diff --git a/libarchive/archive_read_support_format_raw.c b/libarchive/archive_read_support_format_raw.c index ec0520b60a6c..efdbf276baf7 100644 --- a/libarchive/archive_read_support_format_raw.c +++ b/libarchive/archive_read_support_format_raw.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_support_format_raw.c 201107 2009-12-28 03:25:33Z kientzle $"); #ifdef HAVE_ERRNO_H #include <errno.h> diff --git a/libarchive/archive_read_support_format_tar.c b/libarchive/archive_read_support_format_tar.c index bfdad7f87304..e5058ee82d4d 100644 --- a/libarchive/archive_read_support_format_tar.c +++ b/libarchive/archive_read_support_format_tar.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_support_format_tar.c 201161 2009-12-29 05:44:39Z kientzle $"); #ifdef HAVE_ERRNO_H #include <errno.h> @@ -407,14 +406,13 @@ archive_read_format_tar_bid(struct archive_read *a, int best_bid) /* * 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; } @@ -2108,6 +2106,21 @@ pax_attribute(struct archive_read *a, struct tar *tar, /* "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. diff --git a/libarchive/archive_read_support_format_warc.c b/libarchive/archive_read_support_format_warc.c index 27329962d6d1..c49d44eba5e5 100644 --- a/libarchive/archive_read_support_format_warc.c +++ b/libarchive/archive_read_support_format_warc.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); /** * WARC is standardised by ISO TC46/SC4/WG12 and currently available as @@ -530,11 +529,11 @@ strtoi_lim(const char *str, const char **ep, int llim, int ulim) 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. */ diff --git a/libarchive/archive_read_support_format_xar.c b/libarchive/archive_read_support_format_xar.c index 503ff58b91db..fd63594373cb 100644 --- a/libarchive/archive_read_support_format_xar.c +++ b/libarchive/archive_read_support_format_xar.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include <errno.h> @@ -623,8 +622,10 @@ read_toc(struct archive_read *a) (size_t)xar->toc_chksum_size, NULL, 0); __archive_read_consume(a, xar->toc_chksum_size); xar->offset += xar->toc_chksum_size; +#ifndef DONT_FAIL_ON_CRC_ERROR if (r != ARCHIVE_OK) return (ARCHIVE_FATAL); +#endif } /* @@ -827,10 +828,12 @@ xar_read_header(struct archive_read *a, struct archive_entry *entry) 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 +1126,7 @@ atohex(unsigned char *b, size_t bsize, const char *p, size_t psize) x |= p[1] - '0'; else return (-1); - + *b++ = x; bsize--; p += 2; @@ -1135,11 +1138,11 @@ atohex(unsigned char *b, size_t bsize, const char *p, size_t psize) 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. */ diff --git a/libarchive/archive_read_support_format_zip.c b/libarchive/archive_read_support_format_zip.c index 9d6c900b2c6e..212bfff9fa7b 100644 --- a/libarchive/archive_read_support_format_zip.c +++ b/libarchive/archive_read_support_format_zip.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_support_format_zip.c 201102 2009-12-28 03:11:36Z kientzle $"); /* * The definitive documentation of the Zip file format is: @@ -119,7 +118,7 @@ struct trad_enc_ctx { /* Bits used in zip_flags. */ #define ZIP_ENCRYPTED (1 << 0) -#define ZIP_LENGTH_AT_END (1 << 3) +#define ZIP_LENGTH_AT_END (1 << 3) /* Also called "Streaming bit" */ #define ZIP_STRONG_ENCRYPTED (1 << 6) #define ZIP_UTF8_NAME (1 << 11) /* See "7.2 Single Password Symmetric Encryption Method" @@ -166,8 +165,8 @@ struct zip { int64_t entry_compressed_bytes_read; int64_t entry_uncompressed_bytes_read; - /* Running CRC32 of the decompressed data */ - unsigned long entry_crc32; + /* Running CRC32 of the decompressed and decrypted data */ + unsigned long computed_crc32; unsigned long (*crc32func)(unsigned long, const void *, size_t); char ignore_crc32; @@ -945,7 +944,7 @@ zip_read_local_file_header(struct archive_read *a, struct archive_entry *entry, zip->end_of_entry = 0; zip->entry_uncompressed_bytes_read = 0; zip->entry_compressed_bytes_read = 0; - zip->entry_crc32 = zip->crc32func(0, NULL, 0); + zip->computed_crc32 = zip->crc32func(0, NULL, 0); /* Setup default conversion. */ if (zip->sconv == NULL && !zip->init_default_conversion) { @@ -1140,7 +1139,8 @@ zip_read_local_file_header(struct archive_read *a, struct archive_entry *entry, "Inconsistent CRC32 values"); ret = ARCHIVE_WARN; } - if (zip_entry->compressed_size == 0) { + if (zip_entry->compressed_size == 0 + || zip_entry->compressed_size == 0xffffffff) { zip_entry->compressed_size = zip_entry_central_dir.compressed_size; } else if (zip_entry->compressed_size @@ -1284,7 +1284,8 @@ zip_read_local_file_header(struct archive_read *a, struct archive_entry *entry, return ARCHIVE_FATAL; } } else if (0 == (zip_entry->zip_flags & ZIP_LENGTH_AT_END) - || zip_entry->uncompressed_size > 0) { + || (zip_entry->uncompressed_size > 0 + && zip_entry->uncompressed_size != 0xffffffff)) { /* Set the size only if it's meaningful. */ archive_entry_set_size(entry, zip_entry->uncompressed_size); } @@ -1343,25 +1344,267 @@ check_authentication_code(struct archive_read *a, const void *_p) } /* - * Read "uncompressed" data. There are three cases: - * 1) We know the size of the data. This is always true for the - * seeking reader (we've examined the Central Directory already). - * 2) ZIP_LENGTH_AT_END was set, but only the CRC was deferred. - * Info-ZIP seems to do this; we know the size but have to grab - * the CRC from the data descriptor afterwards. - * 3) We're streaming and ZIP_LENGTH_AT_END was specified and - * we have no size information. In this case, we can do pretty - * well by watching for the data descriptor record. The data - * descriptor is 16 bytes and includes a computed CRC that should - * provide a strong check. + * The Zip end-of-file marker is inherently ambiguous. The specification + * in APPNOTE.TXT allows any of four possible formats, and there is no + * guaranteed-correct way for a reader to know a priori which one the writer + * will have used. The four formats are: + * 1. 32-bit format with an initial PK78 marker + * 2. 32-bit format without that marker + * 3. 64-bit format with the marker + * 4. 64-bit format without the marker * - * TODO: Technically, the PK\007\010 signature is optional. - * In the original spec, the data descriptor contained CRC - * and size fields but had no leading signature. In practice, - * newer writers seem to provide the signature pretty consistently. + * Mark Adler's `sunzip` streaming unzip program solved this ambiguity + * by just looking at every possible combination and accepting the + * longest one that matches the expected values. His approach always + * consumes the longest possible matching EOF marker, based on an + * analysis of all the possible failures and how the values could + * overlap. * - * For uncompressed data, the PK\007\010 marker seems essential - * to be sure we've actually seen the end of the entry. + * For example, suppose both of the first two formats listed + * above match. In that case, we know the next four + * 32-bit words match this pattern: + * ``` + * [PK\07\08] [CRC32] [compressed size] [uncompressed size] + * ``` + * but we know they must also match this pattern: + * ``` + * [CRC32] [compressed size] [uncompressed size] [other PK marker] + * ``` + * + * Since the first word here matches both the PK78 signature in the + * first form and the CRC32 in the second, we know those two values + * are equal, the CRC32 must be exactly 0x08074b50. Similarly, the + * compressed and uncompressed size must also be exactly this value. + * So we know these four words are all 0x08074b50. If we were to + * accept the shorter pattern, it would be immediately followed by + * another PK78 marker, which is not possible in a well-formed ZIP + * archive unless there is garbage between entries. This implies we + * should not accept the shorter form in such a case; we should accept + * the longer form. + * + * If the second and third possibilities above both match, we + * have a slightly different situation. The following words + * must match both the 32-bit format + * ``` + * [CRC32] [compressed size] [uncompressed size] [other PK marker] + * ``` + * and the 64-bit format + * ``` + * [CRC32] [compressed low] [compressed high] [uncompressed low] [uncompressed high] [other PK marker] + * ``` + * Since the 32-bit and 64-bit compressed sizes both match, the + * actualy size must fit in 32 bits, which implies the high-order + * word of the compressed size is zero. So we know the uncompressed + * low word is zero, which again implies that if we accept the shorter + * format, there will not be a valid PK marker following it. + * + * Similar considerations rule out the shorter form in every other + * possibly-ambiguous pair. So if two of the four possible formats + * match, we should accept the longer option. + * + * If none of the four formats matches, we know the archive must be + * corrupted in some fashion. In particular, it's possible that the + * length-at-end bit was incorrect and we should not really be looking + * for an EOF marker at all. To allow for this possibility, we + * evaluate the following words to collect data for a later error + * report but do not consume any bytes. We instead rely on the later + * search for a new PK marker to re-sync to the next well-formed + * entry. + */ +static void +consume_end_of_file_marker(struct archive_read *a, struct zip *zip) +{ + const char *marker; + const char *p; + uint64_t compressed32, uncompressed32; + uint64_t compressed64, uncompressed64; + uint64_t compressed_actual, uncompressed_actual; + uint32_t crc32_actual; + const uint32_t PK78 = 0x08074B50ULL; + uint8_t crc32_ignored, crc32_may_be_zero; + + /* If there shouldn't be a marker, don't consume it. */ + if ((zip->entry->zip_flags & ZIP_LENGTH_AT_END) == 0) { + return; + } + + /* The longest Zip end-of-file record is 24 bytes. Since an + * end-of-file record can never appear at the end of the + * archive, we know 24 bytes will be available unless + * the archive is severely truncated. */ + if (NULL == (marker = __archive_read_ahead(a, 24, NULL))) { + return; + } + p = marker; + + /* The end-of-file record comprises: + * = Optional PK\007\010 marker + * = 4-byte CRC32 + * = Compressed size + * = Uncompressed size + * + * The last two fields are either both 32 bits or both 64 + * bits. We check all possible layouts and accept any one + * that gives us a complete match, else we make a best-effort + * attempt to parse out the pieces. + */ + + /* CRC32 checking can be tricky: + * * Test suites sometimes ignore the CRC32 + * * AES AE-2 always writes zero for the CRC32 + * * AES AE-1 sometimes writes zero for the CRC32 + */ + crc32_ignored = zip->ignore_crc32; + crc32_may_be_zero = 0; + crc32_actual = zip->computed_crc32; + if (zip->hctx_valid) { + switch (zip->entry->aes_extra.vendor) { + case AES_VENDOR_AE_2: + crc32_actual = 0; + break; + case AES_VENDOR_AE_1: + default: + crc32_may_be_zero = 1; + break; + } + } + + /* Values computed from the actual data in the archive. */ + compressed_actual = (uint64_t)zip->entry_compressed_bytes_read; + uncompressed_actual = (uint64_t)zip->entry_uncompressed_bytes_read; + + + /* Longest: PK78 marker, all 64-bit fields (24 bytes total) */ + if (archive_le32dec(p) == PK78 + && ((archive_le32dec(p + 4) == crc32_actual) + || (crc32_may_be_zero && (archive_le32dec(p + 4) == 0)) + || crc32_ignored) + && (archive_le64dec(p + 8) == compressed_actual) + && (archive_le64dec(p + 16) == uncompressed_actual)) { + if (!crc32_ignored) { + zip->entry->crc32 = crc32_actual; + } + zip->entry->compressed_size = compressed_actual; + zip->entry->uncompressed_size = uncompressed_actual; + zip->unconsumed += 24; + return; + } + + /* No PK78 marker, 64-bit fields (20 bytes total) */ + if (((archive_le32dec(p) == crc32_actual) + || (crc32_may_be_zero && (archive_le32dec(p + 4) == 0)) + || crc32_ignored) + && (archive_le64dec(p + 4) == compressed_actual) + && (archive_le64dec(p + 12) == uncompressed_actual)) { + if (!crc32_ignored) { + zip->entry->crc32 = crc32_actual; + } + zip->entry->compressed_size = compressed_actual; + zip->entry->uncompressed_size = uncompressed_actual; + zip->unconsumed += 20; + return; + } + + /* PK78 marker and 32-bit fields (16 bytes total) */ + if (archive_le32dec(p) == PK78 + && ((archive_le32dec(p + 4) == crc32_actual) + || (crc32_may_be_zero && (archive_le32dec(p + 4) == 0)) + || crc32_ignored) + && (archive_le32dec(p + 8) == compressed_actual) + && (archive_le32dec(p + 12) == uncompressed_actual)) { + if (!crc32_ignored) { + zip->entry->crc32 = crc32_actual; + } + zip->entry->compressed_size = compressed_actual; + zip->entry->uncompressed_size = uncompressed_actual; + zip->unconsumed += 16; + return; + } + + /* Shortest: No PK78 marker, all 32-bit fields (12 bytes total) */ + if (((archive_le32dec(p) == crc32_actual) + || (crc32_may_be_zero && (archive_le32dec(p + 4) == 0)) + || crc32_ignored) + && (archive_le32dec(p + 4) == compressed_actual) + && (archive_le32dec(p + 8) == uncompressed_actual)) { + if (!crc32_ignored) { + zip->entry->crc32 = crc32_actual; + } + zip->entry->compressed_size = compressed_actual; + zip->entry->uncompressed_size = uncompressed_actual; + zip->unconsumed += 12; + return; + } + + /* If none of the above patterns gives us a full exact match, + * then there's something definitely amiss. The fallback code + * below will parse out some plausible values for error + * reporting purposes. Note that this won't actually + * consume anything: + * + * = If there really is a marker here, the logic to resync to + * the next entry will suffice to skip it. + * + * = There might not really be a marker: Corruption or bugs + * may have set the length-at-end bit without a marker ever + * having actually been written. In this case, we + * explicitly should not consume any bytes, since that would + * prevent us from correctly reading the next entry. + */ + if (archive_le32dec(p) == PK78) { + p += 4; /* Ignore PK78 if it appears to be present */ + } + zip->entry->crc32 = archive_le32dec(p); /* Parse CRC32 */ + p += 4; + + /* Consider both 32- and 64-bit interpretations */ + compressed32 = archive_le32dec(p); + uncompressed32 = archive_le32dec(p + 4); + compressed64 = archive_le64dec(p); + uncompressed64 = archive_le64dec(p + 8); + + /* The earlier patterns may have failed because of CRC32 + * mismatch, so it's still possible that both sizes match. + * Try to match as many as we can... + */ + if (compressed32 == compressed_actual + && uncompressed32 == uncompressed_actual) { + /* Both 32-bit fields match */ + zip->entry->compressed_size = compressed32; + zip->entry->uncompressed_size = uncompressed32; + } else if (compressed64 == compressed_actual + || uncompressed64 == uncompressed_actual) { + /* One or both 64-bit fields match */ + zip->entry->compressed_size = compressed64; + zip->entry->uncompressed_size = uncompressed64; + } else { + /* Zero or one 32-bit fields match */ + zip->entry->compressed_size = compressed32; + zip->entry->uncompressed_size = uncompressed32; + } +} + +/* + * Read "uncompressed" data. + * + * This is straightforward if we know the size of the data. This is + * always true for the seeking reader (we've examined the Central + * Directory already), and will often be true for the streaming reader + * (the writer was writing uncompressed so probably knows the size). + * + * If we don't know the size, then life is more interesting. Note + * that a careful reading of the Zip specification says that a writer + * must use ZIP_LENGTH_AT_END if it cannot write the CRC into the + * local header. And if it uses ZIP_LENGTH_AT_END, then it is + * prohibited from storing the sizes in the local header. This + * prevents fully-compliant streaming writers from providing any size + * clues to a streaming reader. In this case, we have to scan the + * data as we read to try to locate the end-of-file marker. + * + * We assume here that the end-of-file marker always has the + * PK\007\010 signature. Although it's technically optional, newer + * writers seem to provide it pretty consistently, and it's not clear + * how to efficiently recognize an end-of-file marker that lacks it. * * Returns ARCHIVE_OK if successful, ARCHIVE_FATAL otherwise, sets * zip->end_of_entry if it consumes all of the data. @@ -1373,18 +1616,18 @@ zip_read_data_none(struct archive_read *a, const void **_buff, struct zip *zip; const char *buff; ssize_t bytes_avail; + ssize_t trailing_extra; int r; (void)offset; /* UNUSED */ zip = (struct zip *)(a->format->data); + trailing_extra = zip->hctx_valid ? AUTH_CODE_SIZE : 0; if (zip->entry->zip_flags & ZIP_LENGTH_AT_END) { const char *p; - ssize_t grabbing_bytes = 24; + ssize_t grabbing_bytes = 24 + trailing_extra; - if (zip->hctx_valid) - grabbing_bytes += AUTH_CODE_SIZE; /* Grab at least 24 bytes. */ buff = __archive_read_ahead(a, grabbing_bytes, &bytes_avail); if (bytes_avail < grabbing_bytes) { @@ -1399,44 +1642,19 @@ zip_read_data_none(struct archive_read *a, const void **_buff, } /* Check for a complete PK\007\010 signature, followed * by the correct 4-byte CRC. */ - p = buff; - if (zip->hctx_valid) - p += AUTH_CODE_SIZE; + p = buff + trailing_extra; if (p[0] == 'P' && p[1] == 'K' && p[2] == '\007' && p[3] == '\010' - && (archive_le32dec(p + 4) == zip->entry_crc32 + && (archive_le32dec(p + 4) == zip->computed_crc32 || zip->ignore_crc32 || (zip->hctx_valid && zip->entry->aes_extra.vendor == AES_VENDOR_AE_2))) { - if (zip->entry->flags & LA_USED_ZIP64) { - uint64_t compressed, uncompressed; - zip->entry->crc32 = archive_le32dec(p + 4); - compressed = archive_le64dec(p + 8); - uncompressed = archive_le64dec(p + 16); - if (compressed > INT64_MAX || uncompressed > - INT64_MAX) { - archive_set_error(&a->archive, - ARCHIVE_ERRNO_FILE_FORMAT, - "Overflow of 64-bit file sizes"); - return ARCHIVE_FAILED; - } - zip->entry->compressed_size = compressed; - zip->entry->uncompressed_size = uncompressed; - zip->unconsumed = 24; - } else { - zip->entry->crc32 = archive_le32dec(p + 4); - zip->entry->compressed_size = - archive_le32dec(p + 8); - zip->entry->uncompressed_size = - archive_le32dec(p + 12); - zip->unconsumed = 16; - } + zip->end_of_entry = 1; if (zip->hctx_valid) { r = check_authentication_code(a, buff); if (r != ARCHIVE_OK) return (r); } - zip->end_of_entry = 1; return (ARCHIVE_OK); } /* If not at EOF, ensure we consume at least one byte. */ @@ -1452,11 +1670,10 @@ zip_read_data_none(struct archive_read *a, const void **_buff, else if (p[3] == '\007') { p += 1; } else if (p[3] == '\010' && p[2] == '\007' && p[1] == 'K' && p[0] == 'P') { - if (zip->hctx_valid) - p -= AUTH_CODE_SIZE; break; } else { p += 4; } } + p -= trailing_extra; bytes_avail = p - buff; } else { if (zip->entry_bytes_remaining == 0) { @@ -1499,59 +1716,15 @@ zip_read_data_none(struct archive_read *a, const void **_buff, bytes_avail = dec_size; buff = (const char *)zip->decrypted_buffer; } - *size = bytes_avail; zip->entry_bytes_remaining -= bytes_avail; zip->entry_uncompressed_bytes_read += bytes_avail; zip->entry_compressed_bytes_read += bytes_avail; zip->unconsumed += bytes_avail; + *size = bytes_avail; *_buff = buff; return (ARCHIVE_OK); } -static int -consume_optional_marker(struct archive_read *a, struct zip *zip) -{ - if (zip->end_of_entry && (zip->entry->zip_flags & ZIP_LENGTH_AT_END)) { - const char *p; - - if (NULL == (p = __archive_read_ahead(a, 24, NULL))) { - archive_set_error(&a->archive, - ARCHIVE_ERRNO_FILE_FORMAT, - "Truncated ZIP end-of-file record"); - return (ARCHIVE_FATAL); - } - /* Consume the optional PK\007\010 marker. */ - if (p[0] == 'P' && p[1] == 'K' && - p[2] == '\007' && p[3] == '\010') { - p += 4; - zip->unconsumed = 4; - } - if (zip->entry->flags & LA_USED_ZIP64) { - uint64_t compressed, uncompressed; - zip->entry->crc32 = archive_le32dec(p); - compressed = archive_le64dec(p + 4); - uncompressed = archive_le64dec(p + 12); - if (compressed > INT64_MAX || - uncompressed > INT64_MAX) { - archive_set_error(&a->archive, - ARCHIVE_ERRNO_FILE_FORMAT, - "Overflow of 64-bit file sizes"); - return ARCHIVE_FAILED; - } - zip->entry->compressed_size = compressed; - zip->entry->uncompressed_size = uncompressed; - zip->unconsumed += 20; - } else { - zip->entry->crc32 = archive_le32dec(p); - zip->entry->compressed_size = archive_le32dec(p + 4); - zip->entry->uncompressed_size = archive_le32dec(p + 8); - zip->unconsumed += 12; - } - } - - return (ARCHIVE_OK); -} - #if HAVE_LZMA_H && HAVE_LIBLZMA static int zipx_xz_init(struct archive_read *a, struct zip *zip) @@ -1803,10 +1976,6 @@ zip_read_data_zipx_xz(struct archive_read *a, const void **buff, *size = zip->zipx_lzma_stream.total_out; *buff = zip->uncompressed_buffer; - ret = consume_optional_marker(a, zip); - if (ret != ARCHIVE_OK) - return (ret); - return (ARCHIVE_OK); } @@ -1871,8 +2040,6 @@ zip_read_data_zipx_lzma_alone(struct archive_read *a, const void **buff, /* This case is optional in lzma alone format. It can happen, * but most of the files don't have it. (GitHub #1257) */ case LZMA_STREAM_END: - lzma_end(&zip->zipx_lzma_stream); - zip->zipx_lzma_valid = 0; if((int64_t) zip->zipx_lzma_stream.total_in != zip->entry_bytes_remaining) { @@ -1906,21 +2073,18 @@ zip_read_data_zipx_lzma_alone(struct archive_read *a, const void **buff, zip->end_of_entry = 1; } - /* Return values. */ - *size = zip->zipx_lzma_stream.total_out; - *buff = zip->uncompressed_buffer; - - /* Behave the same way as during deflate decompression. */ - ret = consume_optional_marker(a, zip); - if (ret != ARCHIVE_OK) - return (ret); - /* Free lzma decoder handle because we'll no longer need it. */ + /* This cannot be folded into LZMA_STREAM_END handling above + * because the stream end marker is not required in this format. */ if(zip->end_of_entry) { lzma_end(&zip->zipx_lzma_stream); zip->zipx_lzma_valid = 0; } + /* Return values. */ + *size = zip->zipx_lzma_stream.total_out; + *buff = zip->uncompressed_buffer; + /* If we're here, then we're good! */ return (ARCHIVE_OK); } @@ -2078,10 +2242,6 @@ zip_read_data_zipx_ppmd(struct archive_read *a, const void **buff, ++consumed_bytes; } while(consumed_bytes < zip->uncompressed_buffer_size); - /* Update pointers for libarchive. */ - *buff = zip->uncompressed_buffer; - *size = consumed_bytes; - /* Update pointers so we can continue decompression in another call. */ zip->entry_bytes_remaining -= zip->zipx_ppmd_read_compressed; zip->entry_compressed_bytes_read += zip->zipx_ppmd_read_compressed; @@ -2093,10 +2253,9 @@ zip_read_data_zipx_ppmd(struct archive_read *a, const void **buff, zip->ppmd8_valid = 0; } - /* Seek for optional marker, same way as in each zip entry. */ - ret = consume_optional_marker(a, zip); - if (ret != ARCHIVE_OK) - return ret; + /* Update pointers for libarchive. */ + *buff = zip->uncompressed_buffer; + *size = consumed_bytes; return ARCHIVE_OK; } @@ -2186,11 +2345,11 @@ zip_read_data_zipx_bzip2(struct archive_read *a, const void **buff, /* 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; @@ -2227,7 +2386,7 @@ zip_read_data_zipx_bzip2(struct archive_read *a, const void **buff, 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,11 +2397,6 @@ zip_read_data_zipx_bzip2(struct archive_read *a, const void **buff, *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; } @@ -2373,11 +2527,6 @@ zip_read_data_zipx_zstd(struct archive_read *a, const void **buff, *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 @@ -2413,7 +2562,7 @@ zip_read_data_deflate(struct archive_read *a, const void **buff, size_t *size, int64_t *offset) { struct zip *zip; - ssize_t bytes_avail; + ssize_t bytes_avail, to_consume = 0; const void *compressed_buff, *sp; int r; @@ -2534,34 +2683,33 @@ zip_read_data_deflate(struct archive_read *a, const void **buff, } /* Consume as much as the compressor actually used. */ - bytes_avail = zip->stream.total_in; + to_consume = zip->stream.total_in; + __archive_read_consume(a, to_consume); + zip->entry_bytes_remaining -= to_consume; + zip->entry_compressed_bytes_read += to_consume; + zip->entry_uncompressed_bytes_read += zip->stream.total_out; + if (zip->tctx_valid || zip->cctx_valid) { - zip->decrypted_bytes_remaining -= bytes_avail; + zip->decrypted_bytes_remaining -= to_consume; if (zip->decrypted_bytes_remaining == 0) zip->decrypted_ptr = zip->decrypted_buffer; else - zip->decrypted_ptr += bytes_avail; + zip->decrypted_ptr += to_consume; } - /* Calculate compressed data as much as we used.*/ if (zip->hctx_valid) - archive_hmac_sha1_update(&zip->hctx, sp, bytes_avail); - __archive_read_consume(a, bytes_avail); - zip->entry_bytes_remaining -= bytes_avail; - zip->entry_compressed_bytes_read += bytes_avail; - - *size = zip->stream.total_out; - zip->entry_uncompressed_bytes_read += zip->stream.total_out; - *buff = zip->uncompressed_buffer; + archive_hmac_sha1_update(&zip->hctx, sp, to_consume); - if (zip->end_of_entry && zip->hctx_valid) { - r = check_authentication_code(a, NULL); - if (r != ARCHIVE_OK) - return (r); + if (zip->end_of_entry) { + if (zip->hctx_valid) { + r = check_authentication_code(a, NULL); + if (r != ARCHIVE_OK) { + return (r); + } + } } - r = consume_optional_marker(a, zip); - if (r != ARCHIVE_OK) - return (r); + *size = zip->stream.total_out; + *buff = zip->uncompressed_buffer; return (ARCHIVE_OK); } @@ -3029,13 +3177,27 @@ archive_read_format_zip_read_data(struct archive_read *a, } if (r != ARCHIVE_OK) return (r); - /* Update checksum */ - if (*size) - zip->entry_crc32 = zip->crc32func(zip->entry_crc32, *buff, - (unsigned)*size); - /* If we hit the end, swallow any end-of-data marker. */ + if (*size > 0) { + zip->computed_crc32 = zip->crc32func(zip->computed_crc32, *buff, + (unsigned)*size); + } + /* If we hit the end, swallow any end-of-data marker and + * verify the final check values. */ if (zip->end_of_entry) { - /* Check file size, CRC against these values. */ + consume_end_of_file_marker(a, zip); + + /* Check computed CRC against header */ + if ((!zip->hctx_valid || + zip->entry->aes_extra.vendor != AES_VENDOR_AE_2) && + zip->entry->crc32 != zip->computed_crc32 + && !zip->ignore_crc32) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "ZIP bad CRC: 0x%lx should be 0x%lx", + (unsigned long)zip->computed_crc32, + (unsigned long)zip->entry->crc32); + return (ARCHIVE_FAILED); + } + /* Check file size against header. */ if (zip->entry->compressed_size != zip->entry_compressed_bytes_read) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, @@ -3043,7 +3205,7 @@ archive_read_format_zip_read_data(struct archive_read *a, "(read %jd, expected %jd)", (intmax_t)zip->entry_compressed_bytes_read, (intmax_t)zip->entry->compressed_size); - return (ARCHIVE_WARN); + return (ARCHIVE_FAILED); } /* Size field only stores the lower 32 bits of the actual * size. */ @@ -3054,18 +3216,7 @@ archive_read_format_zip_read_data(struct archive_read *a, "(read %jd, expected %jd)\n", (intmax_t)zip->entry_uncompressed_bytes_read, (intmax_t)zip->entry->uncompressed_size); - return (ARCHIVE_WARN); - } - /* Check computed CRC against header */ - if ((!zip->hctx_valid || - zip->entry->aes_extra.vendor != AES_VENDOR_AE_2) && - zip->entry->crc32 != zip->entry_crc32 - && !zip->ignore_crc32) { - archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "ZIP bad CRC: 0x%lx should be 0x%lx", - (unsigned long)zip->entry_crc32, - (unsigned long)zip->entry->crc32); - return (ARCHIVE_WARN); + return (ARCHIVE_FAILED); } } diff --git a/libarchive/archive_string.c b/libarchive/archive_string.c index d7f2c46b28fe..f39677ad7a26 100644 --- a/libarchive/archive_string.c +++ b/libarchive/archive_string.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_string.c 201095 2009-12-28 02:33:22Z kientzle $"); /* * Basic resizable string support, to simplify manipulating arbitrary-sized @@ -553,6 +552,8 @@ archive_wstring_append_from_mbs_in_codepage(struct archive_wstring *dest, } else mbflag = MB_PRECOMPOSED; + mbflag |= MB_ERR_INVALID_CHARS; + buffsize = dest->length + length + 1; do { /* Allocate memory for WCS. */ @@ -1324,6 +1325,10 @@ free_sconv_object(struct archive_string_conv *sc) } #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) { @@ -1523,7 +1528,7 @@ get_current_codepage(void) p = strrchr(locale, '.'); if (p == NULL) return (GetACP()); - if (strcmp(p+1, "utf8") == 0) + if ((strcmp(p+1, "utf8") == 0) || (strcmp(p+1, "UTF-8") == 0)) return CP_UTF8; cp = my_atoi(p+1); if ((int)cp <= 0) @@ -3988,10 +3993,10 @@ int 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. @@ -4223,6 +4228,17 @@ archive_mstring_update_utf8(struct archive *a, struct archive_mstring *aes, if (sc == NULL) return (-1);/* Couldn't allocate memory for sc. */ r = archive_strcpy_l(&(aes->aes_mbs), utf8, sc); + +#if defined(_WIN32) && !defined(__CYGWIN__) + /* On failure, make an effort to convert UTF8 to WCS as the active code page + * may not be able to represent all characters in the string */ + if (r != 0) { + if (archive_wstring_append_from_mbs_in_codepage(&(aes->aes_wcs), + aes->aes_utf8.s, aes->aes_utf8.length, sc) == 0) + aes->aes_set = AES_SET_UTF8 | AES_SET_WCS; + } +#endif + if (a == NULL) free_sconv_object(sc); if (r != 0) diff --git a/libarchive/archive_string.h b/libarchive/archive_string.h index 49d7d3064a3d..e8987867d3ce 100644 --- a/libarchive/archive_string.h +++ b/libarchive/archive_string.h @@ -21,9 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/archive_string.h 201092 2009-12-28 02:26:06Z kientzle $ - * */ #ifndef ARCHIVE_STRING_H_INCLUDED diff --git a/libarchive/archive_string_composition.h b/libarchive/archive_string_composition.h index d0ac340961a0..e917036f1167 100644 --- a/libarchive/archive_string_composition.h +++ b/libarchive/archive_string_composition.h @@ -22,8 +22,6 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD$ - * */ /* diff --git a/libarchive/archive_string_sprintf.c b/libarchive/archive_string_sprintf.c index 969a5603a49e..c785e12bdf6d 100644 --- a/libarchive/archive_string_sprintf.c +++ b/libarchive/archive_string_sprintf.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_string_sprintf.c 189435 2009-03-06 05:14:55Z kientzle $"); /* * The use of printf()-family functions can be troublesome diff --git a/libarchive/archive_util.3 b/libarchive/archive_util.3 index d5d4e7dfd7d5..3aa508f25aa2 100644 --- a/libarchive/archive_util.3 +++ b/libarchive/archive_util.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_UTIL 3 .Os diff --git a/libarchive/archive_util.c b/libarchive/archive_util.c index b1582edbe308..32d4bd40988c 100644 --- a/libarchive/archive_util.c +++ b/libarchive/archive_util.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_util.c 201098 2009-12-28 02:58:14Z kientzle $"); #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> @@ -42,9 +41,20 @@ __FBSDID("$FreeBSD: head/lib/libarchive/archive_util.c 201098 2009-12-28 02:58:1 #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 +243,16 @@ __archive_mktempx(const char *tmpdir, wchar_t *template) 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 +326,42 @@ __archive_mktempx(const char *tmpdir, wchar_t *template) 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 +378,17 @@ __archive_mktempx(const char *tmpdir, wchar_t *template) /* 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 +396,7 @@ __archive_mktempx(const char *tmpdir, wchar_t *template) 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 +415,13 @@ __archive_mktempx(const char *tmpdir, wchar_t *template) 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); diff --git a/libarchive/archive_version_details.c b/libarchive/archive_version_details.c index bfb20eab2027..29be24f3222e 100644 --- a/libarchive/archive_version_details.c +++ b/libarchive/archive_version_details.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_util.c 201098 2009-12-28 02:58:14Z kientzle $"); #ifdef HAVE_STDLIB_H #include <stdlib.h> diff --git a/libarchive/archive_virtual.c b/libarchive/archive_virtual.c index f509ee5c672d..97e0b8a0d7b7 100644 --- a/libarchive/archive_virtual.c +++ b/libarchive/archive_virtual.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_virtual.c 201098 2009-12-28 02:58:14Z kientzle $"); #include "archive.h" #include "archive_entry.h" diff --git a/libarchive/archive_windows.c b/libarchive/archive_windows.c index 624e270095d6..bb540da011f7 100644 --- a/libarchive/archive_windows.c +++ b/libarchive/archive_windows.c @@ -22,8 +22,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ /* @@ -234,7 +232,11 @@ la_CreateFile(const char *path, DWORD dwDesiredAccess, DWORD dwShareMode, { 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 +244,25 @@ la_CreateFile(const char *path, DWORD dwDesiredAccess, DWORD dwShareMode, 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 +320,10 @@ __la_open(const char *path, int flags, ...) * "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 +338,7 @@ __la_open(const char *path, int flags, ...) } 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 +351,15 @@ __la_open(const char *path, int flags, ...) 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()); diff --git a/libarchive/archive_windows.h b/libarchive/archive_windows.h index 47b7cb8e379f..6b7006a00a1e 100644 --- a/libarchive/archive_windows.h +++ b/libarchive/archive_windows.h @@ -23,8 +23,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ /* diff --git a/libarchive/archive_write.3 b/libarchive/archive_write.3 index e7f7f1384ee8..227e4e028449 100644 --- a/libarchive/archive_write.3 +++ b/libarchive/archive_write.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_WRITE 3 .Os diff --git a/libarchive/archive_write.c b/libarchive/archive_write.c index 66592e8268ab..b70bc785c738 100644 --- a/libarchive/archive_write.c +++ b/libarchive/archive_write.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write.c 201099 2009-12-28 03:03:00Z kientzle $"); /* * This file contains the "essential" portions of the write API, that @@ -115,7 +114,7 @@ archive_write_new(void) /* Initialize a block of nulls for padding purposes. */ a->null_length = 1024; - nulls = (unsigned char *)calloc(1, a->null_length); + nulls = (unsigned char *)calloc(a->null_length, sizeof(unsigned char)); if (nulls == NULL) { free(a); return (NULL); @@ -201,6 +200,10 @@ __archive_write_allocate_filter(struct archive *_a) 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) @@ -306,6 +309,25 @@ __archive_write_output(struct archive_write *a, const void *buff, size_t length) 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) { @@ -548,6 +570,10 @@ archive_write_open2(struct archive *_a, void *client_data, 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; @@ -732,6 +758,18 @@ _archive_write_header(struct archive *_a, struct archive_entry *entry) 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)); if (r2 == ARCHIVE_FAILED) { diff --git a/libarchive/archive_write_add_filter.c b/libarchive/archive_write_add_filter.c index 203f4142b5c9..aa962515a044 100644 --- a/libarchive/archive_write_add_filter.c +++ b/libarchive/archive_write_add_filter.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> diff --git a/libarchive/archive_write_add_filter_b64encode.c b/libarchive/archive_write_add_filter_b64encode.c index 87fdb73ecb09..084d195402bc 100644 --- a/libarchive/archive_write_add_filter_b64encode.c +++ b/libarchive/archive_write_add_filter_b64encode.c @@ -25,8 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_ERRNO_H #include <errno.h> #endif diff --git a/libarchive/archive_write_add_filter_by_name.c b/libarchive/archive_write_add_filter_by_name.c index ffa633c96371..fc62458c56ee 100644 --- a/libarchive/archive_write_add_filter_by_name.c +++ b/libarchive/archive_write_add_filter_by_name.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> diff --git a/libarchive/archive_write_add_filter_bzip2.c b/libarchive/archive_write_add_filter_bzip2.c index 7001e9c6b309..561e11b5d70a 100644 --- a/libarchive/archive_write_add_filter_bzip2.c +++ b/libarchive/archive_write_add_filter_bzip2.c @@ -26,8 +26,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_compression_bzip2.c 201091 2009-12-28 02:22:41Z kientzle $"); - #ifdef HAVE_ERRNO_H #include <errno.h> #endif @@ -190,7 +188,7 @@ archive_compressor_bzip2_open(struct archive_write_filter *f) 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 +242,7 @@ archive_compressor_bzip2_write(struct archive_write_filter *f, /* 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 +311,7 @@ drive_compressor(struct archive_write_filter *f, 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. */ diff --git a/libarchive/archive_write_add_filter_compress.c b/libarchive/archive_write_add_filter_compress.c index d404fae7dba4..78afebda3e35 100644 --- a/libarchive/archive_write_add_filter_compress.c +++ b/libarchive/archive_write_add_filter_compress.c @@ -58,8 +58,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_compression_compress.c 201111 2009-12-28 03:33:05Z kientzle $"); - #ifdef HAVE_ERRNO_H #include <errno.h> #endif @@ -352,7 +350,7 @@ archive_compressor_compress_write(struct archive_write_filter *f, 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) { diff --git a/libarchive/archive_write_add_filter_grzip.c b/libarchive/archive_write_add_filter_grzip.c index 371102d74c05..f8bb886061e5 100644 --- a/libarchive/archive_write_add_filter_grzip.c +++ b/libarchive/archive_write_add_filter_grzip.c @@ -25,8 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_ERRNO_H #include <errno.h> #endif diff --git a/libarchive/archive_write_add_filter_gzip.c b/libarchive/archive_write_add_filter_gzip.c index 8670d5ca7403..a7fabbfa6bd5 100644 --- a/libarchive/archive_write_add_filter_gzip.c +++ b/libarchive/archive_write_add_filter_gzip.c @@ -25,8 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_compression_gzip.c 201081 2009-12-28 02:04:42Z kientzle $"); - #ifdef HAVE_ERRNO_H #include <errno.h> #endif diff --git a/libarchive/archive_write_add_filter_lrzip.c b/libarchive/archive_write_add_filter_lrzip.c index e215f8903259..fe974c93d5d0 100644 --- a/libarchive/archive_write_add_filter_lrzip.c +++ b/libarchive/archive_write_add_filter_lrzip.c @@ -25,8 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_ERRNO_H #include <errno.h> #endif diff --git a/libarchive/archive_write_add_filter_lz4.c b/libarchive/archive_write_add_filter_lz4.c index cf19fadd5633..24061a169521 100644 --- a/libarchive/archive_write_add_filter_lz4.c +++ b/libarchive/archive_write_add_filter_lz4.c @@ -25,8 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_ERRNO_H #include <errno.h> #endif @@ -518,10 +516,10 @@ drive_compressor_independence(struct archive_write_filter *f, const char *p, } 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 +601,10 @@ drive_compressor_dependence(struct archive_write_filter *f, const char *p, } 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) { diff --git a/libarchive/archive_write_add_filter_lzop.c b/libarchive/archive_write_add_filter_lzop.c index 3bd9062e4d32..8580e58844af 100644 --- a/libarchive/archive_write_add_filter_lzop.c +++ b/libarchive/archive_write_add_filter_lzop.c @@ -25,7 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); //#undef HAVE_LZO_LZOCONF_H //#undef HAVE_LZO_LZO1X_H diff --git a/libarchive/archive_write_add_filter_none.c b/libarchive/archive_write_add_filter_none.c index 3c06c642e735..b7aa6d4bcd3c 100644 --- a/libarchive/archive_write_add_filter_none.c +++ b/libarchive/archive_write_add_filter_none.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_compression_none.c 201080 2009-12-28 02:03:54Z kientzle $"); #include "archive.h" diff --git a/libarchive/archive_write_add_filter_program.c b/libarchive/archive_write_add_filter_program.c index c096e7227ba4..c661cc7f412f 100644 --- a/libarchive/archive_write_add_filter_program.c +++ b/libarchive/archive_write_add_filter_program.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_compression_program.c 201104 2009-12-28 03:14:30Z kientzle $"); #ifdef HAVE_SYS_WAIT_H # include <sys/wait.h> diff --git a/libarchive/archive_write_add_filter_uuencode.c b/libarchive/archive_write_add_filter_uuencode.c index 1ad458921928..42dec8def1f1 100644 --- a/libarchive/archive_write_add_filter_uuencode.c +++ b/libarchive/archive_write_add_filter_uuencode.c @@ -25,8 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_ERRNO_H #include <errno.h> #endif diff --git a/libarchive/archive_write_add_filter_xz.c b/libarchive/archive_write_add_filter_xz.c index 04bee90efa46..18da08274d92 100644 --- a/libarchive/archive_write_add_filter_xz.c +++ b/libarchive/archive_write_add_filter_xz.c @@ -26,8 +26,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_compression_xz.c 201108 2009-12-28 03:28:21Z kientzle $"); - #ifdef HAVE_ERRNO_H #include <errno.h> #endif diff --git a/libarchive/archive_write_add_filter_zstd.c b/libarchive/archive_write_add_filter_zstd.c index e85b7669c50d..94249accd08b 100644 --- a/libarchive/archive_write_add_filter_zstd.c +++ b/libarchive/archive_write_add_filter_zstd.c @@ -1,5 +1,6 @@ /*- * Copyright (c) 2017 Sean Purcell + * Copyright (c) 2023-2024 Klara, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -25,12 +26,12 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - - #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,10 +51,24 @@ __FBSDID("$FreeBSD$"); struct private_data { int compression_level; - int threads; -#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR + int threads; + int long_distance; +#if HAVE_ZSTD_H && HAVE_ZSTD_compressStream + enum { + running, + finishing, + resetting, + } state; + int frame_per_file; + size_t min_frame_in; + size_t max_frame_in; + size_t min_frame_out; + size_t max_frame_out; + 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; @@ -67,17 +82,21 @@ struct private_data { #define CLEVEL_STD_MAX 19 /* without using --ultra */ #define CLEVEL_MAX 22 +#define LONG_STD 27 + #define MINVER_NEGCLEVEL 10304 #define MINVER_MINCLEVEL 10306 +#define MINVER_LONG 10302 static int archive_compressor_zstd_options(struct archive_write_filter *, const char *, const char *); 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_COMPRESSOR +#if HAVE_ZSTD_H && HAVE_ZSTD_compressStream static int drive_compressor(struct archive_write_filter *, struct private_data *, int, const void *, size_t); #endif @@ -103,13 +122,22 @@ archive_write_add_filter_zstd(struct archive *_a) 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; data->threads = 0; -#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR + data->long_distance = 0; +#if HAVE_ZSTD_H && HAVE_ZSTD_compressStream + data->frame_per_file = 0; + data->min_frame_in = 0; + data->max_frame_in = SIZE_MAX; + data->min_frame_out = 0; + data->max_frame_out = SIZE_MAX; + data->cur_frame_in = 0; + data->cur_frame_out = 0; data->cstream = ZSTD_createCStream(); if (data->cstream == NULL) { free(data); @@ -136,7 +164,7 @@ static int archive_compressor_zstd_free(struct archive_write_filter *f) { struct private_data *data = (struct private_data *)f->data; -#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR +#if HAVE_ZSTD_H && HAVE_ZSTD_compressStream ZSTD_freeCStream(data->cstream); free(data->out.dst); #else @@ -147,29 +175,54 @@ archive_compressor_zstd_free(struct archive_write_filter *f) 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); - } - } - - return (ARCHIVE_OK); + char *end; + + 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); +} + +static int +string_to_size(const char *string, size_t *numberp) +{ + uintmax_t number; + char *end; + unsigned int shift = 0; + + if (string == NULL || *string == '\0' || *string == '-') + return (ARCHIVE_WARN); + number = strtoumax(string, &end, 10); + if (end > string) { + if (*end == 'K' || *end == 'k') { + shift = 10; + end++; + } else if (*end == 'M' || *end == 'm') { + shift = 20; + end++; + } else if (*end == 'G' || *end == 'g') { + shift = 30; + end++; + } + if (*end == 'B' || *end == 'b') { + end++; + } + } + if (end == string || *end != '\0' || errno == EOVERFLOW) { + return (ARCHIVE_WARN); + } + if (number > (uintmax_t)SIZE_MAX >> shift) { + return (ARCHIVE_WARN); + } + *numberp = (size_t)(number << shift); + return (ARCHIVE_OK); } /* @@ -182,14 +235,14 @@ archive_compressor_zstd_options(struct archive_write_filter *f, const char *key, 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_COMPRESSOR +#if HAVE_ZSTD_H && HAVE_ZSTD_compressStream maximum = ZSTD_maxCLevel(); #if ZSTD_VERSION_NUMBER >= MINVER_MINCLEVEL if (ZSTD_versionNumber() >= MINVER_MINCLEVEL) { @@ -204,21 +257,69 @@ archive_compressor_zstd_options(struct archive_write_filter *f, const char *key, 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) { - int threads = atoi(value); - if (string_is_numeric(value) != ARCHIVE_OK) { + intmax_t threads; + if (string_to_number(value, &threads) != ARCHIVE_OK) { return (ARCHIVE_WARN); } - - int minimum = 0; - - if (threads < minimum) { + if (threads < 0) { return (ARCHIVE_WARN); } - - data->threads = threads; + data->threads = (int)threads; + return (ARCHIVE_OK); +#if HAVE_ZSTD_H && HAVE_ZSTD_compressStream + } else if (strcmp(key, "frame-per-file") == 0) { + data->frame_per_file = 1; + return (ARCHIVE_OK); + } else if (strcmp(key, "min-frame-in") == 0) { + if (string_to_size(value, &data->min_frame_in) != ARCHIVE_OK) { + return (ARCHIVE_WARN); + } + return (ARCHIVE_OK); + } else if (strcmp(key, "min-frame-out") == 0 || + strcmp(key, "min-frame-size") == 0) { + if (string_to_size(value, &data->min_frame_out) != ARCHIVE_OK) { + return (ARCHIVE_WARN); + } + return (ARCHIVE_OK); + } else if (strcmp(key, "max-frame-in") == 0 || + strcmp(key, "max-frame-size") == 0) { + if (string_to_size(value, &data->max_frame_in) != ARCHIVE_OK || + data->max_frame_in < 1024) { + return (ARCHIVE_WARN); + } + return (ARCHIVE_OK); + } else if (strcmp(key, "max-frame-out") == 0) { + if (string_to_size(value, &data->max_frame_out) != ARCHIVE_OK || + data->max_frame_out < 1024) { + return (ARCHIVE_WARN); + } + return (ARCHIVE_OK); +#endif + } + else if (strcmp(key, "long") == 0) { + intmax_t long_distance; + if (string_to_number(value, &long_distance) != ARCHIVE_OK) { + return (ARCHIVE_WARN); + } +#if HAVE_ZSTD_H && HAVE_ZSTD_compressStream && ZSTD_VERSION_NUMBER >= MINVER_LONG + ZSTD_bounds bounds = ZSTD_cParam_getBounds(ZSTD_c_windowLog); + if (ZSTD_isError(bounds.error)) { + int max_distance = ((int)(sizeof(size_t) == 4 ? 30 : 31)); + if (((int)long_distance) < 10 || (int)long_distance > max_distance) + return (ARCHIVE_WARN); + } else { + if ((int)long_distance < bounds.lowerBound || (int)long_distance > bounds.upperBound) + return (ARCHIVE_WARN); + } +#else + int max_distance = ((int)(sizeof(size_t) == 4 ? 30 : 31)); + if (((int)long_distance) < 10 || (int)long_distance > max_distance) + return (ARCHIVE_WARN); +#endif + data->long_distance = (int)long_distance; return (ARCHIVE_OK); } @@ -228,7 +329,7 @@ archive_compressor_zstd_options(struct archive_write_filter *f, const char *key, return (ARCHIVE_WARN); } -#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR +#if HAVE_ZSTD_H && HAVE_ZSTD_compressStream /* * Setup callback. */ @@ -270,6 +371,10 @@ archive_compressor_zstd_open(struct archive_write_filter *f) ZSTD_CCtx_setParameter(data->cstream, ZSTD_c_nbWorkers, data->threads); +#if ZSTD_VERSION_NUMBER >= MINVER_LONG + ZSTD_CCtx_setParameter(data->cstream, ZSTD_c_windowLog, data->long_distance); +#endif + return (ARCHIVE_OK); } @@ -281,15 +386,25 @@ archive_compressor_zstd_write(struct archive_write_filter *f, const void *buff, 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) { + if (data->cur_frame_in > data->min_frame_in && + data->cur_frame_out > data->min_frame_out) { + data->state = finishing; + } + } + return (drive_compressor(f, data, 1, NULL, 0)); } /* @@ -300,60 +415,77 @@ archive_compressor_zstd_close(struct archive_write_filter *f) { 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); - if (ret != ARCHIVE_OK) - return (ARCHIVE_FATAL); - data->out.pos = 0; + 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; } - - /* 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); + 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) { + if (data->cur_frame_in >= data->max_frame_in || + data->cur_frame_out >= data->max_frame_out) { + 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) + goto fatal; + data->out.pos = 0; + } } +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_COMPRESSOR */ +#else /* HAVE_ZSTD_H && HAVE_ZSTD_compressStream */ static int archive_compressor_zstd_open(struct archive_write_filter *f) @@ -367,17 +499,9 @@ archive_compressor_zstd_open(struct archive_write_filter *f) 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) { @@ -385,11 +509,11 @@ archive_compressor_zstd_open(struct archive_write_filter *f) } if (data->threads != 0) { - struct archive_string as2; - archive_string_init(&as2); - archive_string_sprintf(&as2, " --threads=%d", data->threads); - archive_string_concat(&as, &as2); - archive_string_free(&as2); + archive_string_sprintf(&as, " --threads=%d", data->threads); + } + + if (data->long_distance != 0) { + archive_string_sprintf(&as, " --long=%d", data->long_distance); } f->write = archive_compressor_zstd_write; @@ -408,6 +532,14 @@ archive_compressor_zstd_write(struct archive_write_filter *f, const void *buff, } 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; @@ -415,4 +547,4 @@ archive_compressor_zstd_close(struct archive_write_filter *f) return __archive_write_program_close(f, data->pdata); } -#endif /* HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR */ +#endif /* HAVE_ZSTD_H && HAVE_ZSTD_compressStream */ diff --git a/libarchive/archive_write_blocksize.3 b/libarchive/archive_write_blocksize.3 index 4973f9990566..3508851cefab 100644 --- a/libarchive/archive_write_blocksize.3 +++ b/libarchive/archive_write_blocksize.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_WRITE_BLOCKSIZE 3 .Os diff --git a/libarchive/archive_write_data.3 b/libarchive/archive_write_data.3 index bc208b45d53a..9f239f7c9ece 100644 --- a/libarchive/archive_write_data.3 +++ b/libarchive/archive_write_data.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 28, 2017 .Dt ARCHIVE_WRITE_DATA 3 .Os diff --git a/libarchive/archive_write_disk.3 b/libarchive/archive_write_disk.3 index 97f3fcde9f88..b046168c338c 100644 --- a/libarchive/archive_write_disk.3 +++ b/libarchive/archive_write_disk.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd January 19, 2020 .Dt ARCHIVE_WRITE_DISK 3 .Os diff --git a/libarchive/archive_write_disk_posix.c b/libarchive/archive_write_disk_posix.c index dd7eb9a5e840..58265ee0dc11 100644 --- a/libarchive/archive_write_disk_posix.c +++ b/libarchive/archive_write_disk_posix.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #if !defined(_WIN32) || defined(__CYGWIN__) @@ -397,6 +396,7 @@ static int set_times_from_entry(struct archive_write_disk *); 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 void close_file_descriptor(struct archive_write_disk *); static int _archive_write_disk_close(struct archive *); static int _archive_write_disk_free(struct archive *); @@ -514,7 +514,12 @@ lazy_stat(struct archive_write_disk *a) * 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); } @@ -1605,12 +1610,12 @@ hfs_write_data_block(struct archive_write_disk *a, const char *buff, "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 @@ -1725,8 +1730,10 @@ _archive_write_disk_finish_entry(struct archive *_a) 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 { @@ -1735,6 +1742,7 @@ _archive_write_disk_finish_entry(struct archive *_a) a->filesize == 0) { archive_set_error(&a->archive, errno, "File size could not be restored"); + close_file_descriptor(a); return (ARCHIVE_FAILED); } #endif @@ -1744,8 +1752,10 @@ _archive_write_disk_finish_entry(struct archive *_a) * 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) { @@ -1753,11 +1763,13 @@ _archive_write_disk_finish_entry(struct archive *_a) 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,6 +2008,8 @@ archive_write_disk_new(void) free(a); return (NULL); } + a->path_safe.s[0] = 0; + #ifdef HAVE_ZLIB_H a->decmpfs_compression_level = 5; #endif @@ -2152,7 +2166,11 @@ restore_entry(struct archive_write_disk *a) * 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"); @@ -2548,7 +2566,12 @@ _archive_write_disk_close(struct archive *_a) 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; @@ -2563,7 +2586,12 @@ _archive_write_disk_close(struct archive *_a) 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; @@ -2783,8 +2811,8 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr, !(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); @@ -2793,7 +2821,7 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr, char *tail; char *head; int last; - char c; + char c = '\0'; int r; struct stat st; int chdir_fd; @@ -2857,8 +2885,10 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr, /* 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; @@ -3556,7 +3586,9 @@ set_time(int fd, int mode, const char *name, (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 @@ -4389,7 +4421,12 @@ fixup_appledouble(struct archive_write_disk *a, const char *pathname) */ 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; @@ -4705,5 +4742,17 @@ archive_write_disk_set_acls(struct archive *a, int fd, const char *name, } #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__ */ diff --git a/libarchive/archive_write_disk_private.h b/libarchive/archive_write_disk_private.h index 557d7e2bf34f..3efe2bad336a 100644 --- a/libarchive/archive_write_disk_private.h +++ b/libarchive/archive_write_disk_private.h @@ -22,8 +22,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/archive_write_disk_private.h 201086 2009-12-28 02:17:53Z kientzle $ */ #ifndef ARCHIVE_WRITE_DISK_PRIVATE_H_INCLUDED diff --git a/libarchive/archive_write_disk_set_standard_lookup.c b/libarchive/archive_write_disk_set_standard_lookup.c index 5fccdb9dc658..964169898e45 100644 --- a/libarchive/archive_write_disk_set_standard_lookup.c +++ b/libarchive/archive_write_disk_set_standard_lookup.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_disk_set_standard_lookup.c 201083 2009-12-28 02:09:57Z kientzle $"); #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> diff --git a/libarchive/archive_write_disk_windows.c b/libarchive/archive_write_disk_windows.c index 1b12a299ca23..774151ae22b9 100644 --- a/libarchive/archive_write_disk_windows.c +++ b/libarchive/archive_write_disk_windows.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #if defined(_WIN32) && !defined(__CYGWIN__) @@ -254,9 +253,9 @@ static ssize_t _archive_write_disk_data_block(struct archive *, const void *, * 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, @@ -266,6 +265,9 @@ file_information(struct archive_write_disk *a, wchar_t *path, 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); @@ -290,14 +292,27 @@ file_information(struct archive_write_disk *a, wchar_t *path, (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) { @@ -559,6 +574,7 @@ la_mktemp(struct archive_write_disk *a) return (fd); } +#if _WIN32_WINNT < _WIN32_WINNT_VISTA static void * la_GetFunctionKernel32(const char *name) { @@ -574,18 +590,24 @@ la_GetFunctionKernel32(const char *name) } 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); @@ -624,7 +646,6 @@ static int 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; size_t len; DWORD attrs = 0; @@ -632,10 +653,20 @@ la_CreateSymbolicLinkW(const wchar_t *linkname, const wchar_t *target, 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); @@ -1185,6 +1216,8 @@ _archive_write_disk_finish_entry(struct archive *_a) 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); } } @@ -1370,6 +1403,7 @@ archive_write_disk_new(void) free(a); return (NULL); } + a->path_safe.s[0] = 0; return (&a->archive); } @@ -1655,6 +1689,9 @@ create_filesystem_object(struct archive_write_disk *a) 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. */ @@ -1718,8 +1755,16 @@ create_filesystem_object(struct archive_write_disk *a) 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; @@ -1782,14 +1827,27 @@ create_filesystem_object(struct archive_write_disk *a) 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) { @@ -2154,6 +2212,8 @@ check_symlinks(struct archive_write_disk *a) return (ARCHIVE_FAILED); } } + if (!c) + break; pn[0] = c; pn++; } @@ -2258,6 +2318,9 @@ cleanup_pathname(struct archive_write_disk *a, wchar_t *name) 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 @@ -2531,7 +2594,7 @@ set_times(struct archive_write_disk *a, { #define EPOC_TIME ARCHIVE_LITERAL_ULL(116444736000000000) #define WINTIME(sec, nsec) ((Int32x32To64(sec, 10000000) + EPOC_TIME)\ - + (((nsec)/1000)*10)) + + ((nsec)/100)) HANDLE hw = 0; ULARGE_INTEGER wintm; @@ -2545,14 +2608,25 @@ set_times(struct archive_write_disk *a, 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; diff --git a/libarchive/archive_write_filter.3 b/libarchive/archive_write_filter.3 index c83eb77b6a5e..b39cabe04782 100644 --- a/libarchive/archive_write_filter.3 +++ b/libarchive/archive_write_filter.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd August 14, 2014 .Dt ARCHIVE_WRITE_FILTER 3 .Os diff --git a/libarchive/archive_write_finish_entry.3 b/libarchive/archive_write_finish_entry.3 index 5797e16a6dbc..574d6008581e 100644 --- a/libarchive/archive_write_finish_entry.3 +++ b/libarchive/archive_write_finish_entry.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 28, 2017 .Dt ARCHIVE_WRITE_FINISH_ENTRY 3 .Os diff --git a/libarchive/archive_write_format.3 b/libarchive/archive_write_format.3 index 653089f7795d..9e331368aeef 100644 --- a/libarchive/archive_write_format.3 +++ b/libarchive/archive_write_format.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 14, 2013 .Dt ARCHIVE_WRITE_FORMAT 3 .Os diff --git a/libarchive/archive_write_free.3 b/libarchive/archive_write_free.3 index 5210e2a633de..f6b84eae918f 100644 --- a/libarchive/archive_write_free.3 +++ b/libarchive/archive_write_free.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_WRITE_FREE 3 .Os diff --git a/libarchive/archive_write_header.3 b/libarchive/archive_write_header.3 index 2217b1871bba..9c6ecec4e097 100644 --- a/libarchive/archive_write_header.3 +++ b/libarchive/archive_write_header.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_WRITE_HEADER 3 .Os diff --git a/libarchive/archive_write_new.3 b/libarchive/archive_write_new.3 index 788cbb855985..15a7c40703bf 100644 --- a/libarchive/archive_write_new.3 +++ b/libarchive/archive_write_new.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_WRITE_NEW 3 .Os diff --git a/libarchive/archive_write_open.3 b/libarchive/archive_write_open.3 index 29bffe49eb97..b12d097028c0 100644 --- a/libarchive/archive_write_open.3 +++ b/libarchive/archive_write_open.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd November 12, 2020 .Dt ARCHIVE_WRITE_OPEN 3 .Os @@ -218,6 +216,7 @@ On failure, the callback should invoke .Fn archive_set_error to register an error code and message and return +.Cm ARCHIVE_FATAL . .Bl -item -offset indent .It .Ft typedef int diff --git a/libarchive/archive_write_open_fd.c b/libarchive/archive_write_open_fd.c index b8d491faa273..a58ae047967b 100644 --- a/libarchive/archive_write_open_fd.c +++ b/libarchive/archive_write_open_fd.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_open_fd.c 201093 2009-12-28 02:28:44Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> diff --git a/libarchive/archive_write_open_file.c b/libarchive/archive_write_open_file.c index bf5b55a672e9..d787da3af388 100644 --- a/libarchive/archive_write_open_file.c +++ b/libarchive/archive_write_open_file.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_open_file.c,v 1.19 2007/01/09 08:05:56 kientzle Exp $"); #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> diff --git a/libarchive/archive_write_open_filename.c b/libarchive/archive_write_open_filename.c index 9ceefb19bc9d..7dc73d55f43e 100644 --- a/libarchive/archive_write_open_filename.c +++ b/libarchive/archive_write_open_filename.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_open_filename.c 191165 2009-04-17 00:39:35Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> diff --git a/libarchive/archive_write_open_memory.c b/libarchive/archive_write_open_memory.c index a8a0b817fc25..609cc47d964a 100644 --- a/libarchive/archive_write_open_memory.c +++ b/libarchive/archive_write_open_memory.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_open_memory.c,v 1.3 2007/01/09 08:05:56 kientzle Exp $"); #include <errno.h> #include <stdlib.h> diff --git a/libarchive/archive_write_private.h b/libarchive/archive_write_private.h index 155fdd734887..abd5a8ddcd85 100644 --- a/libarchive/archive_write_private.h +++ b/libarchive/archive_write_private.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/archive_write_private.h 201155 2009-12-29 05:20:12Z kientzle $ */ #ifndef ARCHIVE_WRITE_PRIVATE_H_INCLUDED @@ -53,6 +51,7 @@ struct archive_write_filter { 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; diff --git a/libarchive/archive_write_set_format.c b/libarchive/archive_write_set_format.c index 1f65fa4a77eb..f636cff74714 100644 --- a/libarchive/archive_write_set_format.c +++ b/libarchive/archive_write_set_format.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format.c 201168 2009-12-29 06:15:32Z kientzle $"); #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> diff --git a/libarchive/archive_write_set_format_7zip.c b/libarchive/archive_write_set_format_7zip.c index d5ca9a665654..c0ea9d6b1548 100644 --- a/libarchive/archive_write_set_format_7zip.c +++ b/libarchive/archive_write_set_format_7zip.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include <errno.h> @@ -91,6 +90,26 @@ __FBSDID("$FreeBSD$"); #define kAttributes 0x15 #define kEncodedHeader 0x17 +// Check that some windows file attribute constants are defined. +// Reference: https://learn.microsoft.com/en-us/windows/win32/fileio/file-attribute-constants +#ifndef FILE_ATTRIBUTE_READONLY +#define FILE_ATTRIBUTE_READONLY 0x00000001 +#endif + +#ifndef FILE_ATTRIBUTE_DIRECTORY +#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 +#endif + +#ifndef FILE_ATTRIBUTE_ARCHIVE +#define FILE_ATTRIBUTE_ARCHIVE 0x00000020 +#endif + +// This value is defined in 7zip with the comment "trick for Unix". +// +// 7z archives created on unix have this bit set in the high 16 bits of +// the attr field along with the unix permissions. +#define FILE_ATTRIBUTE_UNIX_EXTENSION 0x8000 + enum la_zaction { ARCHIVE_Z_FINISH, ARCHIVE_Z_RUN @@ -165,7 +184,7 @@ struct file { mode_t mode; uint32_t crc32; - signed int dir:1; + unsigned dir:1; }; struct _7zip { @@ -1424,14 +1443,19 @@ make_header(struct archive_write *a, uint64_t offset, uint64_t pack_size, * High 16bits is unix mode. * Low 16bits is Windows attributes. */ - uint32_t encattr, attr; + uint32_t encattr, attr = 0; + if (file->dir) - attr = 0x8010; + attr |= FILE_ATTRIBUTE_DIRECTORY; else - attr = 0x8020; + attr |= FILE_ATTRIBUTE_ARCHIVE; + if ((file->mode & 0222) == 0) - attr |= 1;/* Read Only. */ + attr |= FILE_ATTRIBUTE_READONLY; + + attr |= FILE_ATTRIBUTE_UNIX_EXTENSION; attr |= ((uint32_t)file->mode) << 16; + archive_le32enc(&encattr, attr); r = (int)compress_out(a, &encattr, 4, ARCHIVE_Z_RUN); if (r < 0) @@ -1809,11 +1833,11 @@ compression_init_encoder_bzip2(struct archive *a, * 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 +1866,11 @@ compression_code_bzip2(struct archive *a, * 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, diff --git a/libarchive/archive_write_set_format_ar.c b/libarchive/archive_write_set_format_ar.c index fc0de1e9f6f0..38689d89be0e 100644 --- a/libarchive/archive_write_set_format_ar.c +++ b/libarchive/archive_write_set_format_ar.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_ar.c 201108 2009-12-28 03:28:21Z kientzle $"); #ifdef HAVE_ERRNO_H #include <errno.h> diff --git a/libarchive/archive_write_set_format_by_name.c b/libarchive/archive_write_set_format_by_name.c index bfb4b3545f2c..09519b123894 100644 --- a/libarchive/archive_write_set_format_by_name.c +++ b/libarchive/archive_write_set_format_by_name.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_by_name.c 201168 2009-12-29 06:15:32Z kientzle $"); #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> diff --git a/libarchive/archive_write_set_format_cpio_binary.c b/libarchive/archive_write_set_format_cpio_binary.c index d6ce35a7bc1f..7a010ee00f22 100644 --- a/libarchive/archive_write_set_format_cpio_binary.c +++ b/libarchive/archive_write_set_format_cpio_binary.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_cpio.c 201170 2009-12-29 06:34:23Z kientzle $"); #ifdef HAVE_ERRNO_H #include <errno.h> diff --git a/libarchive/archive_write_set_format_cpio_newc.c b/libarchive/archive_write_set_format_cpio_newc.c index f0f39809dad4..006736a1fa22 100644 --- a/libarchive/archive_write_set_format_cpio_newc.c +++ b/libarchive/archive_write_set_format_cpio_newc.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_cpio_newc.c 201160 2009-12-29 05:41:57Z kientzle $"); #ifdef HAVE_ERRNO_H #include <errno.h> diff --git a/libarchive/archive_write_set_format_cpio_odc.c b/libarchive/archive_write_set_format_cpio_odc.c index 091925a2f9f2..426f779a2b0b 100644 --- a/libarchive/archive_write_set_format_cpio_odc.c +++ b/libarchive/archive_write_set_format_cpio_odc.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_cpio.c 201170 2009-12-29 06:34:23Z kientzle $"); #ifdef HAVE_ERRNO_H #include <errno.h> diff --git a/libarchive/archive_write_set_format_filter_by_ext.c b/libarchive/archive_write_set_format_filter_by_ext.c index 9fe21e4542a0..1bb33b04bf91 100644 --- a/libarchive/archive_write_set_format_filter_by_ext.c +++ b/libarchive/archive_write_set_format_filter_by_ext.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_by_name.c 201168 2009-12-29 06:15:32Z kientzle $"); #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> diff --git a/libarchive/archive_write_set_format_gnutar.c b/libarchive/archive_write_set_format_gnutar.c index ec29c5c418e4..92b06c5f5fb4 100644 --- a/libarchive/archive_write_set_format_gnutar.c +++ b/libarchive/archive_write_set_format_gnutar.c @@ -27,8 +27,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_gnu_tar.c 191579 2009-04-27 18:35:03Z gastal $"); - #ifdef HAVE_ERRNO_H #include <errno.h> diff --git a/libarchive/archive_write_set_format_iso9660.c b/libarchive/archive_write_set_format_iso9660.c index 58b7216a8071..2a3ae07fa2b2 100644 --- a/libarchive/archive_write_set_format_iso9660.c +++ b/libarchive/archive_write_set_format_iso9660.c @@ -289,12 +289,12 @@ struct isoent { 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 @@ struct iso_option { #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 @@ struct iso9660 { 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 @@ struct iso9660 { /* 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 @@ get_gmoffset(struct tm *tm) 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 @@ write_information_block(struct archive_write *a) } 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 @@ -7802,8 +7798,8 @@ struct zisofs_extract { 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; diff --git a/libarchive/archive_write_set_format_mtree.c b/libarchive/archive_write_set_format_mtree.c index 619b7714eeba..6db9d27848af 100644 --- a/libarchive/archive_write_set_format_mtree.c +++ b/libarchive/archive_write_set_format_mtree.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_mtree.c 201171 2009-12-29 06:39:07Z kientzle $"); #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> diff --git a/libarchive/archive_write_set_format_pax.c b/libarchive/archive_write_set_format_pax.c index 52911491f65f..e93333074a6a 100644 --- a/libarchive/archive_write_set_format_pax.c +++ b/libarchive/archive_write_set_format_pax.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_pax.c 201162 2009-12-29 05:47:46Z kientzle $"); #ifdef HAVE_ERRNO_H #include <errno.h> @@ -100,6 +99,7 @@ static int has_non_ASCII(const char *); 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. @@ -367,10 +367,12 @@ archive_write_pax_header_xattr(struct pax *pax, const char *encoded_name, struct archive_string s; char *encoded_value; + if (encoded_name == NULL) + return; + if (pax->flags & WRITE_LIBARCHIVE_XATTR) { encoded_value = base64_encode((const char *)value, value_len); - - if (encoded_name != NULL && encoded_value != NULL) { + if (encoded_value != NULL) { archive_string_init(&s); archive_strcpy(&s, "LIBARCHIVE.xattr."); archive_strcat(&s, encoded_name); @@ -403,17 +405,22 @@ archive_write_pax_header_xattrs(struct archive_write *a, archive_entry_xattr_next(entry, &name, &value, &size); url_encoded_name = url_encode(name); - if (url_encoded_name != NULL) { + if (url_encoded_name == NULL) + goto malloc_error; + else { /* Convert narrow-character to UTF-8. */ r = archive_strcpy_l(&(pax->l_url_encoded_name), url_encoded_name, pax->sconv_utf8); free(url_encoded_name); /* Done with this. */ if (r == 0) encoded_name = pax->l_url_encoded_name.s; - else if (errno == ENOMEM) { - archive_set_error(&a->archive, ENOMEM, - "Can't allocate memory for Linkname"); - return (ARCHIVE_FATAL); + else if (r == -1) + goto malloc_error; + else { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_MISC, + "Error encoding pax extended attribute"); + return (ARCHIVE_FAILED); } } @@ -422,6 +429,9 @@ archive_write_pax_header_xattrs(struct archive_write *a, } return (ARCHIVE_OK); +malloc_error: + archive_set_error(&a->archive, ENOMEM, "Can't allocate memory"); + return (ARCHIVE_FATAL); } static int @@ -595,6 +605,8 @@ archive_write_pax_header(struct archive_write *a, 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, @@ -1116,16 +1128,13 @@ archive_write_pax_header(struct archive_write *a, } /* - * 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. */ @@ -1190,7 +1199,7 @@ archive_write_pax_header(struct archive_write *a, 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), @@ -1428,7 +1437,7 @@ archive_write_pax_header(struct archive_write *a, /* 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. */ @@ -1717,7 +1726,7 @@ build_pax_attribute_name(char *dest, const char *src) * 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"); @@ -1904,14 +1913,19 @@ url_encode(const char *in) { const char *s; char *d; - int out_len = 0; + size_t out_len = 0; char *out; for (s = in; *s != '\0'; s++) { - if (*s < 33 || *s > 126 || *s == '%' || *s == '=') + if (*s < 33 || *s > 126 || *s == '%' || *s == '=') { + if (SIZE_MAX - out_len < 4) + return (NULL); out_len += 3; - else + } else { + if (SIZE_MAX - out_len < 2) + return (NULL); out_len++; + } } out = (char *)malloc(out_len + 1); @@ -2046,3 +2060,18 @@ sparse_list_add(struct pax *pax, int64_t offset, int64_t length) 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; +} diff --git a/libarchive/archive_write_set_format_private.h b/libarchive/archive_write_set_format_private.h index e20022755f8b..ef9dee9d808c 100644 --- a/libarchive/archive_write_set_format_private.h +++ b/libarchive/archive_write_set_format_private.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #ifndef ARCHIVE_WRITE_SET_FORMAT_PRIVATE_H_INCLUDED diff --git a/libarchive/archive_write_set_format_shar.c b/libarchive/archive_write_set_format_shar.c index 9e4931c95c1f..52ea6adc2264 100644 --- a/libarchive/archive_write_set_format_shar.c +++ b/libarchive/archive_write_set_format_shar.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_shar.c 189438 2009-03-06 05:58:56Z kientzle $"); #ifdef HAVE_ERRNO_H #include <errno.h> diff --git a/libarchive/archive_write_set_format_ustar.c b/libarchive/archive_write_set_format_ustar.c index d1a06bc4f7ec..673487b27fe3 100644 --- a/libarchive/archive_write_set_format_ustar.c +++ b/libarchive/archive_write_set_format_ustar.c @@ -25,8 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_ustar.c 191579 2009-04-27 18:35:03Z kientzle $"); - #ifdef HAVE_ERRNO_H #include <errno.h> diff --git a/libarchive/archive_write_set_format_v7tar.c b/libarchive/archive_write_set_format_v7tar.c index 599407144121..e3724a096da7 100644 --- a/libarchive/archive_write_set_format_v7tar.c +++ b/libarchive/archive_write_set_format_v7tar.c @@ -25,8 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_ERRNO_H #include <errno.h> diff --git a/libarchive/archive_write_set_format_warc.c b/libarchive/archive_write_set_format_warc.c index 46b05734121c..3d22e1f4ba57 100644 --- a/libarchive/archive_write_set_format_warc.c +++ b/libarchive/archive_write_set_format_warc.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include <errno.h> @@ -329,30 +328,21 @@ xstrftime(struct archive_string *as, const char *fmt, time_t t) { /** 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); diff --git a/libarchive/archive_write_set_format_xar.c b/libarchive/archive_write_set_format_xar.c index d885f5c256d3..2cf655da186a 100644 --- a/libarchive/archive_write_set_format_xar.c +++ b/libarchive/archive_write_set_format_xar.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include <errno.h> @@ -212,8 +211,8 @@ struct file { 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 +905,11 @@ xmlwrite_time(struct archive_write *a, xmlTextWriterPtr writer, { 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 diff --git a/libarchive/archive_write_set_format_zip.c b/libarchive/archive_write_set_format_zip.c index 8c14a7027eba..e37e7b5edda1 100644 --- a/libarchive/archive_write_set_format_zip.c +++ b/libarchive/archive_write_set_format_zip.c @@ -30,7 +30,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_zip.c 201168 2009-12-29 06:15:32Z kientzle $"); #ifdef HAVE_ERRNO_H #include <errno.h> @@ -132,7 +131,6 @@ struct zip { enum compression entry_compression; enum encryption entry_encryption; int entry_flags; - int entry_uses_zip64; int experiments; struct trad_enc_ctx tctx; char tctx_valid; @@ -523,6 +521,7 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) int ret, ret2 = ARCHIVE_OK; mode_t type; int version_needed = 10; +#define MIN_VERSION_NEEDED(x) do { if (version_needed < x) { version_needed = x; } } while (0) /* Ignore types of entries that we don't support. */ type = archive_entry_filetype(entry); @@ -557,12 +556,12 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) /* Reset information from last entry. */ zip->entry_offset = zip->written_bytes; zip->entry_uncompressed_limit = INT64_MAX; + /* Zero size values implies that we're using a trailing data descriptor */ zip->entry_compressed_size = 0; zip->entry_uncompressed_size = 0; zip->entry_compressed_written = 0; zip->entry_uncompressed_written = 0; zip->entry_flags = 0; - zip->entry_uses_zip64 = 0; zip->entry_crc32 = zip->crc32func(0, NULL, 0); zip->entry_encryption = 0; archive_entry_free(zip->entry); @@ -672,11 +671,11 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) zip->entry_crc32 = zip->crc32func(zip->entry_crc32, (const unsigned char *)slink, slink_size); zip->entry_compression = COMPRESSION_STORE; - version_needed = 20; + MIN_VERSION_NEEDED(20); } else if (type != AE_IFREG) { zip->entry_compression = COMPRESSION_STORE; zip->entry_uncompressed_limit = 0; - version_needed = 20; + MIN_VERSION_NEEDED(20); } else if (archive_entry_size_is_set(zip->entry)) { int64_t size = archive_entry_size(zip->entry); int64_t additional_size = 0; @@ -689,27 +688,27 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) if (zip->entry_compression == COMPRESSION_STORE) { zip->entry_compressed_size = size; zip->entry_uncompressed_size = size; - version_needed = 10; + MIN_VERSION_NEEDED(10); } else { zip->entry_uncompressed_size = size; - version_needed = 20; + MIN_VERSION_NEEDED(20); } if (zip->entry_flags & ZIP_ENTRY_FLAG_ENCRYPTED) { switch (zip->entry_encryption) { case ENCRYPTION_TRADITIONAL: additional_size = TRAD_HEADER_SIZE; - version_needed = 20; + MIN_VERSION_NEEDED(20); break; case ENCRYPTION_WINZIP_AES128: additional_size = WINZIP_AES128_HEADER_SIZE + AUTH_CODE_SIZE; - version_needed = 20; + MIN_VERSION_NEEDED(20); break; case ENCRYPTION_WINZIP_AES256: additional_size = WINZIP_AES256_HEADER_SIZE + AUTH_CODE_SIZE; - version_needed = 20; + MIN_VERSION_NEEDED(20); break; case ENCRYPTION_NONE: default: @@ -733,8 +732,7 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) || (zip->entry_uncompressed_size + additional_size > ZIP_4GB_MAX) || (zip->entry_uncompressed_size > ZIP_4GB_MAX_UNCOMPRESSED && zip->entry_compression != COMPRESSION_STORE)) { - zip->entry_uses_zip64 = 1; - version_needed = 45; + MIN_VERSION_NEEDED(45); } /* We may know the size, but never the CRC. */ @@ -742,7 +740,6 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) } else { /* 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 = zip->requested_compression; @@ -752,12 +749,12 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) zip->entry_flags |= ZIP_ENTRY_FLAG_LENGTH_AT_END; if ((zip->flags & ZIP_FLAG_AVOID_ZIP64) == 0) { - zip->entry_uses_zip64 = 1; - version_needed = 45; + /* We might use zip64 extensions, so require 4.5 */ + MIN_VERSION_NEEDED(45); } else if (zip->entry_compression == COMPRESSION_STORE) { - version_needed = 10; + MIN_VERSION_NEEDED(10); } else { - version_needed = 20; + MIN_VERSION_NEEDED(20); } if (zip->entry_flags & ZIP_ENTRY_FLAG_ENCRYPTED) { @@ -765,8 +762,7 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) case ENCRYPTION_TRADITIONAL: case ENCRYPTION_WINZIP_AES128: case ENCRYPTION_WINZIP_AES256: - if (version_needed < 20) - version_needed = 20; + MIN_VERSION_NEEDED(20); break; case ENCRYPTION_NONE: default: @@ -787,16 +783,8 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) archive_le16enc(local_header + 8, zip->entry_compression); archive_le32enc(local_header + 10, dos_time(archive_entry_mtime(zip->entry))); - archive_le32enc(local_header + 14, zip->entry_crc32); - if (zip->entry_uses_zip64) { - /* Zip64 data in the local header "must" include both - * compressed and uncompressed sizes AND those fields - * are included only if these are 0xffffffff; - * THEREFORE these must be set this way, even if we - * know one of them is smaller. */ - archive_le32enc(local_header + 18, ZIP_4GB_MAX); - archive_le32enc(local_header + 22, ZIP_4GB_MAX); - } else { + if ((zip->entry_flags & ZIP_ENTRY_FLAG_LENGTH_AT_END) == 0) { + archive_le32enc(local_header + 14, zip->entry_crc32); archive_le32enc(local_header + 18, (uint32_t)zip->entry_compressed_size); archive_le32enc(local_header + 22, (uint32_t)zip->entry_uncompressed_size); } @@ -842,42 +830,19 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) * the local file header and the central directory. * We format them once and then duplicate them. */ - /* UT timestamp, length depends on what timestamps are set. */ - memcpy(e, "UT", 2); - archive_le16enc(e + 2, - 1 - + (archive_entry_mtime_is_set(entry) ? 4 : 0) - + (archive_entry_atime_is_set(entry) ? 4 : 0) - + (archive_entry_ctime_is_set(entry) ? 4 : 0)); - e += 4; - *e++ = - (archive_entry_mtime_is_set(entry) ? 1 : 0) - | (archive_entry_atime_is_set(entry) ? 2 : 0) - | (archive_entry_ctime_is_set(entry) ? 4 : 0); - if (archive_entry_mtime_is_set(entry)) { - archive_le32enc(e, (uint32_t)archive_entry_mtime(entry)); - e += 4; - } - if (archive_entry_atime_is_set(entry)) { - archive_le32enc(e, (uint32_t)archive_entry_atime(entry)); + /* ux Unix extra data, length 11, version 1 */ + if (archive_entry_uid_is_set(entry) || archive_entry_gid_is_set(entry)) { + /* TODO: If uid < 64k, use 2 bytes, ditto for gid. */ + memcpy(e, "ux\013\000\001", 5); + e += 5; + *e++ = 4; /* Length of following UID */ + archive_le32enc(e, (uint32_t)archive_entry_uid(entry)); e += 4; - } - if (archive_entry_ctime_is_set(entry)) { - archive_le32enc(e, (uint32_t)archive_entry_ctime(entry)); + *e++ = 4; /* Length of following GID */ + archive_le32enc(e, (uint32_t)archive_entry_gid(entry)); e += 4; } - /* ux Unix extra data, length 11, version 1 */ - /* TODO: If uid < 64k, use 2 bytes, ditto for gid. */ - memcpy(e, "ux\013\000\001", 5); - e += 5; - *e++ = 4; /* Length of following UID */ - archive_le32enc(e, (uint32_t)archive_entry_uid(entry)); - e += 4; - *e++ = 4; /* Length of following GID */ - archive_le32enc(e, (uint32_t)archive_entry_gid(entry)); - e += 4; - /* AES extra data field: WinZIP AES information, ID=0x9901 */ if ((zip->entry_flags & ZIP_ENTRY_FLAG_ENCRYPTED) && (zip->entry_encryption == ENCRYPTION_WINZIP_AES128 @@ -904,7 +869,7 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) e += 2; } - /* Copy UT ,ux, and AES-extra into central directory as well. */ + /* Copy ux, AES-extra into central directory as well. */ zip->file_header_extra_offset = zip->central_directory_bytes; cd_extra = cd_alloc(zip, e - local_extra); memcpy(cd_extra, local_extra, e - local_extra); @@ -916,17 +881,50 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) * archive_write_zip_finish_entry() below. */ - /* "[Zip64 entry] in the local header MUST include BOTH - * original [uncompressed] and compressed size fields." */ - if (zip->entry_uses_zip64) { - unsigned char *zip64_start = e; - memcpy(e, "\001\000\020\000", 4); + /* UT timestamp: length depends on what timestamps are set. + * This header appears in the Central Directory also, but + * according to Info-Zip specification, the CD form + * only holds mtime, so we format it separately. */ + if (archive_entry_mtime_is_set(entry) + || archive_entry_atime_is_set(entry) + || archive_entry_ctime_is_set(entry)) { + unsigned char *ut = e; + memcpy(e, "UT\000\000", 4); + e += 4; + *e++ = (archive_entry_mtime_is_set(entry) ? 1 : 0) + | (archive_entry_atime_is_set(entry) ? 2 : 0) + | (archive_entry_ctime_is_set(entry) ? 4 : 0); + if (archive_entry_mtime_is_set(entry)) { + archive_le32enc(e, (uint32_t)archive_entry_mtime(entry)); + e += 4; + } + if (archive_entry_atime_is_set(entry)) { + archive_le32enc(e, (uint32_t)archive_entry_atime(entry)); + e += 4; + } + if (archive_entry_ctime_is_set(entry)) { + archive_le32enc(e, (uint32_t)archive_entry_ctime(entry)); + e += 4; + } + archive_le16enc(ut + 2, e - ut - 4); + } + + /* + * Note about Zip64 Extended Information Extra Field: + * Because libarchive always writes in a streaming + * fashion, we never know the CRC when we're writing + * the local header. So we have to use length-at-end, which + * prevents us from putting size information into a Zip64 + * extra field. However, apparently some readers find it + * a helpful clue to have an empty such field so they + * can expect a 64-bit length-at-end marker. + */ + if (archive_entry_size_is_set(zip->entry) + && (zip->entry_uncompressed_size > ZIP_4GB_MAX + || zip->entry_compressed_size > ZIP_4GB_MAX)) { + /* Header ID 0x0001, size 0 */ + memcpy(e, "\001\000\000\000", 4); e += 4; - archive_le64enc(e, zip->entry_uncompressed_size); - e += 8; - archive_le64enc(e, zip->entry_compressed_size); - e += 8; - archive_le16enc(zip64_start + 2, (uint16_t)(e - (zip64_start + 4))); } if (zip->flags & ZIP_FLAG_EXPERIMENT_xl) { @@ -1205,7 +1203,9 @@ archive_write_zip_finish_entry(struct archive_write *a) archive_le32enc(d + 4, 0);/* no CRC.*/ else archive_le32enc(d + 4, zip->entry_crc32); - if (zip->entry_uses_zip64) { + if (zip->entry_compressed_written > ZIP_4GB_MAX + || zip->entry_uncompressed_written > ZIP_4GB_MAX + || zip->flags & ZIP_FLAG_FORCE_ZIP64) { archive_le64enc(d + 8, (uint64_t)zip->entry_compressed_written); archive_le64enc(d + 16, @@ -1224,23 +1224,60 @@ archive_write_zip_finish_entry(struct archive_write *a) return (ARCHIVE_FATAL); } - /* Append Zip64 extra data to central directory information. */ - if (zip->entry_compressed_written > ZIP_4GB_MAX - || zip->entry_uncompressed_written > ZIP_4GB_MAX + /* UT timestamp: Info-Zip specifies that _only_ the mtime should + * be recorded here; ctime and atime are also included in the + * local file descriptor. */ + if (archive_entry_mtime_is_set(zip->entry)) { + unsigned char ut[9]; + unsigned char *u = ut, *ud; + memcpy(u, "UT\005\000\001", 5); + u += 5; + archive_le32enc(u, (uint32_t)archive_entry_mtime(zip->entry)); + u += 4; + ud = cd_alloc(zip, u - ut); + if (ud == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate zip data"); + return (ARCHIVE_FATAL); + } + memcpy(ud, ut, u - ut); + } + + /* Fill in size information in the central directory entry. */ + /* Fix up central directory file header. */ + if (zip->cctx_valid && zip->aes_vendor == AES_VENDOR_AE_2) + archive_le32enc(zip->file_header + 16, 0);/* no CRC.*/ + else + archive_le32enc(zip->file_header + 16, zip->entry_crc32); + /* Truncate to 32 bits; we'll fix up below. */ + archive_le32enc(zip->file_header + 20, (uint32_t)zip->entry_compressed_written); + archive_le32enc(zip->file_header + 24, (uint32_t)zip->entry_uncompressed_written); + archive_le16enc(zip->file_header + 30, + (uint16_t)(zip->central_directory_bytes - zip->file_header_extra_offset)); + archive_le32enc(zip->file_header + 42, (uint32_t)zip->entry_offset); + + /* If any of the values immediately above are too large, we'll + * need to put the corresponding value in a Zip64 extra field + * and set the central directory value to 0xffffffff as a flag. */ + if (zip->entry_compressed_written >= ZIP_4GB_MAX + || zip->entry_uncompressed_written >= ZIP_4GB_MAX || zip->entry_offset > ZIP_4GB_MAX) { unsigned char zip64[32]; unsigned char *z = zip64, *zd; memcpy(z, "\001\000\000\000", 4); z += 4; if (zip->entry_uncompressed_written >= ZIP_4GB_MAX) { + archive_le32enc(zip->file_header + 24, ZIP_4GB_MAX); archive_le64enc(z, zip->entry_uncompressed_written); z += 8; } if (zip->entry_compressed_written >= ZIP_4GB_MAX) { + archive_le32enc(zip->file_header + 20, ZIP_4GB_MAX); archive_le64enc(z, zip->entry_compressed_written); z += 8; } if (zip->entry_offset >= ZIP_4GB_MAX) { + archive_le32enc(zip->file_header + 42, ZIP_4GB_MAX); archive_le64enc(z, zip->entry_offset); z += 8; } @@ -1382,25 +1419,14 @@ dos_time(const time_t unix_time) { 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 diff --git a/libarchive/archive_write_set_options.3 b/libarchive/archive_write_set_options.3 index dd573588d573..454c79671b93 100644 --- a/libarchive/archive_write_set_options.3 +++ b/libarchive/archive_write_set_options.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd January 31, 2020 .Dt ARCHIVE_WRITE_OPTIONS 3 .Os @@ -257,12 +255,22 @@ If supported, the default value is read from The value is interpreted as a decimal integer specifying the compression level. Supported values depend on the library version, common values are from 1 to 22. +.It Cm long +Enables long distance matching. The value is interpreted as a +decimal integer specifying log2 window size in bytes. Values from +10 to 30 for 32 bit, or 31 for 64 bit, are supported. +.It Cm threads +The value is interpreted as a decimal integer specifying the +number of threads for multi-threaded zstd compression. +If set to 0, zstd will attempt to detect and use the number +of physical CPU cores. .El .It Format 7zip .Bl -tag -compact -width indent .It Cm compression The value is one of .Dq store , +.Dq copy , .Dq deflate , .Dq bzip2 , .Dq lzma1 , @@ -270,12 +278,18 @@ The value is one of or .Dq ppmd to indicate how the following entries should be compressed. +The values +.Dq store +and +.Dq copy +are synonyms. Note that this setting is ignored for directories, symbolic links, and other special entries. .It Cm compression-level The value is interpreted as a decimal integer specifying the compression level. -Values between 0 and 9 are supported. +Values between 0 and 9 are supported, with the exception of bzip2 +which only supports values between 1 and 9. The interpretation of the compression level depends on the chosen compression method. .El diff --git a/libarchive/archive_write_set_options.c b/libarchive/archive_write_set_options.c index 962309ada5ce..be2a6063188b 100644 --- a/libarchive/archive_write_set_options.c +++ b/libarchive/archive_write_set_options.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #include "archive_write_private.h" #include "archive_options_private.h" diff --git a/libarchive/archive_write_set_passphrase.3 b/libarchive/archive_write_set_passphrase.3 index 2db77034c76e..629e059b2372 100644 --- a/libarchive/archive_write_set_passphrase.3 +++ b/libarchive/archive_write_set_passphrase.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd September 21, 2014 .Dt ARCHIVE_WRITE_SET_PASSPHRASE 3 .Os diff --git a/libarchive/archive_write_set_passphrase.c b/libarchive/archive_write_set_passphrase.c index 710ecba52c3d..977fc4a9ee6b 100644 --- a/libarchive/archive_write_set_passphrase.c +++ b/libarchive/archive_write_set_passphrase.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include <errno.h> diff --git a/libarchive/config_freebsd.h b/libarchive/config_freebsd.h index 758621c4b68f..d0f3e2300c9d 100644 --- a/libarchive/config_freebsd.h +++ b/libarchive/config_freebsd.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #define __LIBARCHIVE_CONFIG_H_INCLUDED 1 @@ -111,6 +109,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 +123,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 +203,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 +237,7 @@ #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 diff --git a/libarchive/cpio.5 b/libarchive/cpio.5 index c71018b1996e..21c30d78d3c5 100644 --- a/libarchive/cpio.5 +++ b/libarchive/cpio.5 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd December 23, 2011 .Dt CPIO 5 .Os diff --git a/libarchive/filter_fork.h b/libarchive/filter_fork.h index 2bf290c4d9e4..aeab70ae634a 100644 --- a/libarchive/filter_fork.h +++ b/libarchive/filter_fork.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/filter_fork.h 201087 2009-12-28 02:18:26Z kientzle $ */ #ifndef FILTER_FORK_H diff --git a/libarchive/filter_fork_posix.c b/libarchive/filter_fork_posix.c index ac255c4f8b20..c895c08e59b3 100644 --- a/libarchive/filter_fork_posix.c +++ b/libarchive/filter_fork_posix.c @@ -30,8 +30,6 @@ #if defined(HAVE_PIPE) && defined(HAVE_FCNTL) && \ (defined(HAVE_FORK) || defined(HAVE_VFORK) || defined(HAVE_POSIX_SPAWNP)) -__FBSDID("$FreeBSD: head/lib/libarchive/filter_fork.c 182958 2008-09-12 05:33:00Z kientzle $"); - #if defined(HAVE_SYS_TYPES_H) # include <sys/types.h> #endif @@ -76,7 +74,7 @@ int __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; diff --git a/libarchive/filter_fork_windows.c b/libarchive/filter_fork_windows.c index 0b963975b90d..9e49c5655f1d 100644 --- a/libarchive/filter_fork_windows.c +++ b/libarchive/filter_fork_windows.c @@ -31,6 +31,7 @@ #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. */ @@ -224,6 +225,14 @@ fail: __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) diff --git a/libarchive/libarchive-formats.5 b/libarchive/libarchive-formats.5 index 5a118ff5d240..fab2f8660270 100644 --- a/libarchive/libarchive-formats.5 +++ b/libarchive/libarchive-formats.5 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd December 27, 2016 .Dt LIBARCHIVE-FORMATS 5 .Os diff --git a/libarchive/libarchive.3 b/libarchive/libarchive.3 index 649056242285..c67172bf654f 100644 --- a/libarchive/libarchive.3 +++ b/libarchive/libarchive.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd March 18, 2012 .Dt LIBARCHIVE 3 .Os diff --git a/libarchive/libarchive_changes.3 b/libarchive/libarchive_changes.3 index 6bf8db038c73..fd0e721053ca 100644 --- a/libarchive/libarchive_changes.3 +++ b/libarchive/libarchive_changes.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd December 23, 2011 .Dt LIBARCHIVE_CHANGES 3 .Os diff --git a/libarchive/libarchive_internals.3 b/libarchive/libarchive_internals.3 index d672f3e8a64d..d4696f648292 100644 --- a/libarchive/libarchive_internals.3 +++ b/libarchive/libarchive_internals.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd January 26, 2011 .Dt LIBARCHIVE_INTERNALS 3 .Os diff --git a/libarchive/mtree.5 b/libarchive/mtree.5 index 8147796f3100..5ea53613166f 100644 --- a/libarchive/mtree.5 +++ b/libarchive/mtree.5 @@ -26,7 +26,6 @@ .\" SUCH DAMAGE. .\" .\" From: @(#)mtree.8 8.2 (Berkeley) 12/11/93 -.\" $FreeBSD$ .\" .Dd September 4, 2013 .Dt MTREE 5 diff --git a/libarchive/tar.5 b/libarchive/tar.5 index 34ad4f79315e..725a7d68374a 100644 --- a/libarchive/tar.5 +++ b/libarchive/tar.5 @@ -23,8 +23,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd December 27, 2016 .Dt TAR 5 .Os diff --git a/libarchive/test/CMakeLists.txt b/libarchive/test/CMakeLists.txt index 23bcc5bbd173..8209c25a5f8d 100644 --- a/libarchive/test/CMakeLists.txt +++ b/libarchive/test/CMakeLists.txt @@ -98,6 +98,7 @@ IF(ENABLE_TEST) test_read_filter_program.c test_read_filter_program_signature.c test_read_filter_uudecode.c + test_read_filter_uudecode_raw.c test_read_format_7zip.c test_read_format_7zip_encryption_data.c test_read_format_7zip_encryption_header.c @@ -162,6 +163,7 @@ IF(ENABLE_TEST) test_read_format_tar_empty_with_gnulabel.c test_read_format_tar_empty_pax.c test_read_format_tar_filename.c + test_read_format_tar_invalid_pax_size.c test_read_format_tbz.c test_read_format_tgz.c test_read_format_tlz.c @@ -275,6 +277,7 @@ IF(ENABLE_TEST) test_write_format_xar.c test_write_format_xar_empty.c test_write_format_zip.c + test_write_format_zip64_stream.c test_write_format_zip_compression_store.c test_write_format_zip_empty.c test_write_format_zip_empty_zip64.c @@ -282,6 +285,7 @@ IF(ENABLE_TEST) test_write_format_zip_file.c test_write_format_zip_file_zip64.c test_write_format_zip_large.c + test_write_format_zip_stream.c test_write_format_zip_zip64.c test_write_open_memory.c test_write_read_format_zip.c diff --git a/libarchive/test/README b/libarchive/test/README index 1b70c7adba73..facf62030c9c 100644 --- a/libarchive/test/README +++ b/libarchive/test/README @@ -1,5 +1,3 @@ -$FreeBSD: src/lib/libarchive/test/README,v 1.3 2008/01/01 22:28:04 kientzle Exp $ - This is the test harness for libarchive. It compiles into a single program "libarchive_test" that is intended diff --git a/libarchive/test/read_open_memory.c b/libarchive/test/read_open_memory.c index daa3c3a1f02a..6d2468cd10a6 100644 --- a/libarchive/test/read_open_memory.c +++ b/libarchive/test/read_open_memory.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/read_open_memory.c 191183 2009-04-17 01:06:31Z kientzle $"); #include <errno.h> #include <stdlib.h> diff --git a/libarchive/test/test_acl_nfs4.c b/libarchive/test/test_acl_nfs4.c index fdc0191516e1..98d39689df69 100644 --- a/libarchive/test/test_acl_nfs4.c +++ b/libarchive/test/test_acl_nfs4.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Exercise the system-independent portion of the ACL support. diff --git a/libarchive/test/test_acl_pax.c b/libarchive/test/test_acl_pax.c index 8566f55a51a4..659073170fad 100644 --- a/libarchive/test/test_acl_pax.c +++ b/libarchive/test/test_acl_pax.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Exercise the system-independent portion of the ACL support. diff --git a/libarchive/test/test_acl_platform_nfs4.c b/libarchive/test/test_acl_platform_nfs4.c index ae4bb5a10125..18f047b149e6 100644 --- a/libarchive/test/test_acl_platform_nfs4.c +++ b/libarchive/test/test_acl_platform_nfs4.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #if ARCHIVE_ACL_NFS4 #if HAVE_SYS_ACL_H @@ -907,7 +906,7 @@ DEFINE_TEST(test_acl_platform_nfs4) assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); for (i = 0; i < acls_dir_cnt; ++i) { - sprintf(buff, "dir%d", i); + snprintf(buff, sizeof(buff), "dir%d", i); archive_entry_set_pathname(ae, buff); archive_entry_set_filetype(ae, AE_IFDIR); archive_entry_set_perm(ae, 0654); @@ -960,7 +959,7 @@ DEFINE_TEST(test_acl_platform_nfs4) /* Verify single-permission dirs on disk. */ for (i = 0; i < dircnt; ++i) { - sprintf(buff, "dir%d", i); + snprintf(buff, sizeof(buff), "dir%d", i); assertEqualInt(0, stat(buff, &st)); assertEqualInt(st.st_mtime, 123456 + i); #if ARCHIVE_ACL_SUNOS_NFS4 diff --git a/libarchive/test/test_acl_platform_posix1e.c b/libarchive/test/test_acl_platform_posix1e.c index c34f7c2e299d..f23eec0d336a 100644 --- a/libarchive/test/test_acl_platform_posix1e.c +++ b/libarchive/test/test_acl_platform_posix1e.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_acl_freebsd.c 189427 2009-03-06 04:21:23Z kientzle $"); #if ARCHIVE_ACL_POSIX1E #include <sys/acl.h> diff --git a/libarchive/test/test_acl_posix1e.c b/libarchive/test/test_acl_posix1e.c index fa2628dbe794..3f9c9850f495 100644 --- a/libarchive/test/test_acl_posix1e.c +++ b/libarchive/test/test_acl_posix1e.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_acl_basic.c,v 1.6 2008/10/19 00:13:57 kientzle Exp $"); /* * Exercise the system-independent portion of the ACL support. diff --git a/libarchive/test/test_acl_text.c b/libarchive/test/test_acl_text.c index 80728932cb54..f0931adc8adc 100644 --- a/libarchive/test/test_acl_text.c +++ b/libarchive/test/test_acl_text.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Test converting ACLs to text, both wide and non-wide diff --git a/libarchive/test/test_archive_api_feature.c b/libarchive/test/test_archive_api_feature.c index 60773ad04e54..597d0ed40245 100644 --- a/libarchive/test/test_archive_api_feature.c +++ b/libarchive/test/test_archive_api_feature.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_archive_api_feature.c,v 1.5 2008/05/26 17:00:24 kientzle Exp $"); DEFINE_TEST(test_archive_api_feature) { @@ -32,7 +31,7 @@ DEFINE_TEST(test_archive_api_feature) /* This is the (hopefully) final versioning API. */ assertEqualInt(ARCHIVE_VERSION_NUMBER, archive_version_number()); - sprintf(buff, "libarchive %d.%d.%d", + snprintf(buff, sizeof(buff), "libarchive %d.%d.%d", archive_version_number() / 1000000, (archive_version_number() / 1000) % 1000, archive_version_number() % 1000); diff --git a/libarchive/test/test_archive_clear_error.c b/libarchive/test/test_archive_clear_error.c index 66dbe93ec9e8..8b7609e07f2b 100644 --- a/libarchive/test/test_archive_clear_error.c +++ b/libarchive/test/test_archive_clear_error.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_archive_clear_error) { diff --git a/libarchive/test/test_archive_cmdline.c b/libarchive/test/test_archive_cmdline.c index a8236105af0b..e72acb4e9d37 100644 --- a/libarchive/test/test_archive_cmdline.c +++ b/libarchive/test/test_archive_cmdline.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define __LIBARCHIVE_TEST #include "archive_cmdline_private.h" diff --git a/libarchive/test/test_archive_getdate.c b/libarchive/test/test_archive_getdate.c index 9e91b83ba81d..e5b8bf7fa8f8 100644 --- a/libarchive/test/test_archive_getdate.c +++ b/libarchive/test/test_archive_getdate.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #include <time.h> diff --git a/libarchive/test/test_archive_match_owner.c b/libarchive/test/test_archive_match_owner.c index 6bf9c6f08cfd..dc31c525941c 100644 --- a/libarchive/test/test_archive_match_owner.c +++ b/libarchive/test/test_archive_match_owner.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); static void test_uid(void) diff --git a/libarchive/test/test_archive_match_path.c b/libarchive/test/test_archive_match_path.c index 5e9b9a8cbf63..ce48263f7614 100644 --- a/libarchive/test/test_archive_match_path.c +++ b/libarchive/test/test_archive_match_path.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); static void test_exclusion_mbs(void) diff --git a/libarchive/test/test_archive_match_time.c b/libarchive/test/test_archive_match_time.c index c6864b3265e4..25a0623a7e5a 100644 --- a/libarchive/test/test_archive_match_time.c +++ b/libarchive/test/test_archive_match_time.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define __LIBARCHIVE_BUILD 1 #include "archive_getdate.h" @@ -321,6 +320,11 @@ test_newer_ctime_than_file_mbs(void) struct archive_entry *ae; struct archive *m; +#if defined(_WIN32) && !defined(__CYGWIN__) + skipping("Can't set ctime on Windows"); + return; +#endif + if (!assert((m = archive_match_new()) != NULL)) return; if (!assert((ae = archive_entry_new()) != NULL)) { @@ -435,6 +439,11 @@ test_newer_ctime_than_file_wcs(void) struct archive_entry *ae; struct archive *m; +#if defined(_WIN32) && !defined(__CYGWIN__) + skipping("Can't set ctime on Windows"); + return; +#endif + if (!assert((m = archive_match_new()) != NULL)) return; if (!assert((ae = archive_entry_new()) != NULL)) { @@ -782,6 +791,11 @@ test_older_ctime_than_file_mbs(void) struct archive_entry *ae; struct archive *m; +#if defined(_WIN32) && !defined(__CYGWIN__) + skipping("Can't set ctime on Windows"); + return; +#endif + if (!assert((m = archive_match_new()) != NULL)) return; if (!assert((ae = archive_entry_new()) != NULL)) { @@ -897,6 +911,11 @@ test_older_ctime_than_file_wcs(void) struct archive_entry *ae; struct archive *m; +#if defined(_WIN32) && !defined(__CYGWIN__) + skipping("Can't set ctime on Windows"); + return; +#endif + if (!assert((m = archive_match_new()) != NULL)) return; if (!assert((ae = archive_entry_new()) != NULL)) { @@ -1073,6 +1092,11 @@ test_ctime_between_files_mbs(void) struct archive_entry *ae; struct archive *m; +#if defined(_WIN32) && !defined(__CYGWIN__) + skipping("Can't set ctime on Windows"); + return; +#endif + if (!assert((m = archive_match_new()) != NULL)) return; if (!assert((ae = archive_entry_new()) != NULL)) { @@ -1132,6 +1156,11 @@ test_ctime_between_files_wcs(void) struct archive_entry *ae; struct archive *m; +#if defined(_WIN32) && !defined(__CYGWIN__) + skipping("Can't set ctime on Windows"); + return; +#endif + if (!assert((m = archive_match_new()) != NULL)) return; if (!assert((ae = archive_entry_new()) != NULL)) { diff --git a/libarchive/test/test_archive_pathmatch.c b/libarchive/test/test_archive_pathmatch.c index 0116df0288d2..3696d38fcf19 100644 --- a/libarchive/test/test_archive_pathmatch.c +++ b/libarchive/test/test_archive_pathmatch.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #define __LIBARCHIVE_TEST #include "archive_pathmatch.h" diff --git a/libarchive/test/test_archive_read_add_passphrase.c b/libarchive/test/test_archive_read_add_passphrase.c index 0ce5a76aedbc..c9b051101433 100644 --- a/libarchive/test/test_archive_read_add_passphrase.c +++ b/libarchive/test/test_archive_read_add_passphrase.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); struct archive_read; extern void __archive_read_reset_passphrase(struct archive_read *); diff --git a/libarchive/test/test_archive_read_close_twice.c b/libarchive/test/test_archive_read_close_twice.c index 16cc805fe027..2f5ee77f117e 100644 --- a/libarchive/test/test_archive_read_close_twice.c +++ b/libarchive/test/test_archive_read_close_twice.c @@ -24,8 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); - DEFINE_TEST(test_archive_read_close_twice) { diff --git a/libarchive/test/test_archive_read_close_twice_open_fd.c b/libarchive/test/test_archive_read_close_twice_open_fd.c index 3aba31791357..62a6a90df1fa 100644 --- a/libarchive/test/test_archive_read_close_twice_open_fd.c +++ b/libarchive/test/test_archive_read_close_twice_open_fd.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_archive_read_close_twice_open_fd) { diff --git a/libarchive/test/test_archive_read_close_twice_open_filename.c b/libarchive/test/test_archive_read_close_twice_open_filename.c index 9a194fdc4a8b..4824319b42bf 100644 --- a/libarchive/test/test_archive_read_close_twice_open_filename.c +++ b/libarchive/test/test_archive_read_close_twice_open_filename.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_archive_read_close_twice_open_filename) { diff --git a/libarchive/test/test_archive_read_multiple_data_objects.c b/libarchive/test/test_archive_read_multiple_data_objects.c index 9962cf7fdf33..f5adb5b7b567 100644 --- a/libarchive/test/test_archive_read_multiple_data_objects.c +++ b/libarchive/test/test_archive_read_multiple_data_objects.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #if defined(_WIN32) && !defined(__CYGWIN__) #define open _open @@ -185,7 +184,7 @@ file_open(struct archive *a, void *data) mydata->fd = open(mydata->filename, O_RDONLY | O_BINARY); if (mydata->fd >= 0) { - if ((mydata->buffer = (void*)calloc(1, BLOCK_SIZE)) == NULL) + if ((mydata->buffer = (void*)calloc(BLOCK_SIZE, 1)) == NULL) return (ARCHIVE_FAILED); } } @@ -287,7 +286,7 @@ test_customized_multiple_data_objects(void) return; } assert((mydata->filename = - (char *)calloc(1, strlen(filename) + 1)) != NULL); + (char *)calloc(strlen(filename) + 1, sizeof(char))) != NULL); if (mydata->filename == NULL) { free(mydata); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); diff --git a/libarchive/test/test_archive_read_next_header_empty.c b/libarchive/test/test_archive_read_next_header_empty.c index f43cbd934288..ee00291b51cd 100644 --- a/libarchive/test/test_archive_read_next_header_empty.c +++ b/libarchive/test/test_archive_read_next_header_empty.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); static void test_empty_file1(void) diff --git a/libarchive/test/test_archive_read_next_header_raw.c b/libarchive/test/test_archive_read_next_header_raw.c index 1c8af20f8c3e..c3fbb8c21ac4 100644 --- a/libarchive/test/test_archive_read_next_header_raw.c +++ b/libarchive/test/test_archive_read_next_header_raw.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define DATA "random garbage for testing purposes" diff --git a/libarchive/test/test_archive_read_open2.c b/libarchive/test/test_archive_read_open2.c index 0a801ac5d26d..6ba27cc4a134 100644 --- a/libarchive/test/test_archive_read_open2.c +++ b/libarchive/test/test_archive_read_open2.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static int open_cb(struct archive *a, void *client) diff --git a/libarchive/test/test_archive_read_set_filter_option.c b/libarchive/test/test_archive_read_set_filter_option.c index 31d575fc737e..68494abbc1e9 100644 --- a/libarchive/test/test_archive_read_set_filter_option.c +++ b/libarchive/test/test_archive_read_set_filter_option.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define should(__a, __code, __m, __o, __v) \ assertEqualInt(__code, archive_read_set_filter_option(__a, __m, __o, __v)) diff --git a/libarchive/test/test_archive_read_set_format_option.c b/libarchive/test/test_archive_read_set_format_option.c index 2d7acf3a0aa4..e32d8112445c 100644 --- a/libarchive/test/test_archive_read_set_format_option.c +++ b/libarchive/test/test_archive_read_set_format_option.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define should(__a, __code, __m, __o, __v) \ assertEqualInt(__code, archive_read_set_format_option(__a, __m, __o, __v)) diff --git a/libarchive/test/test_archive_read_set_option.c b/libarchive/test/test_archive_read_set_option.c index 0b816b7cd838..195c1eaa3e13 100644 --- a/libarchive/test/test_archive_read_set_option.c +++ b/libarchive/test/test_archive_read_set_option.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define should(__a, __code, __m, __o, __v) \ assertEqualInt(__code, archive_read_set_option(__a, __m, __o, __v)) diff --git a/libarchive/test/test_archive_read_set_options.c b/libarchive/test/test_archive_read_set_options.c index a8c68d7dd4cf..2f1f344eaad3 100644 --- a/libarchive/test/test_archive_read_set_options.c +++ b/libarchive/test/test_archive_read_set_options.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define should(__a, __code, __opts) \ assertEqualInt(__code, archive_read_set_options(__a, __opts)) diff --git a/libarchive/test/test_archive_read_support.c b/libarchive/test/test_archive_read_support.c index c6eb9346c627..b0c928023e8c 100644 --- a/libarchive/test/test_archive_read_support.c +++ b/libarchive/test/test_archive_read_support.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Verify that the various archive_read_support_* functions diff --git a/libarchive/test/test_archive_set_error.c b/libarchive/test/test_archive_set_error.c index b83c08c884e9..402d5522a661 100644 --- a/libarchive/test/test_archive_set_error.c +++ b/libarchive/test/test_archive_set_error.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); static void test(struct archive *a, int code, const char *msg) diff --git a/libarchive/test/test_archive_string.c b/libarchive/test/test_archive_string.c index 7fa743ba9ed2..f8f1e337bf73 100644 --- a/libarchive/test/test_archive_string.c +++ b/libarchive/test/test_archive_string.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #define __LIBARCHIVE_TEST #include "archive_string.h" @@ -406,7 +405,7 @@ DEFINE_TEST(test_archive_string_sort) srand((unsigned int)time(NULL)); size = sizeof(strings) / sizeof(char *); - assert((test_strings = (char **)calloc(1, sizeof(strings))) != NULL); + assert((test_strings = (char **)calloc(size, sizeof(char *))) != NULL); for (i = 0; i < (size - 1); i++) assert((test_strings[i] = strdup(strings[i])) != NULL); diff --git a/libarchive/test/test_archive_string_conversion.c b/libarchive/test/test_archive_string_conversion.c index fb5359b6f349..d8c75888a4b3 100644 --- a/libarchive/test/test_archive_string_conversion.c +++ b/libarchive/test/test_archive_string_conversion.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #include <locale.h> @@ -42,8 +41,7 @@ if [ ! -f ${if} ]; then exit 0 fi of=test_archive_string_conversion.txt.Z -echo "\$FreeBSD\$" > ${of}.uu -awk -F ';' '$0 ~/^[0-9A-F]+/ {printf "%s;%s\n", $2, $3}' ${if} | compress | uuencode ${of} >> ${of}.uu +awk -F ';' '$0 ~/^[0-9A-F]+/ {printf "%s;%s\n", $2, $3}' ${if} | compress | uuencode ${of} > ${of}.uu exit 1 */ @@ -847,6 +845,7 @@ test_archive_string_set_get(void) assertEqualInt(0, archive_mstring_update_utf8(a, &mstr, "EEEEE---H")); check_string(a, &mstr, sc, "EEEEE---H", L"EEEEE---H"); + archive_mstring_clean(&mstr); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); } diff --git a/libarchive/test/test_archive_string_conversion.txt.Z.uu b/libarchive/test/test_archive_string_conversion.txt.Z.uu index 33c2e03bf7a2..a36323393720 100644 --- a/libarchive/test/test_archive_string_conversion.txt.Z.uu +++ b/libarchive/test/test_archive_string_conversion.txt.Z.uu @@ -1,4 +1,3 @@ -$FreeBSD$ begin 644 test_archive_string_conversion.txt.Z M'YV0,8K`"+(#!@P:-$#`F`'CAH*`,(84/)APH8P9#P4.4<CPQD2$'"]R;)@Q MXDB/!D%:G'&RY,:%#3]6G"$2ID.(+SO*#,G29LD@'&,(V;E0:$N<08>FG&ET diff --git a/libarchive/test/test_archive_write_add_filter_by_name.c b/libarchive/test/test_archive_write_add_filter_by_name.c index 49f91ac554dc..c80e161c3b58 100644 --- a/libarchive/test/test_archive_write_add_filter_by_name.c +++ b/libarchive/test/test_archive_write_add_filter_by_name.c @@ -23,9 +23,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - #include "test.h" -__FBSDID("$FreeBSD$"); static void test_filter_by_name(const char *filter_name, int filter_code, @@ -38,7 +36,7 @@ test_filter_by_name(const char *filter_name, int filter_code, char *buff; int r; - assert((buff = calloc(1, buffsize)) != NULL); + assert((buff = calloc(buffsize, sizeof(char))) != NULL); if (buff == NULL) return; diff --git a/libarchive/test/test_archive_write_set_filter_option.c b/libarchive/test/test_archive_write_set_filter_option.c index ab8e67773b50..6b90a831b469 100644 --- a/libarchive/test/test_archive_write_set_filter_option.c +++ b/libarchive/test/test_archive_write_set_filter_option.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define should(__a, __code, __m, __o, __v) \ assertEqualInt(__code, archive_write_set_filter_option(__a, __m, __o, __v)) diff --git a/libarchive/test/test_archive_write_set_format_by_name.c b/libarchive/test/test_archive_write_set_format_by_name.c index ef1327431b37..07942f6bffc8 100644 --- a/libarchive/test/test_archive_write_set_format_by_name.c +++ b/libarchive/test/test_archive_write_set_format_by_name.c @@ -23,9 +23,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - #include "test.h" -__FBSDID("$FreeBSD$"); static void test_format_by_name(const char *format_name, const char *compression_type, diff --git a/libarchive/test/test_archive_write_set_format_filter_by_ext.c b/libarchive/test/test_archive_write_set_format_filter_by_ext.c index 22345038609a..fe6c350e48e7 100644 --- a/libarchive/test/test_archive_write_set_format_filter_by_ext.c +++ b/libarchive/test/test_archive_write_set_format_filter_by_ext.c @@ -24,9 +24,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - #include "test.h" -__FBSDID("$FreeBSD$"); static void test_format_filter_by_ext(const char *output_file, diff --git a/libarchive/test/test_archive_write_set_format_option.c b/libarchive/test/test_archive_write_set_format_option.c index d964df44d7fa..38f83aba2ede 100644 --- a/libarchive/test/test_archive_write_set_format_option.c +++ b/libarchive/test/test_archive_write_set_format_option.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define should(__a, __code, __m, __o, __v) \ assertEqualInt(__code, archive_write_set_format_option(__a, __m, __o, __v)) diff --git a/libarchive/test/test_archive_write_set_option.c b/libarchive/test/test_archive_write_set_option.c index 27782342f330..aa44edad653d 100644 --- a/libarchive/test/test_archive_write_set_option.c +++ b/libarchive/test/test_archive_write_set_option.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define should(__a, __code, __m, __o, __v) \ assertEqualInt(__code, archive_write_set_option(__a, __m, __o, __v)) diff --git a/libarchive/test/test_archive_write_set_options.c b/libarchive/test/test_archive_write_set_options.c index db7e50e7f0f8..6a0198de35e1 100644 --- a/libarchive/test/test_archive_write_set_options.c +++ b/libarchive/test/test_archive_write_set_options.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define should(__a, __code, __opts) \ assertEqualInt(__code, archive_write_set_options(__a, __opts)) diff --git a/libarchive/test/test_archive_write_set_passphrase.c b/libarchive/test/test_archive_write_set_passphrase.c index 4bfcbb2c2dab..6e7e66531427 100644 --- a/libarchive/test/test_archive_write_set_passphrase.c +++ b/libarchive/test/test_archive_write_set_passphrase.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); struct archive_write; extern const char * __archive_write_get_passphrase(struct archive_write *); diff --git a/libarchive/test/test_bad_fd.c b/libarchive/test/test_bad_fd.c index f8144a3c39a4..11697da49d71 100644 --- a/libarchive/test/test_bad_fd.c +++ b/libarchive/test/test_bad_fd.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_bad_fd.c,v 1.2 2008/09/01 05:38:33 kientzle Exp $"); /* Verify that attempting to open an invalid fd returns correct error. */ DEFINE_TEST(test_bad_fd) diff --git a/libarchive/test/test_compat_bzip2.c b/libarchive/test/test_compat_bzip2.c index 7df086ff382d..e126e6f7d329 100644 --- a/libarchive/test/test_compat_bzip2.c +++ b/libarchive/test/test_compat_bzip2.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_compat_bzip2.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * Verify our ability to read sample files compatibly with bunzip2. diff --git a/libarchive/test/test_compat_bzip2_1.tbz.uu b/libarchive/test/test_compat_bzip2_1.tbz.uu index 989af82b2e56..8de9101478a9 100644 --- a/libarchive/test/test_compat_bzip2_1.tbz.uu +++ b/libarchive/test/test_compat_bzip2_1.tbz.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_compat_bzip2_1.tbz.uu 185683 2008-12-06 07:08:08Z kientzle $ - begin 644 test_compat_bzip2_1.tbz M0EIH.3%!62936;12^)(``#-;D=$00`!_@``!8RT>$`0`$```""``5#5/*'J> MD#(&30_5!H4_5-ZH`T``327U4@&L('"(9-%8<7&$I,`:7FXH<P(<:8)$*)(U diff --git a/libarchive/test/test_compat_bzip2_2.tbz.uu b/libarchive/test/test_compat_bzip2_2.tbz.uu index 9ba63e8772bd..cd0dc6b93d3e 100644 --- a/libarchive/test/test_compat_bzip2_2.tbz.uu +++ b/libarchive/test/test_compat_bzip2_2.tbz.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_compat_bzip2_2.tbz.uu 185683 2008-12-06 07:08:08Z kientzle $ - begin 644 test_compat_bzip2_2.tbz M0EIH.3%!629361HI1P<``4#;D-$00`#_@``)9RT>$`0``!@P`/@#&$Q,F`F` M`,83$R8"8``1133"1/2-J-#$/U3@;XVF9V'`Y3882XA$*KO6\WTL`]QU&J"8 diff --git a/libarchive/test/test_compat_cpio.c b/libarchive/test/test_compat_cpio.c index 0c8b04232521..12512881112b 100644 --- a/libarchive/test/test_compat_cpio.c +++ b/libarchive/test/test_compat_cpio.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_compat_cpio.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * Verify our ability to read various sample files. diff --git a/libarchive/test/test_compat_cpio_1.cpio.uu b/libarchive/test/test_compat_cpio_1.cpio.uu index 967a344b409e..5cfc0d29f2f5 100644 --- a/libarchive/test/test_compat_cpio_1.cpio.uu +++ b/libarchive/test/test_compat_cpio_1.cpio.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_compat_cpio_1.cpio.uu 201247 2009-12-30 05:59:21Z kientzle $ - begin 644 test_compat_cpio_1.cpio M,#<P-S`Q,#`U-CEE8F4P,#`P.#%A-#`P,#`P,V4X,#`P,#`S93@P,#`P,#`P M,31B,61E-#<T,#`P,#`P,#0P,#`P,#`P,#`P,#`P,#4T,#`P,#`P,#`P,#`P diff --git a/libarchive/test/test_compat_gtar.c b/libarchive/test/test_compat_gtar.c index 70669244efb9..ba42e726cf78 100644 --- a/libarchive/test/test_compat_gtar.c +++ b/libarchive/test/test_compat_gtar.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_compat_gtar.c 189308 2009-03-03 17:02:51Z kientzle $"); /* * Verify our ability to read sample files created by GNU tar. diff --git a/libarchive/test/test_compat_gtar_1.tar.uu b/libarchive/test/test_compat_gtar_1.tar.uu index da54476e8812..fbcd1aa3af2a 100644 --- a/libarchive/test/test_compat_gtar_1.tar.uu +++ b/libarchive/test/test_compat_gtar_1.tar.uu @@ -1,4 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_compat_gtar_1.tar.uu 189308 2009-03-03 17:02:51Z kientzle $ begin 644 test_compat_gtar_1.tar M+B\N+T!,;VYG3&EN:P`````````````````````````````````````````` M```````````````````````````````````````````````````````````` diff --git a/libarchive/test/test_compat_gtar_2.tar.uu b/libarchive/test/test_compat_gtar_2.tar.uu index 7843a2cbaeb6..63303056f47f 100644 --- a/libarchive/test/test_compat_gtar_2.tar.uu +++ b/libarchive/test/test_compat_gtar_2.tar.uu @@ -1,4 +1,4 @@ -begin 660 test_compat_gtar_2.tar.uu +begin 660 test_compat_gtar_2.tar M9FEL95]W:71H7V)I9U]U:61?9VED```````````````````````````````` M```````````````````````````````````````````````````````````` M`````````````#`P,#`V-C8`@``````@```Q,#`P,#`P,#`P,#`P,#`P,38W diff --git a/libarchive/test/test_compat_gzip.c b/libarchive/test/test_compat_gzip.c index befb825c8ce6..20fce7af432d 100644 --- a/libarchive/test/test_compat_gzip.c +++ b/libarchive/test/test_compat_gzip.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_compat_gzip.c 191183 2009-04-17 01:06:31Z kientzle $"); /* * Verify our ability to read sample files compatibly with gunzip. diff --git a/libarchive/test/test_compat_gzip_1.tgz.uu b/libarchive/test/test_compat_gzip_1.tgz.uu index db23f03747e1..c4793a634c00 100644 --- a/libarchive/test/test_compat_gzip_1.tgz.uu +++ b/libarchive/test/test_compat_gzip_1.tgz.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_compat_gzip_1.tgz.uu 185683 2008-12-06 07:08:08Z kientzle $ - begin 644 test_compat_gzip_1.tgz M'XL(")B^(DD``W1E<W0M<W!L:70N=&%R86$`2S-DH#DP,#`P,S%1`-*&YJ:& MR#0,&"L8`H&!J;&9F:&A@H&AH9&),8."`>V=QL!06ER26`1T2G9F:EY)54XJ diff --git a/libarchive/test/test_compat_gzip_2.tgz.uu b/libarchive/test/test_compat_gzip_2.tgz.uu index 683b2a1f255b..92c0940b93f1 100644 --- a/libarchive/test/test_compat_gzip_2.tgz.uu +++ b/libarchive/test/test_compat_gzip_2.tgz.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_compat_gzip_2.tgz.uu 185683 2008-12-06 07:08:08Z kientzle $ - begin 644 test_compat_gzip_2.tgz M'XL(`&76(DD``^W800["(!"%8=:>@ALXPP`]CXF=Q&A<:-UX>EN)C5M,AL;P MO@V[0A=_.E39F2.B'*.?5QX2?Z\?XGE&27)F]L0<HCA/]D=S[G&?#K?Y*.?3 diff --git a/libarchive/test/test_compat_lz4.c b/libarchive/test/test_compat_lz4.c index eb763c1a7021..9e309a9fbd20 100644 --- a/libarchive/test/test_compat_lz4.c +++ b/libarchive/test/test_compat_lz4.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Verify our ability to read sample files compatibly with 'lz4 -d'. diff --git a/libarchive/test/test_compat_lzip.c b/libarchive/test/test_compat_lzip.c index 8f4e06d3af77..d3b8b118322b 100644 --- a/libarchive/test/test_compat_lzip.c +++ b/libarchive/test/test_compat_lzip.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* Execute the following to rebuild the data for this program: @@ -130,6 +129,85 @@ compat_lzip(const char *name) } +static void +compat_lzip_3(const char *name) +{ + struct archive_entry *ae; + struct archive *a; + int r; + const int data_size = 65537; + static uint8_t buff[65537]; + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + r = archive_read_support_filter_lzip(a); + if (r == ARCHIVE_WARN) { + skipping("lzip reading not fully supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + return; + } + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_raw(a)); + extract_reference_file(name); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, name, 64 * 1024)); + + /* Read an entry. */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("data", archive_entry_pathname(ae)); + /* Verify that whole data could be read. */ + assertEqualInt(data_size, archive_read_data(a, buff, data_size)); + + /* Verify the end-of-archive. */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + /* Verify that the format detection worked. */ + assertEqualInt(archive_filter_code(a, 0), ARCHIVE_FILTER_LZIP); + assertEqualString(archive_filter_name(a, 0), "lzip"); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_RAW); + + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + + +static void +compat_lzip_4(const char *name) +{ + struct archive_entry *ae; + struct archive *a; + int r; + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + r = archive_read_support_filter_lzip(a); + if (r == ARCHIVE_WARN) { + skipping("lzip reading not fully supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + return; + } + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + extract_reference_file(name); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, name, 64 * 1024)); + + /* Read an entry. */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("test.bin", archive_entry_pathname(ae)); + + /* Verify the end-of-archive. */ + archive_set_error(a, ARCHIVE_OK, NULL); + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + /* Verify that the format detection worked. */ + assertEqualInt(archive_filter_code(a, 0), ARCHIVE_FILTER_LZIP); + assertEqualString(archive_filter_name(a, 0), "lzip"); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR); + + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + + DEFINE_TEST(test_compat_lzip) { /* This sample has been 'split', each piece compressed separately, @@ -138,4 +216,9 @@ DEFINE_TEST(test_compat_lzip) /* This sample has been compressed as a single stream, but then * some unrelated garbage text has been appended to the end. */ compat_lzip("test_compat_lzip_2.tlz"); + + /* These samples have been compressed as multi stream and an eof + * of a member is at a read buffer boundary. */ + compat_lzip_3("test_compat_lzip_3.lz"); + compat_lzip_4("test_compat_lzip_4.tlz"); } diff --git a/libarchive/test/test_compat_lzip_3.lz.uu b/libarchive/test/test_compat_lzip_3.lz.uu new file mode 100644 index 000000000000..d72f533f8e5a --- /dev/null +++ b/libarchive/test/test_compat_lzip_3.lz.uu @@ -0,0 +1,1461 @@ +begin 644 test_compat_lzip_3.lz +M3%I)4`$0``!O_?__H[;M`,8YD9AD^;BIA9FFD7XS]J)*M98.:(K;([EY2KQG +MHCP7GI_]B*OI^7KO>WLFXZ^$'FM@5`:DY1!TN1&HBD88#`!PBD2%]C?-;.OH +M.CD*#@S?#ZT.,VK:EC>M&3P@Y6#E2P4;]:ZGPC<Z[!8IK%LS?[5V?\"7A_$Z +M#V6<G76W_@*RE7PW/)F8,548C-AJ0"VF3=![24R&>!%9]MX<[QV8/(+:-<LA +M(5M\,A,/.N]8(Q>NVZPP0/<$'L"<E1?'CI+=9<,9SUDS#P[H$2@4^83E"G[] +MF<F`<D*$H3`.5F20A/UEXOZU?SC58<J.<M>@#M-U97_,O9,[)-C=WQF\#;/I +M/:?)P\LD+I'MSDVF+HV%F\WOJ$R2V<:,'&OLS*Z]4T;:T+0X?G0V!ZNJ/Q-\ +MQE5YN`.GF-)#-QJXPFV>*6B&<;.0&GJ`%Y(0D_50\KKX%.4]L05+4';KJ-V$ +MVL#+EB?+8%7%X;:GNJ4(]6,S=N&,"DM),\D=N4[M5_RF,6RI[%'Q.T]/"UI2 +MK>MMU(]0,9"U*K$(W"=LPT[/!9OZ&HFYF4T.[Z-D$WWX$M7D<&>\M'6R<*D_ +MN[1Y>2([+&>ZTU(G;#!E-7S=24W!*3L1VQGPE43J!Z0"4L2XV[]*,]HF-_?\ +M9%9T01.28SLQ,MKN5+@SE:["L51<Z)(]R_AN>,9\S?7YD]YFW4EIGM)D33(7 +M/N7(69I0U.S1&(%\"DWY>:Q;R<TOW1N55ROR4NX+L,](HBWFKCM3QN<B"F#= +MS!P<9PJL_R6*]&$Q,I63":L@O,W[$T`YLR5:6V:8-[#?I;%:;TU@,O'YI7F? +M>%`3QE:MCV'L]OTZ,.!K'KOKV5:>Y&3U_J^/DZ4I^H-K8XYHQ&]7RR0G<#7= +M#SG@WG#U`@]8*1OW=*C*8/`9@*DP.N'7/3;??EF@GGDYT^P.:['NCB3,/GT. +MZKGGL!OP*;[6:7IA"OF"`+G5[Y%7<7[R;%B,HRXU@(RXHB.#VN&8%,^4.RE2 +M]IP,'E:0-,/U&;Y0)R2P74`3WEC$NH+ZFFPUCW"!40RZ0A2(^5YH"JGW!MC` +M4LVA/AF]=(84`>IX2W<-U9OP2$ER[)"07JHM3WFAI)_NDUAF?01QSYQ.<YN) +MU6DM)ZF>4+9.(JK.UC.%D[AMK&14PW=:U3Z/SNE.E(Z1-'RGX/1H8N=<-N\4 +M]4W2Y]VEL:;)3UU_'X$WV]5;!OP0OFB:CK=080B"790'#=MP=O$RJ1@!+CHI +M.\L&7%!%M^G%&S<CKXL=E&8UVRBFT^D%H[H.`CC!Y[>>Q`^=R&ORLF>1H=FB +M%2%]XGW4VUF0Q@L.NDZ_&3/'=_7/E1XSJB.G`#->HK%5<0)D"#'GWKJMRM+T +M_YA4]<5OF44F3E6FEF?SSX5K9".8#?9JP?UEI(D5T=0ALWJ9=DICE;@LJIN2 +M[2C\$8MX315IA3PTF^W50Z]H<SVSH33;T3SPEX"F268<CF?6ZJ0P>8W>]]U, +M$)4+K.:(3(5$(8O@$NH&73`3_(OYRN?J$^2PE5^L@_>AT/F#J5KTGFI&J82I +MFI?KLOQU-C<\MT?8QDU'0!PUSVEM)BZ#Y7_@9>:.P*0;7FC>&?UPI6\8\KZ3 +M=NWS#T*BMYL%&6"5V4Y!3:U=Z`'*#[30H/":R\?UD*56",Z3E*-=F>GI6I5+ +M@,=X.E6#FM`@BU+!=/2C57=^Y3?I"]?&\,?6/S*;0Z;@Z30^K<[WPFGT]AA2 +MY",3*9-3=@>[;@[R.C[3L<E#)9Y+",3&GKWT:>0*OB=SCO4M@)`_(^0S.NGL +M.,,(QEU>5<1+`'%*>;J(IOQH!)!T]HX_L:#)^VE#VBK0EBY27%<IQ#2WW2W2 +M,4K*'D$O7`Y:IC9_=?F_XC>)L!P+W9\/_1GK7?G<(92R.)]^)"W(S,@.-1=/ +MCV]_''DC\#$ZV>EP7\&,D35S5+YD^[%N??$MJ^5U`Q#>PQTN$>G6\6*8BPJ5 +M;X#?`_C!10`]"VH0_*HS/^1)U?EUEGF'/':R$;D?@_]Q:R2Y]:Q"7#8=_G?M +M&*F>S^ZV1";E[=#:[COOSK,!T)2K^AZP1@3<O1HI^C\/-TLKW7C*DW,9Z$L, +M?!ZB9IB!NFPT$=6'3_B!0F$[5FZ*\Q/I=)DL=4#<,O(6FR`_%@#I:J*128P" +MC(MB5'##I7!)[N+^-LRZ0^I22>KWQK,S.<G-+\^![EA>;3:]#:[,T!U$KP@? +MR+>;%.3GS,4X]OMCZ%8<+ZD8*MC%)+KI#F0_#Y%?J=[G&0_UGLQVO[",,LLP +MFY-$^=0WOMI1GP$`:+XN'>`TM1=,@'02^$8N08F*,N>7H@Y;QWE&[;.V)5!E +MY9X?7E*/W!SCP(ZST)/;E0/D>$.I>)KG_$Z4#&SOWP65\0,LB9?M/W6+:`_% +MC5-,ZTE"BY]FB^X%Z;AS*$?E7!'N.OQ:EHE)7;V\F"B;<@7O;BGT'ME\H$JH +MF-(:@$$]Q[*@&76AP86N5JNJ]&T=\PVZ1G9=[N@3"Y9/>;=Y,]A!D467GK,2 +ME'1XVE@&(@=C[TU$4;D"2-S&,[$GB.0/P1!L-LZ`:&J/X!R4P[=9UZU(G^:7 +MT4W+74N:D:D)!2<5R#]<I?MB"6A_MO4$<MU1Z!S_"H=$F4G`(=_TE`>KB><* +MA8-K?#>MM#S*"%B)P&6+X8^7?R*//'9^Z/*G8S`9G(BJ(1O<:EBQ:V'"8[3< +MV=<6?E7&-2DEP0`,7,ZN>85L[T&:$X5-YI"B(W=]XH4[X4^,=_(JH-87W^I/ +MMO[5R-B/C6J.6U_`G=A.L1N'T4A%L$HD_JMV<.QPC.W$*^NM8'45?\6#1'H" +MZZ%V-S*IIL-7MG1^I"QU,7C`J7"Z*E^9&=46OA3I-1'&&4##XNS=&H[S79G6 +MG$WWG\8`D;AB$RH?*)V&FL@%,5@YE#FO->G$L;ASI!'U@=%9_M(0D"WU_*`* +MS7U1>)L^W'<2=[\OGWA^5.SUC/7%TWT)CB6\)@22[=P@I#U2_+P74?&]F4F@ +M1VV)1"!N0'0I4)@9_Z/K4T[@M&3>2(*P^1T2.M:,].(&$/8<:$;4-;&`B\L; +MTZBP$*##EXGS@[!AKD<79.2-<\^!U[>&D^NS-G6!4@=A$J464!0N0E^5:8=H +M!3<]*8+,B'TN<Q(O!-M,+1GKV.M6#Y/[_M>6^8PK".)P\^;3]?H=N6FBM<QQ +M[>$/"C)RL)"9G3#`[G#L21'[+%)OIT;T04N9F4]-5SVQI%FWU1SPB'`=X(F8 +MSI^G>*X+7%&_TF:@6UL"FJ14&?/U[R3]^!9D+:`R,?F7*>3*SZ,*_T`VLUWQ +MK=,5:%EYP<RVE92DL5X0$>_K=8Z[M-\/).&"Q'L7+\BI6U/;,=@S@[,BG3$G +MTGJ/P9PWP-W3*_$'O>@0C@2?#!W'`P*[8/`$2]LKP6\,"[>T8TM_IAV"L^>N +M#;"7*VO3F_6*)4NINCSLC)*E=('"_375C;.Q6+=]_-HOZQ<01UL_ZM$#!GO@ +MB8,__Y(;S8K&!AQ#=0E8=5:NV8>?6R0KRR`[_(82L$/JQ3$ZD`%JSV++4Q;^ +M/`)!BXK!$GZ>3=T9M/7WI+)8F*SV:/2!AV_6N!V'.%@638XUIT=3[Y7)Y66K +MLCZ!YVUQ4W&0^-U):_E^_X$L=LH<D;CQC&":]\HK?=5+LV24TH)6MRZ&[(M" +MED'M\C/0[*]6"*L?>>%9-_/15VH.@/=]\E&?^5SN/]NU":^YMQ_6AP#5)R1[ +MW`&=(1@:(0#_@=TYYVXM_3M\#CY+.72'?9;]Y9*S-*^R"A'MV@,>=$@6/`DN +M@7^E^9[]CD:#''>W&Z5QS/$0-G8K3=%KV#4]\9,.70/1_U^S\J;[PY>(_4PV +M(MX+"B-6EV-H"-4$F1))*\9T')J.FEU53"Q4-.W!)I@L#[:T,D/A[LM4YQBK +M[8)K$=2<,_@#L`%#RR7S=`[/F16$GV?+7L3X&TAPQ)+]BC;<;LEC^H'KYV'7 +M2'=2!B2V4`;R9%^'+&%CAR08F\#+D!>K7J*M\8$E-*0K3%^G'J<[`[;&";KS +MGNJ.$*>VFOYV+-:K9(L=Q7F>F$Q;V&7>]!H+GPZLL<9OV1$S/<T&XDS,\))@ +M*-I1Q+HN2=08Q%CT<1,*^$>3I$BCLE21NX7&LR5RZ0%J-4+1SU5!TT1,Y=T( +M)P93`NY!`05O1\76_&2Z]`[9G'P@>3H[0-L,\OV7*@&-;P83?VO655&,4XP< +M]$B0Z'@J3/;Q&!(>O3B3L'\<]I++0W/<',K=H8&/Q04F,]Y['WJ;B7/31K*G +MT=\\</'DJ;%>?;2#UZX'MVV2,'=,V&%GD4N=IOA&-"B[&C4\WOFCYZF3'ZQ0 +MZF#)V?EA)EFCTI9<2\RFD%'=3TQK#<9V-_R0)S;EF!)ZIO4P<SJ^\6=3^&V] +MBS9>:\#T[6*RTW^',$B=LLY4]9H/\06$-@=!EP@<!INV$VD5&^T+EM$L9JT1 +M#R!M"QR$/^-Z+].J0+K,YENA`#F%R"R5X5W!N9#<'0T"TB/<KGPOL1FL5LL& +M+Y8^?/A"^1@:O/Q`L33R]".''J5=1%0/?B"B!*_4#'!Z2\@#]L@C"C,((+3Z +M"+7!VLU\2W)=Z^8$.%%Y'C7_448,$23QQ.UR17*G1^8]XG`"=3]^$.S'>+6T +MD1\3LD2*@PH=#GYJL6S2M\.4]-5"V%<&[H\M/O?W%*?MA5<A:=F+'M!IL=TR +M*T,0R>X3FT;N@M@90:9%J!Y[,]S>2*<2JW<_#132S(NQA;G;8O`@7E3_B%V1 +M?P(B"X;IS`BZ2Q+<KME""'5;P;(N;`<I*27MAPGE']Y^^4S<7A&"S\8KGC<H +MN6M#O%G&))X5?Z;2J`385]NM(IU?[,V>LV8_*(S0"F`:CBX.0Z3<Z*2#:RJ' +M&&-3Q;U:CUF!3OWK"U7G]86WF7M!"FVEZ**\H"$4%^AV)$^C;5)F#:U"2.OS +M<FI*0G<,E,V#&H.7+)[2T/+9`[M$CUJ=&0R_,1T]MB8;%COFI"KUVEV#CZ%X +M!%>N96%(K",L*#!,2,5NM*4[=(R'Z&]#,\9"IP)!.BP#$T7L>+I6G3PT2P1B +MKQ#70'EIL44A8&9%$]4_NKNL;)8K<\$%?,:SZ8?6#$4VM^I1WBN+.]_W<M?" +MN27N9]:1J''ZYW5_E4'-JUP(&21KM^/?`6^W"_:(:H<Z-'"()."LAF%&::,= +M[@"F$H]WQIEH;T6]H7C-LY]1$8F:/X2QGBJ<=;YIH%CCAG/S/\ICA=K!:E-E +MHKZ\,V7^L`L)B#D5D'X^0"`8GYEA"Q.P!+O@?S;+#:_$4+WI7E/OX*!.$'!G +MOT5A)/>,TJ$_F2N5<S)`HA$R%I;4J"T\1<N_;7/5[[5!\-3SVEA,?Q4SXM]6 +M83CS<!519;%#.]?:<+`2FU89%8]%!:5OL"NV--@K6G>HZ.8)]S<?.+E2H20# +MG'7QNY&.PL>-IL$Q(G?"8Z>-Y!UJT*YMOU!0SH^+%8H;__,^OPA<%A4E_[IF +M98NBR!#*$97H;'E3:MVGF2PITGJ!^5,P&OCHLJ[R6@Y#A18'9G$&DS#:#@<. +M:49X)8.L!)054YUT9\%`NSCU*>6BCUQ)K2ENDN>0$L+OGKZI(](=%=,L"PO7 +ME^&/8X(U]0Y`L2`9M'OD`U/-[6I0]YA5]'U;9N<GZ[V^":I3[JZ\!QHNA$2$ +M-<))A@S_6_1!:Q]9(J3)+"9?^,&X#5I`%P?;]0T/+"0HW&KC"*64>B^4;J^* +M\K^P'"AR:A,XA6G)89#EAA'\49\^I@_SY<B`\9-9PDX#+1\\JV()VT*\T$B^ +M0U_3L7&\(/"7BI)%..IY8FIR?")J<F>+H`$W%5;HPM0$!UQD-1PT?BDN\:(P +M[H-NO7WU@>/\$+?L3Z,Q&,1Z0EH("\=PXO8"TCC).P6\Q3]#IME.,2G"23#. +MWBZVXUOS1^OGF6TD8F(X@7,L;\=J8RMM_CW#>>V<'PP`H$R',)XKLY`.LBY0 +ML=TN^`0*ZZ;1%NM%P]=G#*JM;^L/8SF?A8H!#/X(+J\XZ0"#WN:Q]&=P:)0U +M$7GTCVVO)#T>L'Y2L@_;5&A"RKFPZF3/8_H%:U"2:O_!&F[`9Q@T?V2=R'+= +M=E,]X9,)W844SSZJ5E]#U"+U#V&@I$U#>B53)7B,RFUY@$TCU`^D*>>FI3OQ +MY1F8*WMO34L9U4>AXZM8B=$%A_\^-/Q[QY^8MN4T4(QV.96!9'=S)J6Q;WDO +M>ZA7)U--5PGC,VM,X%OD.LN@'@0LG%%,5$S>6$PD:EX.PZ3#G+1?X32_8]TK +M`U.'@C8LOY7,\^>"/U=>M%]?@H8#0_\WB$X>%@;M@.'2XMH^4D@+_)L^V80# +MW1DA@Q/.3*I:M\,7?_:+#10Y":O>JE[TN5D&9IM*+&(1EI+SG6S4U82D:V2C +MC82E$1N]YD.(C:CQG#GBSNGZLL^E1%J4[SG]SL.)A]XU/>O1;:,QO#HGJ*ID +M@-'F"C33@-S[_\>GJ"QC(CE-X&U>A!3&:6MQZ@&$/\D/<N*18MBH"!NGZFWW +M$2FRVESRI,-8_N`-JKTXB;;T:J!R5_%E['6Y+I2%/!E.7F]*+%,9=@'OM4F9 +M?HA+GD/'RQ&MMZ@3SQ5"E6KRI;K0WEWY@_&N3N_3U@]NA9#"1=0J%W?/@K3M +M)65>0)^R7%'2<)(MJ;99,=4*SPV(GD.&0YB_,GJ""$0C9*60DI!#Z6TTQT+H +M,F>S$*!@DE`88?L,SV)/.]7()T@Y-KW$8-N1514$L#7UO9`+<2^0\Y3JZW(, +M/(`2]=,(::92MDYQTB<PO9CGY*O,Q]I61N?MDKO]D.N"E(B:R%PD3*L_6K"U +M;^B%(YCD"RISL4.T^[3GFK$WR0DH#^6F,0H>7`3*9GMWT2D":+_2LNT/YZT\ +MU;)HMO+;Q;UGA)$5GH(H*#!IV7;+`%81FG\JAK8BK*@3"Z:XBS:UH:,D0KO/ +MV\@%Z@Y\BMTX&PVTA+/KK@_=FU4%L;=D*H]5>+',TNT*Q:1"7;Y2L".URX9> +MD.R%"?87,Y<N\4!MY"-LI\O>IX8?`J[`$V&Y,B[4X_O4S:Z^S`[D&$,=]?'. +M"*4>4P:Q:SYC[@^0)^1XL<>S.I.^\E3)IUY>HK$TLY06$>9+I?+]YO<$$>`^ +M2P^`:VP_YCME;NEBGM%?'<%*2W8C.*T4<]X&V,=+N"U3\?V#(C2!L"47`?,B +MH\Q%0>L'?934CX#]=BB#FG"!?Z^--S9520073?E@NW%@?=HZ3)/865/+$`G/ +MM%N.:_P(.3*U@_JV*6L'ZU,-M.E",Y,N8+\%NJ0C?Y/K3G:V"EQ$P[6MBV7M +M-1*=WNXB*>PA0SLDM+.SQX#Y^1-G\\`QWK*53F?\#+O2(`$M$*?+NC0POB$] +M[/\^_0OPWE(8<CV!(8^"=9*04RO"Q033P^4I*2U]ACBB3TYF[^D^6;Z.W8-1 +M8@?Q;2DU:%]'$G\'9":X6W\:^&O8#C^#I2XXR&L*MZ,X/+ELK#UJTV>1TO%8 +MB>8;Q=_H(&Z&CU'ZO"+:?AOD'`J3[VF.Q+YV;C;)TJ#B;/B6'1>YNH7/AHYZ +MZ"HN6#6Y&1R3,1MB#6\BAWLG"B9S<@B%_HYQ_;1C6`8Y<+'D^L9]@[]6$.<- +M@:GCD19:7XCQ6I-L[HHX5.!GHD9-V\,,#X-R[/0:#J/_MFA3$5U^W[ED\M#M +MB8-+V`!=^:=Q^[E6=6:</(9]#%->%XCMR(8;ISC,LB!+%#6I0..49VK24C.Q +M(87P178<$C'@V$HO<F*AP=:"%.V\DU36R?XG'A]EHJ?6`_%B"OF'8P>3S;TY +MRT>950U1*&1"`-I6%H\#7JZ3-T^W"UF+9\*>@9;1\2]Q)L?ZT?'PK]/NWC.1 +MX*',Q20V,J6JO+^$F_.A0SI?%BU4HBU_>.8T#.?NFL*Y)K,_!3@9=9C8NP[D +M1^2/&$W:MWTZD&RPJ^\!6U#UI7#3OUL<^C!NJH:936KFCA:)05I1>J_+7Y`, +M^DBIZ_?=F$$,N-E]_?<@A[3<1ARZ@KU,[1:"$8\#IR+V3C3,);ANDA'`59G= +M\"YUBZ54O`T(?:M+ZUK_3N=2WF_I0Q2$LUO^&,Y43VTRDF<82!?JNL@X[4T' +M,#N^C+]8<_\5U*&*.Y9TL`L!:JQ<L8KAIMZDOL-[@V,D7R>-*4[S:QYP<F6< +M:F45,0/:O+XQC67NS2H;CJR'BD7)0$$NV2CG1AE-M'&QC6@"?^KR_%](584A +M6)FG>6-]H>4+1JE7L7JWP2]/)!Y/N3=;/Y19R\C^@?!,\%2T8CN-<1V=`D!3 +MP;A/.YG-(@N7;8N2\B^D>%+3"?;/)S;KZH)IM'"M,VK_]:\Q<ER(9=\D>WUE +M1EM_'IW:TW\KO#J1\.SWNO(9_/3ZKW[=*!JZQ\5`_BA5E/&3N?EK'^EH5#AN +MQS?3"JTJ7&F%RPC;#D1)9R@3T_JC*PAN\KLH9/6J)OG0BOO#>VSHPV)`0X=L +M%[M+-3_R^(13.[;P%M''U\ZJ.@\8ILN3]FD+Y[D;FA#G2CWL;@/T<U0X]7+5 +M1^[7H.[TL%[=)TL!1+$RZE@(4MK*8)FSGLBJV/-DJ[DB(*?X]?PTEGR.!JJ6 +M?I^:3AG%+%)_0[)32Z+QG"7?\A$0([#CI^B"H`(PZ:33Z"6\-<OW7V$>'(@N +M4&%1\62B65=N][.S^OMS?,.FV[VW7[+#*==-@@A!I>B@%@:\^-J,^T]ALW*5 +MR^1\(5>K*`O*0C%$&=LJHP&4Y,"+M`=O3\[YEM+?*T$]7P+9Z?Z7,-9(]X`< +ML,OE!>P'2-U:2-EG)TE%S^%S>V@%W2UD)DT?>#AC;]^?"&NM&&+YH:\/3VHV +M^DH.N9(6J74U3'.+M8=MK\FI71Y=6>1#JT-/(Q5&P4M7[A=G4:=ALU"@]X'$ +M2"L\48]U2>C(N?VH7@FVYYMT\JQ4M=(@H,@=L[`5@.V?_&RQ">0N'RD>9`*@ +M+A,)(1JNV$<#E>M=5R9M+[[KVBUHX*,L&X##1DR%GM<RN%'[S:^+/I8V`9W> +M81A2`IVM0K=L`D-B^CA*M;C=67NI`_>FZ&W_8Y4"R\;(3.@H(RN7S]AP:F>V +M(Z1JB<31_.\.P0!ZEB(6A95AK#]4EYC3>*['*^T#BFXJ-.0!FD##0VW1D'G& +M!+0W3!THD0_9Q=[_7:A"%J`);\#4TR2OVSEN;Z3&\YT]&B)3/@B7Z.V,=K[I +MP*SMUV^;\K58K._%TI(3._#KT&=P-[U;M$:O_@/I_.G`,)?CTD<4?,$G/0(T +M_EH<=%I![Z"LZ=:.*Q`K?YW^GG%D8DLC2W.3"^IK=WL1TOD735&U7N'!>!IH +MG(I3-!'`FI=9^@UB#-'M'[Z`AV+8*O'B=O:+@R:(_W<X]BB5I(*1O6[TZ#R% +M1>FX\Q)]%L\`VL#E\O0]-W1K#3`C=U)]H'UO@'BOJU16$HV8^K(#0:#;4-BZ +M5"98HB\Y0]`E4]4L7G-%P@4<U]A.\H`WG]XFK"5C1.HS!)#Y.5K6795C+]O4 +M5!CRW=G%>82):]L)/#+=HD)3,&\'8[#QS<[R(!KQ7X4W-B>3R(#ZFQ<67&KP +M.3^FE7*?+EDD9W2M)>`K<1A`4!YQ@1YP(M4=[]'"2FE?^_(_]U@=_R/I3<@, +M*&9;52&E8&^I_NMKZTHMJ4]S]9"-#._/BU:,Y4:M(X=OP!?)WT@NB*4_GS-; +M\;P$U5M3$OLJ]9'Q1<S(D%9*''V"J<+,;'XN085!ZF*!EU,,17:BGYU0,D^U +M)0YMP,PQ<'668KS[^,":Q(?3KW>4<:A'(B>)#4Z*M63.M;M_G`T>=>:CS$Z] +M7.^'33J_GC6%0X+U"O2;#/7_"M7$X@%];D^W;6KBO?:$[JA"!][CBW3B$7`_ +MG'!`8FV?QHT?94P*(G+EN:J$1QP[ONSE&4'",)/"E[%"*?:\E[P?QT\>YWIW +M96,.$^1\:^"H<B:Z3]>X&VW'<$SSFK/F;B8F$338(K:E*T"*G/;!JJ"S[Z[5 +M-O1_AZLM7(]46ZS?O[]*7[ZL:.D`QEAU.X/6B:RA7^'QX3UEJ^Q>@K0H6WA> +M\3F17?VM72]\!)5B;R6P<+4<MB2OI.BTSMQHN&SK(12XU[0.,W:,)$83C^<E +MP?\*K%'[5V")Y:]N5LB?0$1Z0:)L0JQERLIC`?4+^C834:Y:54-U^%)VD'LO +M**-!*J9*S*T9([H0AS]Y_]'/EVU8*I"XP\"US+)+C<QN6!PR/[_F]`K+"BW6 +M*SY7Y^B6N(%Q&HYJV"6;OKDE.B/9IU<4`/L]X3?/1S74]DL`CRO*9@L<[LM4 +M]/_0'9,)A;&4\1&-0?6(8/C!@,"F]X`/(R^EREW^X;EKR!94T^)L)8L'VGK& +MST58P)E@8$.Q=+_M;X<@66#WP;%YVH.;9<H[XIJGKN/75/S%4;'31;='X`93 +M1[]>$F'MKYN\^FS$@U[8?O>$JM!)+_&Y19>>K'/JOE/A(D`D;1I!%?ULH4@Z +MHN:6KBX&\'U!FV=X1Z%#*8R!=#(BE*7@6Q?%&.I'0(7^HK5B%;8KPIW'X=GK +M.,G$TI?BSJ1H<`JBHF[=,/8'4ML!O&OCNA@H3S+L#C#E)NJ8C%M-\L7[T$>^ +M(\#-#D64G0,C+K&X+I[W'V8S&CG`P)#/6R^)](/0'H\G/EA09X_V_UC_Q*H8 +MYMSSX>%1A7]LAO#>4"H01>0(X(RD8;(N5@E?Z<:5MQ%P^"95$_1Z3O$L8P:6 +M=P2FZK;AVJX$%C:+:L2^+"QQCH26%YEO,)H"HX<Z$"I);QFS("^.L)VE:$,] +MADA_=L72I$;DN@_=L4#*2[AU++^%1$5NBCH9[DH6<2;E2T2!BC=5;_O/K$19 +MTJ/+ME^8._*'_3BW#I\4^F2>4RK-_%.=`M3".VRT>C["&=+EJ!]?%;U9-PK< +M&;%UAHKKR74'TI,-C#N3!-KHPV')XF<B\[K(P(F;,/3;<&4_CFQ9!^!@]T^6 +M<B0>%GOOD>.&(5'O+FL^*#;BKH%(H[_%#?<,>X?]B?)F<8L7:\ZO)8P;1<N8 +MT7L>NPV3V:H++6<L1DR!&`/2^=1@2S8^&VF&[%](NV/AU;8$%._IO^'CH:\& +MR%!.@[^V2FB)IKX!3`2OKL[D1T/?=?71T320(:X/J.SFQ7[52YZ&Z+7>1KF< +MP;+`]6%[2NP##67SA72V)>541(RZD)B"N5^1KT4T'(3JV9R_,%;+6SX5[`]V +M9"6`OL$.>9IK]:K%1D,(_/@U7RQ43[82Y<Z`MMR6#J6DRNRIF%E_J-JT;QK` +MB-[3K?B5>*FX63.C3W2>Z7R$EIW8!*?!?6G>Z:JAP`AL+X)OEID824H^=S?4 +M:9Z,I,0K"#G1D)IG>@01(MF%%0\U9:QMQ9IRK-NY=*G*OC0=A?CC3.O_;32Z +MK<_17II)/,R;#W<B=6NQTOL#L@<PRDL-R*Y#+H/;8(S'$0L$C$+?<#?03KG; +MDM%M24<&:6D)^CCNN70QII!J!(:(SZA^$B#*A<_1/_;D84'<BCXEA0#&G,PA +MP')U.^0QUW^$O!Y&3U*:82(Y"$?Q2H@W"X%#8VLI?`G&5/#2J86"@CKO@6"X +M[#8*#,-%KJ^C&1X=D_ED8EC7TSZTMP>5=&+MV<':-`@,,V&]*@ON57W-5%1= +M`(\P(E;SP,=B`9E\R'I"E5!X[AU`5."A;RX`,-W37<)<J+,9`?=<7'FW)N2; +M/DF+6J>L7(72-B"6&<DTH'RJBAHDB_XM(?+8F&(!)CS_SK.V-5GNUWS464P6 +M!\RL4)15C7U?'PA._YRMQE\&I;:^\3(/CM'9.\LNXZ@2%BZ.BXIE`J=K`O:" +MBF-@V0]01FHYI$*>/\$349C6:("_6,^(2-9VD7-!6<W=J/;JLT>@:-_A.0F< +M;&Y9J$G_!H]*;()JJR_14VU&_>J+_+C*CT[<UYQSD%%NNA_S`>O"KD`)0R7O +M'J!9RQ]5V2)K4!B>1RX+_3G)'5ARTU9LXR:XC1:CRN+^GYH82T"C`*\7XDL) +MK%K%IXM%C;H?N*%/964+FHM@"X-&I(MX@-S[0=8XM'F!$KJ0MR2>>&5K))M\ +MJMR@I]K(A1-=X(@=(7Q73K2?TR84%OD`EH2_\D@P@\^A%,0R=A]X%BR@I]X: +MF(KVS\_^:G43RJRHD1D88I+SD0A#\9$5-Z_'+7YC!8>IG0Q0Q9E51[+^')0, +MJ0L?K@<+N1H6+XDMRR0BP,%KDEP!"S^6D!J230L>*NM#7A?VKF%^\[3&]C>A +MG64XR;_TZ>3OILJ0<RT4*O!]3G"OL`+./T($2COJ>U'(2V$T9PK&J;OF(Z:\ +M^&Q9NI"U1A][]5YF"H(B:/^KIX3IT]V$!C;X1,LV$A`UN'*-2B)<U:@BL^W: +MS6^<8<?QB!W(/Q?R@19828HO7_]7#T=Y:;/2#ESV#A@4;96]\VI[&1>+PX); +M]YF@%>!.GATA];5'@EZ!;VP=D,?ZL9LF`3K['?MX4:IU[!M/!V/@H.9;9E)5 +MD*.DWDWN%X,1[^;*H'Z3H:&J&,3=Y$A\A-6,.YYSOPEI=P["VWP`:EI&E8C; +M)M#>&7U866P+/2KO/U,%&/Y-V!S#%(72@17/,=.7`X^?#]%H)XQM^G%0V'$5 +MNE`\K`OCT'(!5"%^2LLIYK#]\NI[3I:5QH6`)2F5&77Z0-9*?1VMR-8[;[0/ +M38K.,!4&[%X`-<U-L?\#^Q=NX6WF0XGRP&Y/&QK&,V>8CIX6O5KO%R6W@;T3 +MY;-OC-[==5))NI"G]N`PU?,7D$*+E0\-360[A#E+!Z*R(.X=YWC"M7Z-NAU2 +MU7L3`2PGYI.,>.W/VBY80A,&7]E;JWG1=Q,.3(Q=W[E0CU",Z$2M=BN$-\-I +MA;F/GPR+SCZ$+*.?YU0P9YU#V+(O!-"8'9D6&ND`(,')O8N/J_E!N-D`:1:W +M96-^JO3[*ZVL+5!R8];Q?F]?6^:A7`NS9IF,+L@5H=7-1?1&)I0=A+M40!C+ +M]W^V]_`AUC`YNXBM=GK$PI/0UR!BL3E%V'IT!Z6]T%1ALY<ZX_3?MZF3`+?9 +M]>HX,(8`W`'&4R`HOO,8YITNO.1:I,!:&JC0:E="6!(PFSMZNZS*?7QA98"U +MZ^X=:XDKBQ]$#KY5B\"T@GE3->:3'%YNT0#`A)KB/38QQ`%Y<`:L&1`]E2(C +M$Z$*&H%?%"?7EM.<9[`H&?1LCS'IG7<(F]9N_9S?B(O2*AO()K5XTU?3SMQ9 +MB6]0\'D][_$F_&I^:^91U^1IJ^Q,)LC2U/TG4DK+OWB-9@I@]BN04^?`EL:* +M$VDBH-:2)C?;CI(GC1<$Q2;*1-1<"LEH^;#B!H++;@JQ\8ORS;[:I!X_4!N9 +M<V`"7H6?QUJ1WN4-5"AY&)JP^CVX(\[Z=>-GXUEH=IVU?QUO6:*2(#6H55[F +M"_O]7P[QR3>0Z$`D,TP'-06K]*8>CBYCVF"34@TSE8Q]/4+AHI44'0X"JC4= +MCF&>K=3'Q+=P)*,K5U\!M1+^#T!AI\Q^X-T<?=S!VY0B%;JE9XTI[UO8V8?* +M:0O"Z>Q"-8U@WQ!70V;\!FH"U,OIGON<V;GJ$7J6<67O=%/<=*()IZ#E=_IT +MJ[.CC4!4-?;$(</B&:=('K1>VBOA<#L9,6>S;;KT'X,H#BN<'?$6C2_$&N<Y +M::@>%8,!\56RRZITN]@(AV4L(M@/$S)WH"^PB^?EB?,(.*1/26TG^<Z2(2T\ +M7F*,`1N0PTRK^>N?-CO/OL!(J(C:_=9Z0W2%ZD[X$S)V:;*IOCJGE;FG&^,3 +M7:`SX%`JUA*ZPVQ;1_=I3NAO-;WM0B,PS&47RF=/%'$B'+.D:J`)P#9Y+]D3 +M8D&EJ,C#'Q'A`1P*HM#,3T[^/?!`1-/?RH##`+<I3S$N9_51)=UVN6E%+[EK +M``;CQ.O5H)07J1_+_8%0UJ2<A!4UXXO*/9Y[!#BA9S+WL,(SN'?"H)'\=TP/ +M%*:'TFR\4%5.V(\<4:<5TC">I*-/5RGWAU_;2D79.D^`@,E;M@IVVR*_1_O: +MQ\\O#Q1/PSP@1&94$!@BV"UFB/'?%%'K.&;?[:3*U7&2>375'\3WA;.5=N(< +MYF+LX:Y[HQ%!S!W6/>'>-.<#A<MP*=!JYUC13R5HGK^:514Y_V72`K5,6#IZ +M2G_)SVF)T*W:"JB3-7KH:02762<O23=K.8@L2@3A`H(I$/W/B1R._.'LUN^C +MD:V>D<TH)2PW."BRYFOHMZ)NK.GA5G!T:RW5Q06RH;@X,T(E5>,712Q[O0Y? +MNKC4(,-5FORO1=VN%V+/'/I!&UE:BC]>Z86Z0H\HYMA4O+BH/*.XUX">5`)@ +M3]^(/]>C[M2\*9AHG[98,BL.!YF[H>(A5JA];1A_O_"7KN*9>PO'F?1_)VL\ +M^X_3T\(E$+X8C2PVS7Q9&"GU=K9GNUB%78[=Z!_;JIP`Q-=X0XW!:K3F["]B +MMW\/J*/,7]!1$;9Z:J]HJ;9X])+C?^)ZY7Q^>3NCSQB2*F,(WA/5OB>@(;DG +M/\1B1A>5=:I:[O`UZJ@G8''#NT0DJAR)CWVTF"](1C$DR;64\*US-0YIQ%DN +MQ0P^3LYNA,GRO%IX,X="-GVB;DJ,5;Z+!`'KR#N;2H)C_U*L@3LCW@,U!*E1 +M+@A05L_P",-1WRV</_Q_6,V#\/DN9%YLL="C3XC)3`5P8S3`%<Y?8*0,3LT! +M?@;!TW<PST$BD>`E\1()C>KF+[2P&VJ*KQ`N@-?8?MD#%%%(2Z#XRNL<B=K> +MK`8D\E1#7[?'!OH5!!0[#XJR,=OJ)"`Z]V\"F_%":;1<)6C])Y-_==3$(N=] +M3Y7T$CI%"`1Q42)FQX?KD;G,.E"$5K*<((C")'[=/Y]<%Z!;LOTQHRT9&A_W +M,!")BF70,4<6OP)J\VVZW>W7%Y68C0;T#O0`>'ZF*[AE%(RG!)N]N[>5C[W@ +MH;JK__C]L.=(D!..C?F/F53W4F1WC-KMC=GPXHV1[$/(02%FN%M/^5&J& +M\W//WP)8<[+@XGV5=-&)/\@!FJ2FI591"0"SM?'EX/M3J9%7`=4_+LM5R.2G +M^;D@Q1?)O3&U=[3T#CKG,\U5A^#Y;$H3'ON5YN6;T`3"*=^?VL8#MY/\HR>R +M.[2OP\^,_=DY;ZH7QMBL@$9Z<CE=,/LS$^VV@3.8XL5M-(*PKKONOSBD*@:L +MB4L7*I]<K>@VM29J0V&MU@[F^&,NH<LI/4Z;Z)I?6F<I;L$$NDE'7`W"&*RQ +M'I3T"DS2QY2"I"5"4\OG$CCHPC"1L+:?Q(2)I%KV39'W\<#F?7S#A.MU:HM5 +MOB6<CS4L:F<V6#<08+C$/#,*=]L+-Z@K$-HGK$,+,$Z%#X98DMW*'PA+*,)[ +M=ZYJN>R!-EA:&XS8]780#$43*,P17N[_912"[F46!08HJPEZL2AT=GE\&E^Q +MZ:V<AY+!FF]FC.8;-`@ZD29JE1H&3F4GC.-6,I%RMM$P)MY%M=A7P'IQQQO% +M@>=2&VO??EPC3W^D#(F2*XVIC3EH;2?-EH?3+#;YKMFG-S[62IU;H]\(".!/ +MHW(^IQQ#YQ.E5F#Z*D1\3/#185H&E&I!QHC7"I/%2^=SO`*E34LWO+\3&4'$ +ME]1)/YMY$"B%F0P'YTU'8Y!U0K&7W!.[PE/ML"&S8O]ST5-K)W<^:J`T#<%L +M'S?24V*G&R&$@0`7#H.-//#]XFN;TUCSNC\M$FRCSS@XU36+*)#8%2;1MXF2 +MT9MV/AO6>@!L'Z#NQ"9-9++J!/B<)336`!SKSE)E<3`(?#?7H%7ZXS:-=0^B +MD'(&+A.(]5^1R$!:+E1SE:XS83^H`W0;NP2D,2H%%;*/GPFO7CZ)QL'W@>.E +M5W+N7"><+\5K7C+#I%TY%*.0:@YZB[\Z)'9E:,.1LR:X%J3>-S,].RJQ:5YK +M^42XP3BF6"=_]@(IUNK!_X;3=\R7]9W:57(>!5$,MO^6Z!6MEXD85/,QLF`J +M":]E0.EV?R-)<>=IDT-">"]`E4ZR^CZ+"[,V*<?(JF4:&<.OU::$/_J$>7'X +M60M?;=?L1%?A!YV7-]^%UY;T+_/I9AC"6B>3/A;#T(?K8T\++_"NR$'I#THG +M%+7QX)]Z9?&K,8.)N3$FE^6%5NYI_CM8T0.+0;%V(J81%&ASKD0)6_<KD1`. +M`^D6$MI`@I-1QRC@_9<8KEZK$$7M=(S!>UDL8ZF:J][W&8>'&C&9J%CRU`2S +M6"LIYCG?CEJ?:>7%_=LS'T29:@?#.@W<\3?$C0EIY/R&V:=Z=O6!]ZR-O)7< +MG]18K#R*DFG`:Z?==;SQN`\PP\ICL2&M?^TL!=-V;IA2R5%PK4O!Y=C>ES:X +M_!:SZOG^L&S,,^MUE65!>Y*Q`@M_2'KDRJ4D<,D8S>8R-M<I"5+22(W+-9O@ +MOZF0I\1!'#;&TWETDA=?Q/Q!>\(YS@`*#IU"VX71`JH\KI%J.E8E:$=93\#A +M2XCC(+_3G83AQL&Q01D0,WS_JXF+OM<2`BR^?]$6;QPPK8>%03")84<A&2PR +M[L1K_\"X[0LJBE^/"B"7TFIUQ?,U_4L(N2JT^VEWI_0P?76<(3>9%/;5K_MA +M*\7#E$X5J4PR9)6?TA;P6L@?(GSV2*Q2Y;92%-F@>,5?BEAJ7,844<?626(> +MM&AI$DS=!L;@$'C<UK0#24K#A,9[Q^RZ5X!]PA''IWBX?QR&CF*#M',@ZXG/ +M?>*E7'2%B=EN7=Z&F:S[B(8FU#CX(08<<(J(O_-M)Q-S4-%B;[D<G>7"KYHL +M<&1#\:C]=-!4ZZA)RD5:^F\N-&&_!@%D6O1O;E#I`@CY_CSIBG(>5<K.PMA[ +M$-F[AQM(1:SD8EK^,K"[!'<4O0D.D*HO@-O@^Z9E`XGRT\G`.CFRH"H?%V_N +MOV.NW%3YT`LO='"^D^24G+,(MR&?41RUXF)SC9$H_3L.X1+>:',RT:$>Z4PH +M-P-X>\LC):,;B]$NR5F9Y'XO:RX=[M8!D^MU`+7X:F<PN0XX&6FW]=PP)E5) +M3X%J-[)=7N%U/7)(-0(1?9RBT9+MZ/^TH^EWU4JV_>41Y^AN'E,AR<.J1=<D +M!V]J\*;I!WO%ZDHV!Y;#6)ES[XEX^R5ISPCE$>I85V6[.$]'LSQQ3%:VBZ'" +M6G>R=B9ELTK:#'6Y/RW.!1AU%W?X]@!:J!5K`N_GIPV<R(5?%Q?L^-2]GQN# +M'@32>1ROSW\^Q7I[]6X?2@J@UO^5^U3F9$M-(5!Q9OW]6!ZV]=WI5(Z;N7+S +MN]G?1"G.KYRMZQU>GOPR?T8I.+VJ@'7S)/JZ5;V=S5.>S]AIQ#$G9"&::;$\ +M>!`[LQKX\RK4#7VO5Z/.U:R2H43DV8",^^BS:H6X:[442:O\&I"VC34UKT4Z +M9KL/$KIDHN03TSDA]'PUA@#!#EE`PN`334A9A13[32/&4UM)N`.,8O`V<JS! +M(NV@,>BAQQ4A':0)"4C6"GP_)'/H$=S**J4];$7G2_TZT5Z`%_!H;O8\23?D +M&;YU.`N=-IC$R2=)X&C`HTONS"4>.@=-D<P(@EA-3(DGNTD3/1;C$S5QL25L +M^'B)M%&-4!9<21[J;*A)#&$XB*.``/]3\UJGT]5"P*V0V0IY`LEK)I:02B<C +M.RJ-36A24VZ;$H<3FA-?MH+U"@<H.U"0HH7+>Q%6M*(GJ!406X4E%B/'C)D= +M[0#T$D-C2Q#$Q(,XO0:SNNDYJ(]TBS;_MB#'!,[Y.+AN),=1.[87YHXS&E', +M(EZ-.H6Y/^TKU"^/>'@-@C:9O9(P;]C&\RV#M>A__@DIOYTOUFQ4YJA%LJ_7 +MJ`IP?YS<ME[ORR[`LB2YX1M@,9JH,!KF/&!XW%>CY00=:?\-]?GJCM@H9[?X +MC.ZR%-S*H85""GWZ.",EN=$!\A@0?)!BL-_6Y-`6_'D#P`WV<K!/-[;O@\YZ +M@#HU^(BW_L[I@I^V,I^&/Y4@019HY8Y3<)OR<LIE0J8>JT<J:<H-D?P4:7UQ +M[MVMQ!9+NK:_$IEUC%,B>,E#Q5@KEG2Y\P>CR8!82^XR1("N81=&>_4:R@MT +MQ)%NLG$1]M^^W'X[23@IZ2(^:NZ.8ZU`H^7YM^E;8_+G'T:V<W6?K$O0;N`< +M5+(6I4]S.=I>Q694PN"KH/\@.^S8&!ZT/UX/`IO=H+Y[@_\S_:RAYC3?"8G1 +M#94PPP^G7>,KU_[Y:$H46J``?R!L(;$S5W8[_!QJB*-,E=8[+_+5J,321M<( +MKF'X]6%N/K110L+/6XV,EK:O<*CX4X(1:HD9#MXR+GPF!Z+^80S)X*G9F[5! +MR:Z/N%]?7\@6G`_PRS#50.W3Q\O")K!1RP;2:C8-%IK8L_1EZR8Z&Y!\YKOJ +M4D!M:5[^H2H<]IW^'6.9!8Z..#%RK%XU0Q]J[4U319(8HI[@\."%!P=7"=F, +M&!_VF.?^4#5K5L[V5"7_GV<LDCDL;+%"C15?(TXE(.E7"L"\1#NW6%XL::$3 +MU\85[8$T'%SAAVN54%1^[V##4B-X!Z)MK&A_YLMF:_2:!&LW6;-M\BI:?\/9 +MK#O1*31[YNZ,E*)3/9/L9D+P"<JL1EC;5BF'RU-MPB!>U9JMWYN*X^_LT$JC +M\S@L.[@@F8^0[NB[*O3%9/:-GM.9?]&YX'Y2>H+CQ,TW\\XMJV[<YY4"6\I^ +MI#79OO;Y^#@JHP6+D89"I<I$:6A:"E^XC&-Z&<]ANAXFC[&/8P\DHIL89-1K +M(9&PUR_!:Q=I7E&%X<F7#J!-=5-I5?GL%U'-UI8$ZW5=964+(580KGFR<WI$ +M].*''4PSP/=H3U9M(#?!0?^YVQ;753T.4\(_++533ZI!O=CL<_?5?5!L(`DB +MK*DM)29#OMF5"8L`^#[S\^OQY:F2D^LG%IN40<3*\Z22'89=0,%XETEJ9LJK +MI@G7F.60!;&0VKP*E%J[*L\<Z#1%H[!84VR(?C#G)=+<"P&<`)18=N1$W%;E +MF6=2OUVQ:9^\9KRLZQ]U7I);Y^^S_J\NZ$B5MX/6-6S21*$5L)N.8LS_!0F[ +M7S5B17]_G9=<8\3`HG4WW1IU$+V&OX*_P"V,+9X2[#R+XA%.-AUJ]T`\52XE +MC1SDSTR+*UG*7LZR)NO;1,P\>4/=K8)]]AH1:1?81OOZ3%TFQ+&/)/:R4[6. +M_I;QS>%OFZ58VE8$F0*VLK'1\R'=@R$*RRFZ>X>P/N;=%VXXDR710-A\&HNN +M<)'D+G[4=;=GY.Q8ZGY^)2Q?BPQD/0"N?++<,Z`Y?]QMZ[#O6\'=S(8FRW-7 +MV3'9Y>2<4C5'9<:D$E)'[YQ8(R#%I)34XL`2BDYU-T1BO$I/6C!/Q)BE&J^E +M'PTDLJP"A!-I[H]XSKEK\`IJ3IH#1X&Q87^S]LAF0U9J6XB$WEJL#HZ9"LI8 +M_@M0@!/5[S1K9;:FEL*.9<)7CQTLY<4B_\(DK!E;Q$Q1M-*1*\+`TV//"%?( +M:"\,S:='2M<QC=BEP9G2%?NYIZ@#`M<NVQ1NK;;<C"@7*P*J![/Y_6@1]YV: +M>D+'8)`$_.MY:);43,?Q1N0:I_I-9P$*],<QR)!5=Q_W/03F80:V=T`ENTNT +MUBW-CUKYX5PO55*"B,`O'S6,J4D))F1RX'P#PY7JD33].L@CT%]S)=IO-BH? +M%G%I&KNH>\BF`IS52-Q).=&4A_7!Q\-OATO(Q9E';`&/S31YWR%.\8`L8BCW +M$ROJQ?`/C8*_01HNDS)8_6/4$OO>('/UX.;QR%[4X$\E`!-I[<A/`M6W:]W@ +M62RDKZ*35ED96CFLS'=Q,>'1'VH,'?K]UXO/+$EGSVG"\E"%MV0`XEQT%8%< +MYL95K8P!VM4`6W+.=-,`*`28D^3D;>]AV>1OI:\MOT/X['3K[`1%7P[Q<17C +MDR0K'G&:!ICGSV@3J"[VV>!R7C@>RAWRQ1/[3;.?X6L909CES@K]#HD9)D?D +MD6:X9H,!]M:S08Q*1SI!`R>DA[/FH^-4&16!84.'@[4L5#H2R:QQ)!RB+6:1 +M-WD/)4/6XW<W9H-XOW-AJ7E55T_D(:FQ+N5$JHY`R-.4GG4OIKQC@B[WY@L9 +M;2=>F4SB<OD++Z>/7T?&26PGJ5'W]0GTO8%=Z?!7X%<O>4DD*/C'[20-VV\< +MY9%3'T5EW2G>M1E+2TTD`$SMB%G^:7>BP]*()-_6DO?OW9<V3JS,J]$=7N^A +M*FX_$5;X=TB7LV(^>W,`2L56"9F0&?,Q*DM50DR*[B`5X-3&ZIHJR,/+\7@_ +M/XNAZ6?%HMPJU*!6JN=T>A&<U<R&7TWF>,*<[ZB..CN>@?Q"QX/Y>;VA`;>K +M@=A;"=(]^FK5;2;-9<\Q]E)5!QX*U5^H'^/,2C432YQ*8XJNV5B$*7=2WXR\ +M?!(#,V)"4DD;@CA8TIOS%&;2FY"98IK/L$7'K-(F>N1PO=_#+>_HNA>N)^[P +MS*],/;RCR9ZZ.O=BR4\GX[LI5!'H]%@@"_Q6#X56MC^.V>/??MNN`7$]5E*^ +MA97DW_)E\'7C)&8<V#;@88D5:H:[Y>^7</D99]@A9FJ*P'YPC:9X_OD-_'G1 +MT)+D,B5@)^4`ND;!FN&K!"%(2"J^'X$@-O/_G9_E_HSP8]5%K&KS2\LNJS8F +MW0CF+1P(222Y]9T?,>9J773B<'-/90X/&P1?K"I9O50^-PG7A4^*SH-'*GH= +M?>`H]FM'3NH[8IOPI@E-;&\=B<Q2J30_O;#:]C,U?2]1`<;F,$A-VW\(DXL* +MRJPT(QR].-",*"!K`5)#)DW;&/:AU+R_!VYQ-ARHPSF2G:0S?[RHW]DM,_N> +M9&Q,C7$ZZ_6]3@NZ9O&7;5-;S1LX>>RJ>%8^@F764_-09Z%.$9@X>[8<EBTO +M0U/V;!(\RN_C[V>A6W7BF6_)EST71T$?_9MYFA[=8ZA\TN1,FKAMWB0:-$UR +M^N?!\.EA=9'#,IO8@P'_8R/B-&:7!R)X!F&QH[M.$89Z6F-VD9VD7<ZV?1'4 +M%8&\)9!!;7E9C^HR%I/0C>#;67H+?^1_27X4PQ`3!.`<(F$`TQ>F_'@=5H1& +M;XZ9T^I7F<[60K)7J:'S<%+9G8C2B-"8NZ0TUA%(ST4+)CL!`&B3_K7IXXC0 +M6[?;H-WA?TJ$H7XSAAH,6#1MI.M[H[C8UT>7Z^^`\QTF;$DY8<LZ*)CVN-)6 +MQ/Y!1ZA[`[I,`/7@AGN=G35"0+ESN7O1`&\5\4'J-MG<!G;_.%<9S1N1S&D3 +M-B34WD/+]@_$F7"%8BJE[3H!,GP^=%O76R!6^C;F5;2<)NMK)8T%8YKX;D"> +M<\07EJ4QRTPK:[K84I?<E/V_O2#<HDD+5\J`T>)6#CT$4!;[2^&3H/CKS'8[ +M&07+S(GKM8<@,\85L>(V"FF^F`YQVH)MCJ0!CA8X09]29"@;R%01]M-/6/GQ +MM"T7FZ&+8[Z!4R/6R0\QBG$M+-:A^_X.P'XV3'!6*GK\HQ``CTSQ*2!F_:"O +M@PI5+DE'RL;8#Y?8A@GWH;XR!)RFZ#G849H"DY?&.`MJ>&'^1=>A?)!`/EW# +M`8>@<-"PYPX!C)H!4_;0"I0%3=5^&><`*)[H5QAA`,`GQ118:!(F73NA-K$1 +MP8N_]&101Q%6)->P?IACP>*&/Q$F:1<Q'IASK-"D3SP-=6KKW*S/U`JG9U(W +M-FMM-0^KK[*PO$S0"3E,NX:U@.\F`W!I6;;4[;$@T95^(J-?*QC3M[6-52A& +M71S9HR)V)YD\O18:_&10O*R,J['>4`XZ`_.,[-`Q]EMSRT(GK.H(KDC\JYHM +MN<%T0P4&P*F8\Q3STISC*U>247<-59^9O42*>D5`GUF*M;<+\I=4M(F3Y32V +MH_<D<H2T[EB^@:LU=A'P<N]D_5UMK$."M&F$BM6:DQAP0/CJD(2/O.&)1&=K +M&%-H'W@O%U)@%[]H^L"`N'8,B`/9<D?AG.PX6YA/KDXI\2'V'HF8D_J]AOX= +MW3!44G1")`$J1K$<XE]#LKY]4=^<[%5/E_$Q=E]^87K-.@6>^=^:J;(#?[,- +M'N7Z1HN%D<O-ND53G6`WH_WLRV:PRIK3>GL^BN)J`]#E(<47U!(AL,-\H":C +M["&ZS1P]R"8K49;Z^K^6\%]WK`0CB9R?!Q[)]@WQZL-6S<7C#B#F?;9M&TLN +M9C[H"`JN2Q"CE#+=7ZW5&T<98.AZXBPN?WH&2P=+%G,,\I_.VJ#K]"'A6P[N +M7Z'7>K052VI`B=TKQAT0.@V&^Z3!S!92:T>85>M?\FXQ72'F*8%46*V9GL9I +M_4^-UDSQ_BK7U[KI5DR%O<'&D`R<FTI.0)?V)I0XQ&P^+QJ3+)#PD-@?83*F +M6&#_?W_$J'0)0M1A5+7U'7+`M4'1)8WD^HU!%=IVF(M?YR`>[F2P14E2UHSA +M&*]K8M"^4'U;+[/__25+*\AF#5*);R.',14Q5OJEP90"JZ%CLYPEX(_`CGA[ +MBAM,4<>%.'!B3!%E./4OS7B;/U+M59+)^U6Z/@':_2MP$[X`N^R3[)>SQ(9< +MKO9=VQVE=?FHNU?)FIBXP_U<3A`-9MHGM+Q`%,+&0$Z/@Y1Y!J?7ZYB@X4+L +M^``::)[4AOC4`6;NT@I'?+0;]9($@+#2<&BXSX>,!#R'91';#<5)I'Y9R6(/ +M:+L/$7JGUD:GPJ&&_TRGX>?)8`R]#5#='[!#QW-(U_RFYY+J(7U4Q`IW**'% +M'/<(GT9;S1REK7L@"2S;8-W>OZC!5@D:0IF$G[L&X=9CO\:,T%A5YQ_,>J>W +MAT3"+W+A%.4AQ`2WLX/C6`OL/8+#7X-1-PG31EH+.'<QL5B/UDAP%#22].]L +MV/4ZU[^<9RR)WG3-[>2\E-EC%A!0NF7'O+D/0\?ZE1S57H1(DRA^\OI',B@% +MQOIH;`P5%GWD34<)J#A/X%K9/H+N3_N,P#&C(M<J!-!2G/55E1T/0N;Q("(2 +M>Q;D_W^\E>#/!4?J0ZP3'_YQMK3"+T9;',UD\AB3B*TFH+S)MZC022;T>:S/ +M*:S+'^V4_`3B9QL;[R\JS]SUR(%&6`J*GK6O=K2*QVY2:WFD0+,=F0-82"%1 +M#D$+U=]WN&9VH!?DK$I+DV1K;K%W`GCQP$3(D<RL_IG6%4F&V_"4R*_=.8H` +MA?2]ZP3$C0=C4Z`K31Q\QV)YDG)VY*[HALB041%:DQNW?I-*\,,"G_RO]R6B +M*>%FR'2]FQX/G!.($5;P2"M(E'8=Y?JFW*0+?UB!1.E/L_9;(RS1*NJQ9A)+ +M/_B!TXLN^RA/7HB3@?8O\+JZHL%-GO"_*@7BH?Q^<MA<A.C0^*"9=<K;)MW? +M7&:D:B]L?"@Q,W1U2/D!:/3_O?QPY)`Q:=%)WD93CZK/K$=DWP]`:IP']FK1 +M7EKB8C*=5HW?TN)L38$,>+SS9J+WMH"9=ODHOI&*\]+C(WS",,CJKMJC,<5Y +MU#[J+-UYL.S&NTU0PYJOVX[C;>33!W7S.6]IMA.)`H*.EZAY=^IL][-_F66R +M:UYS`5DN?FKM17W"Y-;0I!TC;5$KA2?MFT$$=+,B-HK25UH$\A$^+".`Y5VZ +M2\Z[>$BG/M^ZEBSF05-E)WPU8K;5,,2@.*TWA:VUH@C4"3H22D9L:I^#=X!< +M-G$S7IMZHBBT*I7N*`$[5B0E(/G;L.CG7@Y,Q+*F/D;"#E(7;3S(R4LL-9]L +M-2@]JRW2U61.D\;%RL3T)6>54UY"\IK\HGF2",6EQYN!UZ]!C(E(Q1Z!)?[" +M9*+Y30N`[>P';(6`*B`#0H1G7MQ]$0(:G9LLI^1Q'I&QHFUHG[(/JA;@YQRQ +MBS_&A"_AL=9?3>*)/QO!HRXVO!S$G/8^["+9UN^&&9&*()3M.\VJZD@#N@3+ +MG=Z2&\WY/Q@$?32<FDHX?>;),O$=((]I/$JMU$L#<@CGK@=@Z/"?Y^XG>WB0 +MO&)--<=)-*AMZR)&OTUL3F)W9RPN?3]UYY=/%)U(*]UPDK!_3!E-H\$8P!U` +M;8GWGCM_H18[5`5WC".+A8+\^$N2[HIPB^2+[VM(!9UA2.?B+O\.6F<<$AE@ +MM*8\:J"2JN,FUBS5$2TEG'A'`5PI>0KO/24ELEM.@ARIQZ#VRI\J"\M8@Z_K +M7)4XJ90.28\[]XL?/?2M4`!?@_12$G^&)TH\!2``)4"@'-`%\=5\)SGW9[N5 +M_)N3<"VV7SHKX"B1,F'VGDU01(I*QQ0I_>L:5B/_*J.$\V%ARW4,4Y'4A[A5 +M-,NF9$75>42G7RNBY+I73`M(PH14I#DQ/O[2W]HJ9&#@6(6OX:-\B/)8`O(< +M(U_!AG4\HD3$(J>G+K6$2/,[Z'0\CF$#5A0C5!]4>/,+B"<G9V&ZF,^,A%?F +M\%YRW[CXJ;`!Y?$C`U;-NMXKG2I!>C:CB`KIDA#=DO>-_FT_N:A[)2`VQ'O_ +MR:#>[;`X';_#X*Y]G,+,"3YU/(8QYI^@X]62KSU3`+OCHB!,RMU(%\5J43%_ +M%'J7I[R_'%M+J\1`XIYP@2ECT!N<9467[$Q&Z!X"\.,U6PXA<GM^OGZ'J-W> +M]=U*@G6]/#%54IA):PC).0EL;ERB8AI!R:X%EZB:P0.,`:&O/IGFH+M3GK_W +M4W;,%Q\=>[X1Y:5#O`,FE945@0VV`0E(S[J/:,.2:`Z(1RO/(45[!63,].<O +M@`AAJ2(A9U<,H9SKKO#R66TYC[G"QTQ&!Z]SMX*#[)>O4;SQ<>T,ECUR$:XY +MW^>`^6XQTACO>$Y??Y/I`]O7;=NR4"SLTUNRE"$>72@]D60\@\/S<^?JGUR: +M)X.^P<F*KYDSO]FA3IB3C!@]3"GVSEXPJ4_J48G>*^^?NL<C2TVK<&@*H-2^ +M8ZU-/Z?'HM(&X],I(S:IV>CK#[8N5,MZ6`\^<SQ`];,%PI\:$!XZ4#<Z$`Y; +M!&[)&C+"9V)Q\$9@O25[UDW3R*A3/[U1P*-=U5MP#_OOESEHGD?WP'66W@(( +M%[BTJWZ0N/R9JW<(-29<.*I8U.ZD%6@*F.PB?<I3_6Q+.?!X35N2QUD5\82; +M"[25R`B\]KOSBV3,GK<[72R/XFETB08$9"0K0Q8`U(8*SK(9BDL-!4%F1CAV +M)39D]=>U,B$:;41,<:V3;,/MBI_U;2%:/]@>`-I_2,68)8.SZ@6*Z,@T,+[> +M9D`NUM%_!!E#JO>?2$^4M07WRW(O$M!/<*QGVWWN8Z,WK!$7;'1;XB7('ZMH +M#&!N4E6C.R]&-CQL_4E+CFY:H/XB2.CPV`6<))^&O%HT]+_P4'4L%C_J4;;M +MYI9\("O<=PI:_:;0T*E`]OI_D:(*LR4G%9>H1RFE94;WL<_A><\+2+E,>/FV +MB.XN2(I^O_<IW7^!M;LT*/1+.%4T\6TVJ<4$X2@-?9RG%84L-M?A(A4.T@YY +M-<U'H1%M:&0BW&&%/NDR;0';MR3GYY>+_^"+5AH`#%,J7JJ;4Z50Z0F,MZ76 +M]YS%!>+SM$(Y.A6K7[ZM7*,Y;RLDC,RT,;?>K:19M>@[$:ZEXA5-W0NKHC[6 +MSD^**`?(K6#G)D]@)O=?'T9$;INJVF1:]C8EK@AX:]P@CNY/-\\]\?3UM,$S +M1>!&Z3KAC12X!%G"B7&-N26QH0Y%DA[-C^CG]8CFO6_>&*DK;_9;JJ_8O@S0 +MSPH".L%G-L;BNHF(<D8"(ERF-/35),Z0DE0J>^!KE_5'05S>?$U"A?GRHV?& +MH]2"LDOE[`UEN#D8ZCG^=SH^%%,5NZ#FGE*7_.V<4EZ3DVHKJXVP7F$PJ'FL +MM)H"'#@QYB!M@$\XCZ<BWU5!UCZ(\1F744)QIN3-V(6KMGY:EV/>P3++OU,; +M!Y2EHL:>REI3MISWNH7@5[(,MDBN9YR4Z2X<J,L')81^H9AYJ"[M6!;KO@'1 +M*JUNXD*^"_'T"N16A]1?0LS#(!D"+&*S>JI5FIH]:$5/VU`RGPV5/G:=@,L$ +M-M[==2'!5Z?7"6!*_9-#Q5E:U0JFWV$T=UUZ8"S1!Z()]^XSJ`?`%K&G%;+X +M+7-V\,R095<D&`L'<LV2`7`OJW8\BGP%;Z?R!!>.WHM.MSHKF_@Y8OVV6S?Y +M`F7'%2*1">A2X),$(&&;_4N(1&8<LJ]J9Y&!GB-I1?;P?L_L$.16QW?\IGAC +MWH2C03`GD.Q6">V,5Y_$Q.T6-CFQ4I>H\?.TW;N%$:P'F@6R[H$9M<4&B!78 +M,A^]=3/E,X0POTO7$8/<9KJ>5*(3,+(;3%TWZ,Y>E+<;#\E9Q$0VA\1@B(U* +MQG_J+=01E7#08\U.&ANWM\=DB.^_OB]D=K29A87$H?@A-W^;Q_,HL$]KF.0S +M:_=$DI0QI"7)6JG.'[=,ZN0[3`9+Q.-ME`8Y\9R)I_\3W+4)<5)E:[0RRQK> +M!CZMM=IIDQ78S(_!;SQ"!;(IW/[,D7P\[YGZ*"8([97;4E4Q=G3D?4H3C$Z% +MPU;FH[KY,/1H%TM7U#'"I_?D;0K7XVBP+9XQ9ZU,AX/W['G1XN]0Z\UW/NF- +M42_+DM2A($=T*7#T86>`?V_!:D'].1W8%S&Y&<(<_ZNQK+4`:J+T!67>;I+] +M]\`Y][RVBVOR>K85POMN"X@\$9$X+26#SN)0B.J)EW/M*]B3^<A((A*C^B/U +M#IN,(EHT;^]60H5?^.]\T*U8!-.2XB8H-:L#/.X])HNNY[@W153F([X81B$_ +M,^#ZTFRSMR3<84PJ#LS7@MA2GI=-MJNYEISS;O^)A"?K1&C%$7I]LUAUQD%Q +M?E[P5K2;(0K,&WYU<8EADKZ7YZ7`+Z>BR59;Z&!G/W'`F2W?'Q#.KO]9-9O: +MK?$Q/^ZNV#HZFE%)"JZ<\?HWT,*]*/:]>M`"XJF\\;KEB!+\#B;U]8F[T/#> +M-\>UQ9'FU%^:.M^BQY-4DY7D(OT7^(-3O]1107#.*2EE!;*@;2?]^`$[>N76 +M.]%YGF=G]9:`>B&/7CW?@D^LN&W?0H5($]'F_%+R?#5-9Z:6C;>^DSJ\$['L +MQ[=?3A(`!2&=D^_51&*:Y(U'9_U"S@>1OK9FFHYB`"E];2ZP%JL!`!946J+< +MP#`X+Q$N[Y64)PE00#J/TX5%/OY(/<K.Z>)&[M8SE%_*:*H&$4ZO8D;WU'KU +MIO?'**$\P6"8V;^[+?7%W3W*IM$87-9L\P('#K:4NQ#?'PJI=`_FM&I? +M@XE3>BR,P+TQ$BFE-:JH(Z)T)G&[SYC,2ZVT7ZUZ<*1R,AE=NZ3]X[GI%ES= +M./$UUQ8LH6@2TNY;C0:,R=C?D?$IO80]1B^*B3WV)9W\!WA_)W_FO"CJFFD] +M-PE,DEUC,Z.T."ZJL&OZI@I0(A4EV#E[MS*NN-L:`Z8[/8.*-,G&57S!B\^] +M6.*9G$DO*\,^MX!\I''FH1GW%7=IX]A*U8C^\&Q9.)QAL^6&4:<I!-V'^P%3 +MNYZXEU7NNY4WT]_9FR*_9:J<A!R7S[,"'_7H5Y!FW\%&4W*#:<6ZPC!,YP:* +MY8\RTF0:/U,>"#;+DL?_=*TZ/;5M#CA=U.:^TA$MX8<?.(U-%MVUL.07-(M9 +MG5E[[:\TR&Z>UX*.&O$;^D3M;S8*A`/E-'A9-KN/P$_7>A_;]F#VXLO&55XV +MI[@2MU;<`D.TI=WY\RJ?HL-28NT=?TN8G!.W50`SE`]JOOR!W;-(>?61Y3QJ +M7W)7>'?IZP,]_G7:!BJ7M5Y&$O=\3`Q#J>P'8\F6..Z!+O\`&)O9,<VRWG); +MC3(-^H9%&:O[\Q).JWE"DDEN('DY0RG0G.Q>BC;'7?GNX2?PW@;[0U.CN66Q +M`M#:1/"KHH8X@I=\T]K*!8:[Z"3#$XB,07_FS0E-(N]+/F#*'7X>'=OU([&6 +M\JR'<4<PPYM:=!.YL=GW48,F)$K9[C&Z8P7%)A4#8N+/!RTFC+PD^A!#:F-C +M2[&\5QB^>$CS>\?.*JG?)`]M:=^T*Y?NOJ3/%"YM2$FY5F^#Y=D@]HO@/_XH +M'IPQWX.&WJQS40G.K@:/]Z4(RN%,%+ES#\)`P>O<X:_>4^/CR`*LJ[I."]]? +M<4^@-1M//H>;W+Z"9F>*>(^[3M,(.U5!;GA.#<QX@1,J7>!V1X_BA((<?")5 +M[0WVMZ_%7W&^D]`D:+(G%KOZ@%(:LFRRB%X,E7&,`ZSQ<.WW#V]=*=1MTOTF +M"(E[1'\[]]85A`-O=>O3+PPF8,<$D^$MYZ--*]UI4)-@!F<$Y!-<XH<11C)4 +MVE#9=7@K:-`QYYFBLPU:CYOC48CTG`K_4-RQL&*BN$;R((ANW.2#$L)-FDQW +M1.>$P'$&5AL=E0+0B<`1$U;(W'7$<TK(V@BEN`QFC&X#3TP,5-5\)_`8`Y<0 +MC&QGK3I,.MI5WY=2?7&68VI\YB;1N&;.A8IR\<MFB34]HBRN>MN.Y;@=Q>3W +MV26J%Q.Z`@^\9I'>)$],<6&DGGZN@>^K`XR:KLUMG3H_`2&GE:+JR%&>MLU4 +MTW2A2)2/2O#EF_,BGD^V"J1QRRQM08UZCN&%?9:!%S0[!(S)3&W35=?$6F*7 +M^MG@@`45N5E%<$CJ!J%D.><8YG'^2:`A.Q_E^@8"3W$HPUFT#GU#2#KHEAQ' +M\`/7<9,-WGB53-?X`!F$ADQ8YOY==>$MXJZV,S\U*OM:!;=6OJM"Q\)G$[@& +MM,]Z/O)H1!B@BQ"E_"U)J7BG%A@Y_=@8.40I,ZDKE7?K7,&22EOC>`_-87QV +MNI-].D6T>PL#^1X%WDEU@63+>J+6C*T\($3**4)#!9V"&\M.H7^N4Q*-!EC? +MA;#'',?(9Y(%Q8=D=0RO-@<]3(^I14^T\A*/0"5VG'H4=/#R6P"3`OB%G.:H +MAI2R%OM0XF#3<P1MZ8;5K^ST]XOH4)+41T+NHQ-E(A]HGZ8H9+6!RP"IOCE$ +M?`-?KL=M3*UK5.,G4V/JN0"3/SR?..?9P3LX[>G=GDAXPE['3AZV"EKB[9RY +MC`4>[<[9G"%"Y,0+-+,VLMM6E7%NNJ.$Y-L78=VE31?19XK'+Z,*R)P=6-#, +MH3QWZ+4;6MQ`FDFAP3I=Y!,;-#K=_5Q`)TY16EL,@CL;4Y<DOW@Q6&]&HB"L +M\E0.'#O13X+D);P:5@Z8'7P"8<DGM5;3F38:TFGWQHBM*LWBP%6I(-WRCZD' +M9KFX.78DED!H%U\^\J01EF:`[]NF]Q5)'E;N1]<[X#"5!);RU@5?)G+$MGWP +M%77C?M^3GQ57T0[$GCWI_=R(D]L+RSL<`VHXAVXV1S,]EVX#!A$+J;L-+2S5 +M:P#5G5RV/U%%AL1`F_)&#!,+:.7'Y:BO3JU"UQU`SUG>]@F8N9RZ&(WU,[G3 +M5[+R:)%***G\H5G:E[AIP5>Y'T$M9J>)"2C0]T>[H$C)!4?Z0Q?8O6><[I/[ +MWE"+I"*F$ZDWT=P)&Q".J0TDC.714^A3[DD"O'Z)B=T[NJ.4:>RZ`RJ8F>>M +M9_Y^`PD@^TRYD/;3U1\@VBX+T$..G4%2LTTQ8[:&('E]SU<XM:+U8,@K"BA? +MZ5_-NB_R<+OQ'\,":1PYB*E"+JQ3"9;COH#BIO;^]&7,;/"Q%CJ=!RV8'@*: +MB2P.QPW7^V,##$E/`VDHZ*TD*.;!L'4D;;0OTR$`'51A,9^2@7L,5CJ+]M"B +M25:%WEW`5])V)N]B9?T+9T@#+=XL.L^:O3]Z+8)P>1[M[+LW''S;$3Z$\N^5 +MTLS;+'"Y`2:9#5D%XX7:`U$>J8%(&3L`4$J3Y>?%+'V,K<)L^A!&'F_*1Z;+ +MBYD[D"@^F!J4(3DUP3`ND`29A&&)!C%H.N9;B-\^;]J"Y^2$&+F"[>?H?3*C +MB(W2'#`@:=-2(,F#\T;AA"<.")/08SB`29Z4_`P8:^4<&U?(X;%("$FTSEZR +MH@UO"FH5HL>.8JAGNW46\M15DB[SSK-RYUR:4G*MX=$48)#\36%AQTF9."OC +M'#`!?*%ZN22X0<[W+V75*';A_B9L[9I:RH1.%1NS51I1D""[8]FX^0%LK\!? +MZ&GEMW.GN$K*/HY^]F:A>F5GYQA'K[P,&_VLE.]96&L`454H3&G`EM6+XX^8 +M'&RLX,YX;@^>?[VS786%N1=P4-.!U"#S%PT<BU(&)I+,!<I#GECB[';HR*2T +MPU-$SZ'R\`\\P/-&F8Q0%()HB)GX3R)W:W+L<1Z>L2!N`$;(W^"3[*%1[\4% +MG&?;Y<_5>C8^KY[FMB1.Y+'Z&!T^%TR2833_:?FDREL[8&^JFEURP?&*H(9C +MC,H<QSHC;3-$P@C$H5LRC1Z[MP;`_"#YV4/_P#GG\_U^\9$!1@LCGH6C[V)_ +MF8$+L$1;.&GF^DK55RWV\/-I-3^M`REZ^!X.3%%*]E(U)ZQ#HDE:VAR^>F?I +MD`C?;;JO522G@;1H;I()Z.SBB#P63C'89CA7^7H?&7'X>T!,OC]=EC>7Z/?! +M_L:[*]:&GW\8.0H[23<!UO2^`8PW.#@D,W5YZU,\38-]!5K5=Z8[2(1SYRM0 +M4?6+.'$`9Q6T!'="(9_*PB<^4=ZC/#L@V6^(KJ-Q)]8L.H@H%Q#9=I"?@956 +MKL`+*JF>0,5=O>YJ!]A>IS2/.H`AX$<#0=PK?S7S#KX[6:0M;Z\F<_%OK[>* +M]O$4#T@2/487C>Q.G7=3[9`T-<2PNFI:=,9;N8N_NB@1Q7+T'^&42`JH%L`8 +MORL*OC5%V[=3#KGH(@,1`1T@.Z8?]'NJ6K`^TCJ!?R:#WA+&\9.0.&1B]06N +M`U@*0.593>G-3*BYY-$]IBPXS_=0&$QQ#4]!,F'?9'(=><(U:512#HP0K3_O +MS'.-2]PI^P`4U:`UFWF<_W,)?"%T-7VWP&;#42Y@=R!EK4:N:*GL#GKN"[2G +MJ+!9R8:A#"!AE8(`"V8@[I@];%',PM2JW>81/TI<_!"9$4C*6Y0RD-=IZNQ6 +M4@9G>9$98DC=+3H0;+_"0/WC1U,Q@:W@!R5&5T:_FG.^W;\ZRA:]9"J0M@E2 +M_Q8*4R91^.5*U**%>!NMMY>8<+H-#A25&=#9'!^:):/!!24T^+8"]3^'2_S0 +MFC%@I;QL?&7B_"%%!EP&.C'S4Z:$I;<!@RUKM*9`X\SZ[(CI&9C19Q=:8`,Q +M93L)V>$C\J]`5;<ZJ$@/"N8HB+I^B"V<4V)3`9<%G0!);,+<N52TR/D\+V:5 +MXV&0`"=I5.X7'?_.VH%4R\?^&.2HZ./KD"O+%<#6?YO#U:A$+(S,@A7LGE+7 +M1QWTR1US?7SOZ-:^P5+*NZ7"3EMFX'Q6!^<_/<$",JVM7B8V'MJE<;'B#OEI +MKRO'=3>`XP@(*]$(6MS2GJM@^X!I%WR;SL30GHQ<2#'_*S5&+M//-X*^C]3) +M*8(;'A5X7UT^@Z^6AMRKU;U6?SVU5[VB,JL(IE7P=!I&'?I#[(#`N6T"5]D+ +MU:[H)5.X^F$&3^&;KHL>:(`#=36W+[M:QE)9B<K&UF/^PO>BE=P=/P,2=6P6 +M6>T!E?1-U@@C$GA8E0R>Q7-2@B<\Q"TF7Z*O9))?Z9S+QSB*=L[IC6-#$-": +M2"QV&B;#?+-YT+FU[!?41E6%?IT1C3]6NZ0SD<&$,9NVC>QH:B15_>4D>93I +M]3(O]II!<)[CE#2%0/C4W`Y;MVE;FIJQJ`YC0*F'$UP?$^1@:KIS%[#QM?') +M[3]EE;K\#):?Q"9^9B3F!.C;7TYR!N:!U^'WLQ&N0P_2\T7:ZQWH1TR/!;:1 +MW6Y0W0[E.3/C%0U,IUE?,+\75!F<G'65Y#CSZ(ZXUPQR#="D33CL.4!;2"J- +M-9$B63GQO2GPO)@2"0(9PUDRY839QL%2PF6Z('KIWKI7U8'@7;L_[1<``+`[ +M!=8V`C9L]+O`9-H4H<V2WW6+**+HB^.-"$S&J^*.>1F>[_<%IUU9/DA5X-C1 +M:`4:(9UB$][/D%/[SL$VT0=$$S%(3IX4\;YW.G,TM-Z,\WI=-K4XB2M',HN' +M>5%>(Y#I'TG4UM4B,Q"TAY..]'I>96:BU+<A<,'-?DA@5Q:1A#0/+)44Y_&X +M%I\5)>3DF[9&X,#8V#KZ03U+II@`I5K!#'#"H,1I%@JJ6@F*YP-OGECH%UC_ +MXKJ/65?@1J?UP5@L8<"ENAGR&404%#*'/\3!<N@*P"AL:>.!QZ;Z(#O:DSK# +MA+_6:%QTLY:.39]KO:%5[^K$SG]2C?%DVS4%C?9O(?.+=I23T4`N8F]Y&<RA +MO"L<!B1U"=:2:/^IE3WBP^&W3X?@A1A6U]W*;C!_Z1%3T.OKXYXV0IEN^=P! +M+M&G^%ZPKKY.-T^O!LR6@/_AQHAG[YW@YSZR63!IL1=F4VUVK^CN\9QYV6KO +MCP2PCN$[%^H@TW1X$A)2KNG/8LN>W-UYKDTY+%)6G:?=V4/Z12$CWN+(?CT] +M:\@LB&(@#<B0OE@*9B2`;@==+.3"YUT[[;B531@"JYF;QQ,NE@)^A6@[P(HA +MZ2_-49TWV,N0N^<$J?#%.):E%L=PR\5$`:7W:[W(+"DPDE#[->$AT&PR87`@ +M:X9U1VL+;O3[4`H3HO`UWX]#E+70/,M;XW#M,<BO#6K[:9.]FJ#F!6@0M5]; +M,\I,DL]W"K.H0M##"N._CZ">PQE-8P$`R>M"OMU+]BI1;$87/E>=)%"/I%<W +M^S*<A,QF\*D;RV+`?OPR%)>6>^-%`6$%^+^$LJ^+25?OVEL0ITETD*Y$6BV: +M_*+P[\8(!\DQK3#]\,#GS><(`(:,(0UUO\HPK6'4?;BC7]?R`^N)B_2*%<0( +MA1-&*])37S>/M9I$G^OK0SZAA\HRY_J<DHJ!&1(2K(AOE<=-I5B1]51L"6HH +MP0JZ;4#'$,+;_U8*:.8A0A`/$K"_W+!#O66R,K+1U^7LB6/-7UGLO2A"EGTP +M.F@O":04,JKALNM?"QO=O4EC[7^&^*G`LQJP(QO9!$LKZL-!-@V6C&^W8JCM +M,(DS@.FP>RU;E++6TUR57PNE.+[&0-DB]=FC?9JS`2FA*;UI)\F#1-!6M\(< +M!\*<PSL93OH35Q#MN,F;=*B\5&-K*H>`8ER&T@8PA!\C([Z$X';L52B_#-Y` +MJX#'061MY8"@__&-@_`++Y6:@AM!"MST>BS#*&^=:5;PAW]HQ?B4:QM)0+3( +M:<%7"?&`"0\:,TUMJWTF_@$GBC]R7I@"G^Q`N3TDVB[F$E.+%CIXB#(:'#QS +M#I`#:#._S?LNCL42>J41GIX94,\`OZ=Q[RLXQM=>S_#$2<8AAM6F#8V'=[%H +MUKAXI&?-!LM@A49.HJO:3O"]5T/+/QO\>1\T,PN46TI10,'\.&EF3P&DY35' +MV(DN=:#9'*F&GJ*72?8_UR6QCW(K[&,PWBP>>LQF/MB`_[(PX)/9PKJH`#Q+ +MYN.7,)WC?2U/]&ZV^4,O2;C0WR9:&SYVFM;+<NWM/A*<4P)QZ_.MT92U7VH2 +M(-\.'CQ*3YENMZV&/,Y\H)^[B]F;]MR7G_B%MG=3X$]?"N^UIP=4<@1*DW/# +MK=0T!KVFD$/7[5&E#M^UI7`9EA`)>]E'I+D1X:E+.F<G'?-_*>>,9?8R+2H) +MS)Y[K+*787NH](Y4)\GK%%<%S9Z38*'9(>ZB^V(3N*/'57#(1>V8P"Q]U=(2 +MNTA]G%G*8N8-SM>38D.D#XHCM$M%Y;%T%%0+\K0YF%[-#(7/#+$)WJX\&L); +MB.U:EG%MX%VN9FQG%;9`-IL&U-N-E0M,U[U*7*6PWJ#ZND7V+*WAV*T6,O>H +MPH$G2LUD0M.%JP#=I6W%H7CRW-4;'!>P'D0*EO"V$U3:?]#E.'D?!]C*H7!Q +M%0^'`>$[5HDWSN<!SO317&_M[D7!H#+NH]?ZU/["2@K*-734D),J1#SU<--5 +M&=UA8Z"SOU*/(H+?%0@VV)`D>5_\\\45[FGR:@?BN5&_E74UA2YN:2K7B\L3 +M'-HVZ"EGX44:J2NF[^F:&0#(\U7`UT&@6L68'EU)I8?E&]C"CO:?)RF=3(@Z +MFGW>^)3923_+03@-$3=E;-8*L$$DX_.YV0X)71J4W493D\R]:>H.DL6J8'`J +MS$O3^)>_A!+XO>FJ^,8KO&L\,AD3!6C@WGUVC[C"I=FL=MXLKIN-"DQ2Z,V> +M[Z)OKR>5&HM\B\/R]+X=DLC*&+P%L`]6=K]$-4G<S>,60&?(FMG6,)2`&VSH +MIF!-_@X!_YSL\2+;#XOWGUN!\['7688V'34O!JF/5L[JC#ILK0ZS%Q0C-K>R +M0Y)N=\^T6.+G>H)MM3`///D3;_E;]>8O&<&0[J>9H_<'K@6HBV#^->/8>R(# +MG]*N;?F<2:=D>>8ASV"`62MCS+N!6@(\#YOIHN\7&F!1`V"Y(<`!(U[3($N$ +M8R>*[2>]V9T\;QC0)O`TEVW@/3&H9P(XO8LL:(`-C6K!N>]"!I]:MD/F;377 +M2J&JW:$APYD!.HT"*?G9SNT^9B8O;)O![8I#Z1CCBC1K42??O:PM_7VKLZXD +M:1EF"5XBG.H;Q;$_M!'*-O]E("/=CT,$7HJAN-.Z(B`AQP9W["VOB#1]V'FV +MWC-2`1$S3[>7)R&VI3;=_UU>AM^2,9(,[Y/64U^P8J@:5VX2&_=,,$KS4X+V +MMR5`BDY^PO=R_$]73-&H&":421TZNXE/WF`1N.*`O/T8L\ZM8(#+OH9DF +M&-_U(/T&G9&68?O+U>,/)/1N"7$<,WPKY4H"D*BKRXA/WS4)8,*+?\7=]XO_ +M2ZMD(2-L9+"T-_NR'FC_I_%!KS_AYBJ'$S`V4N3EH5SY@+Q9*_D1HAX(UT?] +M?$"6]4`A2=2\W',"J?L#PS5B&9;XFLW^@/=@N>K%K4G?D>`GNLE=)E3P8,Z0 +M'.%2JA9,OB'IX@P,?'DG`2!CPQZ_104C7[-F6R"L!6#L'(:U27-0NINUY,'" +M^T`MQX8X:0Y;UTU.H8C`>`"7A`W*TP,"V+1G4R'L(0RP<OF7!\`ZG+;H+3:6 +MB//EZ(M;WWEPGUQOH@M#MV,KF/7(W9+*IOYVZ@%+[4=$`?U@&!5,>-&5K/L= +M=Z1^G9[3%@:7R%AJ?\Q\-?6G<1!R;90U(1N</)AX:W&MRFE62M)]4=!$:YY- +MJCBFAYA@(S@ENV5?BA(78W@#LIG+#=Y5`A]M!P<8=P3I=)V^?I]_6[I6+%`9 +M=+22^&G8Z`E<1^OKY3OH1[!U2/GF+09;`=*E`GE69+>O#D1]OS>[&M,'A`&F +MU^F'FT9:!J38N?/>%?O.LZ\OR438,VS`EX=A6*@P-W/!^_N`G$*G?TVE\VBL +M<8IN8H;9W?H'9I'4LS_$%X[PC'JIK,4\&UM+@1D';9<5PQ2OOXX=^L6?"8^W +M1E4P.O42GS:'[V*<1QH,H1430AC:<K<'>!0UJU(OZ9BE<&QW03K:&#\=7<$J +M:SDE,UU\A"@FX=":'B%#,[`W@:O/WW5[;6P54=>CWTD@.WQDOH9O+FK424OM +M]M<R4R@=%>S!)3Z9WJQ:W"P+6HBZE+-#VT\O$BAK7Z"-Z@R4=T=PB2%M7=FY +M8['WBR1;?8'^44;A<_5OD]=(3#Y`FKH+AA=6F]Z?;,`A\Y=GD0IAB6'S(6:O +MMV&$_>+OH/H"OQ+1#ED!/*1/?4;YTF6W&>`+G9"#R]M1"8@D)?:5E$\1Y`;D +M_!0`<>.,XG??JVKG6U[ZKR-HL]5+A4!M6:[L/EQ&Z>+D8CBV'VFM('!P`<%Q +M!18[^Y:;&$S]3Q8MZ@CAUM=D:TY1="*'JN_8B$0P[G?L++1TY!`]_)?:].OZ +M-CU5]\F\6[8Y\(9<(1^SK:^!&:]R6/CB]`3I;=A0[0E,S^B]EKDI;1XBF=Z[ +M"DUWM2V.<Z#!@D;JYGL\Y5^(%MTKYO^Q#(>34VUQ`9N.OJXDO\=K@SU#<ZCG +MC!'VV14F&4-2<@JN7ST[;,:O8I#1:R`R6BZCY+IC%C4"(QVJ)4^Z-!:>".?_ +MM`]>`NE>^"9E"^1H(S,LL#"LU8!R><_1:$"8XIAASWW)AW&C&2(]IPX\CQG" +MA*KM#6578]@ONU(FKPCC1C09'%MYO9F(G;U&/^'P:;(R15BH:6;>M1#HHYP^ +M%O+9I)_*1%G)26(=BS%/W)^D,7A6*OPU"3Z$_?5/*OU,F'QT5NZ]:#F,T1A` +M>D_W&L(67644,F52]E_41C^Y8+ZP7^!*?>]+"GEZL[09SYT/J//,=(2W6B[5 +MTLH-]:,,F]PP<[_\WG/VSCXY]=T,:N4&#?0NT3%7H!+*JV^>?]W4YMSYAX1Y +MK]_\H:O$4>O2INBEV"XMR;N2I_=M1]Q*GN9'Z"[/`GDAZQG1ENE[T"<4'S5/ +M&P'8Y*N4DR#WW2%=[%CM_H6DL)F^8R?O/&5[CQ);";),E&2Q7<5)9:,P?'JX +MRZ>1S_93<@DV;,WPM[1*SPA6LL(6;YI&Q'&Z*$6!W\5-BHFD.R!3K-3YHYD/ +M=+0O!L<2:8J+H3$2D0S#;A5:`'K0$1M#2\ON<ZD&7WG_$=+;53''/G/-=Y__ +M2?@]2+VYX:.;PTXJ8MT*IPK.,>`S@G=@<U!>!A`!LLU!!2&R@)[:7-39+WB( +MHVZY'<NY)Y4C&$66I$%[NA5N/Z:\PQ[W8OO*5;XU0?SD<3&C0^196-?78)O( +MC4^/88B2A&=WX@_P<MF>T*5?9;2HXCPA``*O>&J!9W?:I1KUU%HJ`&&;/2#8 +MX4SZ_"/<-IS9+S@839F@9>2"=D`#I!E#>VR2U*B_I,8NQC]Q42+]R`[)9%JQ +MLQI@,O0\/E%O/CMIW*9[<KS^GRYB&HA($_\6<GF):!<[]Y?K,R8V"YF`5: +M7^YT;K[W%\HJ^;BF/&>^7.A$OAHAC,0UX($C]\?YD$1UGKQ$Q*4<+'F5_0#= +M.HR_?V=+?(4.;U@#9@=!2)3]F-^D9G_-QW%QOHFJ-R1^W-3P7D&B`BNK3FU9 +M.$G4MA!2%-D?+02=6AUZ@@$)1HO*276WWMWG`CR\\AUA+EP&?*XS*;;7X1FJ +MH3Q<%#<#[*WHZF>@6D?;*<*@YL[*2K.)Z[;AW(4LA@0G0.^\)<+A\=:NU@%T +MC`:S+AS9MX]3@*4\F^#\8%PNVK1^`^A-*R)@K;L^\I8_2OATM_#M6H"U_!1C +M6DC]$WO1,!4#-W`Q<546M.\#^JO>N=R1</^FE%48=9[U)6'!KG\@II*DQ99] +MR#%BC[\?V\?2.4L5*T&1"@\,'6'*Z_;M$:=08\.?6(@UJ#ICV=;K/$/1.4U( +MYRG)I.BB5!LV%4SL5Y#,Z:$C#0W7@(AYH7+3>S'P(O^5UZ#D*F*E_OZB"_/K +M!2"3!DVQ19#0N>[W\$2"?KJ9.1HXU9A^7&%'3,S7`@%T<,S)'#R+MX`H(X_# +M+B3D6^TZ'X!@AM\@^+"0167-,G-N*<=G!,LF\@C#UP@*DXY]D0[OVR4@.F?% +M'0Z7LJ?)N$,`K6.*B58?JV`A"0C7ZDB?!.^7W:P=2PBM""[?W=&W7*7+EV8? +MV7L4H_H3S]S.N.3M^W+_83CHUW=V$.5CT"-^K$7>(3\R_;1O2%V5)9=0P58, +M<SK8)3IWHE0D#!/<M:=Z/"DKJ8I6PXUJ+_2E5`+/G\-ZY3&KXX^%KU:Q7+:$ +ME+7JO-*2LE9R%_;;[7@4@.Z\RD_O+GD\.6]V*#U70VL1(Y8N)ATF(Z+X%$O= +M8!_ZB#O?GM<N%AN]FU=`CY6%-1\H)/'5'C4AI]T2]#QCE<[J"+">U\.BL;AL +M>(?LA&]_.BO^>\E#:PN</=`V%%41Z8Y&5'$.S']G-6G]4;VG`O,+V)W"Y:8U +MF/?YH`WXRFQY,C5F3'"<9R:I\]S+UG,CCLL494<WQUC)NZIH#.HN')K.XXT6 +M<WZ9QW9:]`U4QP:LEZ^^<"A'NRX[K;.Z_15^6D/`:G>6&YNHB][^!E(-QVHV +MZ?31WD1H%;@K\KPS^?\MK:NW:`"PX!DKU@,1\IMBVG3769!4_O3EUL135.9V +MWVV#='SB65R#.EM2)S]*I[^=C"W$+N]$W>D)@RI482;A&-'OOZ.T)2`<T58? +MR*:D.\==VPKC(AYZ:0(>78>(H#V^0@UZE],)A)(,!KS</>BT`$E!%2AZ[0N, +MF<]6ON1!G^QG'T)M+4X5SNV1=:9=]2)TV`YFM"#RZW]"\:.-=/E_+URXTEN& +M)7"S")77#->8#,P'=/PK"0M\/*?-Q"JNE@\I\3Q4YU]"L=1R`^IE&J00EIFK +M[2TBUV7NJ#MDG$3\_":2NU/#4'@!9XC!`+DI,`,!&*3>UE=RH.@2Y'$VB+)T +M6O$I_X8P$:U%QD^!ZE1'<):&2*(5S=>:>4;M1]C#&E%B>U9K;MV="O2^JXU/ +M?=,S13@BM#-_M'I!#NQ$0H.-IYOK2_[9XJ]FTX6N!EZ<L4!MAC3L+L5&.9B] +MOR];"-=JP$"9]8-@!"$75`/5SA)/^F%;@^LU%\8`Y!SA\\'$O94/GYQ"!>/7 +M5S+8C&J`[S1Z1HZ6G0M]:,I%(%M:[/PQ[0D.[TAUWRM/EP_/0H;Y`XT_O(S[ +M,<2S[PS)N+&G'"W/#-Q!+RH'(>Q)9SFRUG4&]U$W07A8<KGDMR(=L*63S2>5 +MOXN()\]_6TY+@)[(ES+>27#?^QWGT/W05.Y[JY\\8ZH]'9V[/%X^\"Q+&<LX +M;T1Y(:YWVR2O4[8O[`V)QLS\X,BXGY&58T1<AQBL0M?`@Q4[.9,`]^4(.L8G +M3MD(5$1,HD,YD4#$-AQ;Q6WL<4#=UPP?M`X,+K\$^IOVGW`\L._*K>0#82-$ +M9X3,BZ=X%\%+S%BC)XLQJQCN;;"/`P`P?L[GSH#8^Q'F>&V^@)C!U`B:Y!\' +M9KAY@*[E;0B>[MMV.NUE[K8$26M!$I9\_9J)'`)2X`8\U@)P+2V#]LR:`V&+ +M8#&`WX^Q;S=^TJF)AMKTC^M$>=R2F]'J5!)S\,@,0P+^>W/R/6K</"6_%#0X +M#$G!3=,I-\5CRI-UH,\(5E-V(F&%U(1-/\*3SX]&*HUN!6F(AGBPK']2&1V[ +MB+/%N_%P<X(;)<(RXF&8AI]XDAB[PVZ9IPY"6$C0!T;\TH(_XR59SPS]-1/( +M+EW@W8RL@9U!S.$%_MQ1RQ-[6:Q:[X#(RNFITNC0<M28`Q]D.-#H;C_,W^*F +M3[U*3A/GAVKUF[6*0!VA/GEQ&[7LOWD3Y]7[4*8<LDXFUD8<G'\\K1QNYI7Y +M)<0U_MP9[!;TKP:]6_7S6H5,97A283FJ-;(O!8^TB=M9FXIDP#51?M`_E=V4 +M?J`R+<VM$*09&^*V5C%[!(A=5@%&'T,3$ZI/PS>75G.=:_\9-IH+I>CNP)6* +MM8`L0=BA_G4F+L+@G5MGR?P]'F=E>KRR[@X`\@\.Y`$;AZZ`)1[C6;SI:M`K +M$%&!S`>`AQ=#,?^GO\!>"'"%@AD"FB5)AZ>E0[^X?9%[?H@(.)PST'./&?3^ +MEJS:-;#N>D(4:>,H96"SU?FV5:#MUACQS)$1H1[VR6"3EK+<OZ%\K5G[4]V< +MTGCIQ+>,)>J+"1;W^2U'FWG2EE"J"[F&9:.0ANHNP.F.UE6&QR/Q%UVUE(!" +ML]^KL;6N62Y2]T59L\BHMGGW0ID<A11/-QLG9!0\^#.OA[ZPK\E&0UR-4]MP +MANMN!^%/RXTB9CVWY>'[:=%`W)F,@U\YO$"YPM]M5.\W=XH@^M*R%+Y%+0H` +MU+P8>[YR^VBCR=VKU0Y.P4%'1?)X?S^(F%71+TQQ)C%66+"&T[7J;6DV*GDQ +MD%642:#N00*&E9NHX*4(_6;[+-0C175(B\7I]QL"T5+U]@-%SL$H,*8V?U[S +MA:-YIVLJ$)I@).<02_SZNW_HMU8X[;EBYJM%"J#T/2\YV33M`!9.LQDE][]H +M5-27WVH/N&YE!UROI&O9!9;*0F9Z+XXK?LZ$&@%ISET"67E$G/S,3D[P6-IQ +M5V$Q%V=KSE#C"9W_QD,JSIGE`<*BA4/'65A?DYKW$DQA-02_'W\*/S[HUJW> +M4Q9]S(;9."1GRL9^`JZ4R^G*<5S\O74'4SNS=N<5G_P)0J9+*1P1]ZN_VWJL +M\<WGY":Q;8N7=L@BN72CU^TG^`UOG'D$$*>GL?D^-4B&(_]>EA@[)`G^H(Y] +M9JOKXYTT+"/MX>_\LNR<P>^F1G3\TPUFG#[UV0MHT`.T^%=,OID6*X7J[.T` +M,D,8O&A#&FG(OWF0O;\G(/J_-!NE5T?PB"MDWE0RB?;5O9T5#R'4*(@^?FJ< +M*U"Y0$OY9CX]<>*[2YUE;9C3-C3N5H,)8#I$#"#@/0L!=+\'.(21>=!5,A_& +M@JQ<W5J$N"B2/U7DB@/&Y;:?<7;*C?UR\P3[C1,C+N5"/]!EAIQ1^;S"KE)2 +MLV]O4BG:8G/WVI5X1[[<8>4@WSW&M,XX>>W*;IF8[,YIZ\"!%F(^MF]<D-AY +M1W9-1?PH=K6Z_;?2J[N,@T8:0,4F;,ZK&9HX!RB9I@=0R>Q$%OB>UU7[73EG +M_68:4920D6JQ$-,U[:6NQ`0&)-CYIP%DY7#5NY,CGK*&6@W&;%GUI;;<\0V. +M469ZMV8SNJ<X#Z(J'#:M;?1;0'W5X:;TZ10^'T-4@T9#Q[1?[1JKG-LHM\!? +MZ\B4IY](IM\\^\SI@NJ-^M6$W,@/W?L:!"8!7$:J.0&5N#,P!0S]'WG.@!L@ +M`<[1;@9KU\!EV278*\!9U1+?V9:9;!MP)X`52M$]4\JZ[H^B,3R?_C2:/1:M +MJP@S/TB9Z]-Z)D1Q\8K2:1`4CL9:W!AF2M.A?OS1L=&VS?!)?ALF]X@?A894 +M&7_FD4]7/D1_M,*L"??)*GU)*33>(%,0,DZW?7``,D0^[NZ)&;HV&VT96*6? +MQ&3+Y!@/DF0T<:/*%MDZSAENF^\:_ZUG92>MK\:%8OS1N_N^38=N_[\Z:Z*( +M$IB$T#U\!N%=NH#A):X@;-+JA@I^8%MF/'IQ7_!'H(XST,$4KI)Q*+ZWO*ZZ +M=P"T`/S#[7L2_JC:7YMKP5`9U=1\H-*:$9C01#GSA6G(15ZY"%>ATXU*=O$# +M8-)X?8=380;]NB5;UN)/!(N1!L]5AM2?Y2G=3GX/#^6IR':++N!&OSG:9?[I +MPJ7&1Q-QBPY:G5/";BG.OTFO>QHJWX.%<F?6Q?T7.B(+U<)]L)O`QG[@?$WP +M3G;:3?DVOMNE$8CF\-.TB*%FA"NN$P=%E,UH7D'#$=@*AM'^]E(REG+_+NS4 +MKOO6^1\[?.L'H(<IB689EL^K*MH?^VV/5.2>9/_/A#4C=CG[:E.8YI*DY%4\ +MOT%Q.V4-K:X%$9@*U>MT>ZWKR4PH*@;+>(#[@1,LQU;EFSM(4=TFJ!<M,`3$ +MA'UR<+[X!G9D\[G1:620K-7@LR8*U!_P)$;$?#$[Y*N9[U;RFWQFE/%3L/I5 +M8MH/!DJYN^L5O';*?J_@#&1_"'T"CMN9F#P39X@06:WQHV)[:.`G%M9[FV8^ +M#UQYG4=\ML$'=RHYE82:1G@T$#EF>%!2#:MW+'9G7ED`=+BXZ0C%$9!S5EU6 +M33-\;8F]6S^GS+NZMV<>]"2%:R25%4Q-^22E>=HF=Y5K7MQKN8JE3@6"E3?= +M,PJD10[P%;<3"R)UJXY$A<CG,W_<*CQ21GC:[)H2NB;Z0/5]0<WG3]$8^Q!= +M4I2RJXQ9,E%]GGR.O0FUTQPPP?\NH%!2#K#M"#\R'3&FF>-R&:P[DL$,T]A_ +M9WT"FXJG=R-".X5]\:\_PE`A)O&VD3U+OY5,,-?B;B^+4C%-=/B7`KIC@(%N +MC8#6XE"^=3EKB<1P^AME_.$%Z3J]Q$8QV)!F:DSF]E+<OAL[XR*`U?F)$*]) +M10(OK/Y;<+^:G`&]!]]I8(FH)MZ]W/;U?&<7)4X3.9>QT@6C*-NH<JC"W18H +M=R)%`J]IJ2W%!=7.27ZM:=X[*?O77V7"3Z4+8#L`M&V6QK5Q*)W6[2;LQ*^0 +M$L&SH_)T?V06Q6O*[JC")A-ZT8\1OA'[6R#]`J;,&22#S/=I%",IW0*TJR4` +MLJ=6R\]:XQ;K:-)JN7&*)7>HWS0522YKE(*F*,&^"N+I92;\UK<3_YP9.\,M +MF%!8Q'.4:3/$*]1Z5VJBIM:B2=NAV`8XM!AM.P/H\C*5W2`T*52%=5@24^]@ +M5ZM[#SBXS9;GFYE]EI(#[?$%3S`SB#3N)$KT7,9.GS_\7A"M?"=*P,T6W$*B +MQAZQ`(=?)#F)P])+C5J/X9!/OL_0B9?CA$-S\1A(ZYL9/QKCB9A_YK2POY]& +MI&Y>4;ZK""%0&JFB#76:LB6X'.B?;#)K_*#@I=!3^@WX=3+BLMD4Z8SD&!84 +MW8JIZMT@$2&KV>BF;:!1;1IGE9%PWYVWXG:@J&,&T9H5[/9FER[IP](($F]L +M:&Z"`<]0V:PSIQ8O@>><A-K:D/UOY3+XOU1-%\$2(L`W'EQO93SO(2M%G'8Q +MW\38.)-0Z7NQW8,OM35)$S)<.V.)T(A`C_2,$UBFV>6].<]U1Z\ETWJU\^NZ +M\FS="N@U?Q%\!A2DD_GA.@<TYQS<?1PCYUA/L!?2Q(:]-,8U*,'B>VZ#,]3W +M_QEII%7/U$-`QTKX?\\\9PMB),.&B^T)*UH[QF$_1$XVFZ?Z1Y4.-`03=B`F +M"*!>U]_-C&S1V3;+/ZD8PQU[BRFWUV,_"M98"[)8X:BU/N&U9@7TC%BY=;4P +M-G%1&0PEP/?SO_$Q.;Y`7)B:=^L\TZ\"_971\!):N&8-/'LPLT[@(#%M';L6 +MQF\A/O%=O]F^6?1&K/[(DITL*@(F"R6"@5Y3TGYU'Z'/S044:&RT\Z[A0"QW +M3J<".BB'\/)%"[#+AP7LQ\JVOI5A/X%J.0Q!?&5:^H?_FZEDS>9]SAJ<!L^U +M8$W.LW++KES`UN($]9(,L2;UL=.V9'P[B$='8!?J!\F@>8G$E)OJ74E[I(1X +MWMKR`RN'UQ+Q7R)CI>;'ZD!';O@P*;88ZCP^92#";[7;DK%;G6/)4E?.6(^4 +M=G/@.'NQ)8=9L;&%[X:%,8T?U8<<OVQC]'*3'`Z>#+?F_`=L/:C4B?[Y.>I? +M7_?![+:R8$*G,(*P^=IN3<0W:2%E*U:\IE2.PC'D'PGC0%T.T?N:1CT!%@Q) +M.G$^+4;$2O-#67X0-3D;>:RS,5K7QP0RM12DL!Q-3B`]2R]?NOX*+3R^5EB> +M6K(6E+HY8=2-CKJ(HFJ1H)8C(]XVLLPLQ5;U.'UK\:*Y%N&X#90K4;F95;=! +MV+(Y/L)49'?K?&5Y983<GD^J&_;(CY4G0@<+3])T%O39!#WS-8CL<9DCZD<_ +MQH2BA'7&R5.&$[A'S3\4WQJ$4P:BPGPWA8>4LG0-:FS2#5!V]FN@%$?89#A( +MR+4G!QYM?29GJ1C!7C;&<\X;B&(-FS&YA3N*!+0OFO.+B$5QEV<]S0V02</P +MD1N+HBOM1R["3\HX^#%T!<FR[\F/&$K@RYFK]B=M5\_X!W?!%&(W%?RI$8[U +M0"NCUWM$S!$;#R-7DBTL6]<`H;)XB<>&(:,AB1Q56/,2NW%ZVLX13Z*_'J;G +M&YDZO_RZWOG\SI\(<S:+'W?,.@USP'!W(YRLZ[()@(`]V<MA1!L<)&"#+P.% +M#KS*LL:Y=6NO)H('N$?52E(JOQ@&-#P/@08>S\3I(VP3.>W5<H3LDTLQ+RWC +M[G8/WP3D60.[TQ"1.K]!NS&W35!C7)M#>9BUMIN;(*6-H>G4TD06C;HT-N%^ +MR&CI,ST!3,IJ_B6=>O4!>0?-W?,19*G.,8+\W1-:<\*/IQ%/D.BW%>;ODB>Y +MCW?:5RV=#G0H1=="I/(U*LPV/7*]_5L)Q:WF=XAJS!P.:8PD]-P):X/T+1:D +M#0'G.!K5>&5F^3U)CPMD-MXI(C0EU@7*WX*$-Y2?O,@!NU\+B*0F3V!79R(& +MCOI,SQ#Z'7H=OI^"<=(#+6?"5JMZ&H[[I-*JU3_]O'AE&$:L"+.?'W4",O\A +MA"B.R789UF,G)]5JUPV]ZR'4"XYCKE(`_&Z$G+KF5?0;G0LE&F"ZEPECS$'' +MJ1[C`U<O<9OO,*[)^1/FK$F]=;Z@^0-8?B:Z9+XA-/S<J>2:W$[,Q+@P1K6\ +MP^R6Z,VC8-[=*7:E_T%F)(@%B'\*6'"US8ME\]?;T@@0L]JH9_7ICLT.C"%# +MH@2P7'W;C;D0/8Y<$+SVT%B7F;<^R0(D;-ZSQ><N<(VYFR8RI+S'U\/8ZW-8 +MW[?.`N"H=?@>^QX0=,1684'8SB*F#A_<$JPS#HHN,F)]Q3'3Y(?'*G`/W*)U +M35%#AJJ/OLQ80G86G,P-&@4>4%O2,9B`K??88@@RDX)LL(X/;=\0]QW>*L%; +M:5(TD!H.M="%<3D8.\A@3*M`K,B]\Y:V+P"/S:XS1(_H-$:VY^24'<X<S+*` +M(YWH%KAJ%("KK\#,`/I`.Q+\M!&P$]A7CJ5Q&M?J2=(:WPRZU6_V2XFGLQ&@ +MK<16IRI'K_1.IEFP@B2[UI)''H#+2!J9BON448$-W"A%="J?OL,<$`HTV'`Y +MO<A(:1]_L"P7Y6""Q&<?\PQ&"<(W[SHW>JZHOEJX-@RP1T>,3%UMF1*V2O21 +M*-*A4F=!$]AW+S,K!X+@"$3$;Z-T]\FDN>``R6#6FZ'*=$U;K+](]"KCL=]3 +MV6PR9],4E<CPI/<$:?R2658B>LE0ZO/RA=U6:O*G6RTEH6?T/0ZHY3RICV6) +MM+Q29N51[?!^8!LM/:4*QE[4UKX1L0X=S^1UY_;D1&ZD(,7*+]3U##T'E+7O +MXO2&'6G+WRC5G7`GI+=7YDX&9Z#HI"I"/W?1#H\4YRPW`ENJU*?3YH8%EX@D +M)_#!)1*+HO<?+RY=F=Z9P5;?>^'LO)#!Y07'C5$41Z?YNP1J@9($TR.I_T$O +M)]!K@[>"F@)WITP/%%4G>2)8+'I]EX4KL6^PZ!AV:?)M"I"2#8S1IF83\!ZG +M(-*XZ.F"H@LS@YP47W?&Q?;"NAPB_&-LL3_MKE=8+SIO'N@)I%4V"$V2<YEG +M8==BW7-UE5_I45S&'#7WB7$LG\U&]>4W46UI5+)(XG9$/$<[)'8.-4Q)KW61 +M<WZHL)1J9(6]!VX$7[W.>`GYV9(C.G)*OKF)^TM18_SX.S]52<^45[KS*DWO +MRFSB`40Z,!5@6GO1DO#J/[+\W*Z80T880)9S'FXX/KO#72)['\NDY358KGE- +MJ"(EN8F1S7HTJN4?;7J@=\OX>1NW6"_J0SSQ!/BD2.QJKO-+JE4;5?^,('3\ +MIQ)^<[%5D3Y(*EXJ8+O21"$5IY/H'.&\W3?2+J>:BM#HZO[1UJ'D/1WR*&)L +M!7\5AS38C[#'FV#5_WWIP9<8,N\5\(4V]VK%)2''MXC@@6?08B;;_">ZMGXC +MD.(Y3R\8(*E$_*">&=<<6MRW?JVY'@1*['4<51&".*=/4&"CK"7F%K5<#[4[ +MI5/?NZO_P!$;XL1^416_L#R+/MT2?(]X$5;3-ZYP/FUR.7N\W2``PM6@YM5) +MP[E%LH9C_L]+&K*Q]L(&;.S;X3('^NXR_L0.@64I_*319OE'_T`9PMZ)])`Q +M\W>4-?EM1$.AZZXPC,>\*:->33_W/Z31Y,Q/&'>J<6CAE_YRB,#=1C?,0)FE +MT<OM[YB!3I%YI!!@/94SL!`2)7H]R!E2=W-S?D`)Z+_:TB03OQK]B;2$-=&^ +M7(30">`Z7>D\%*:!Y]O0+4.C-+.M@7E<ZP]>$QG2%8,X.LU_C[2<AKE-L/'< +M&QZ6;E^KL'[(EK+`T>Q,46R$,;7Q-V6-_,_<4-:2$^\<U01$PSC$`/EP5;/* +MI5IC8/4-#)?T=J3@$WT,W\^CKL5<,4_\B0,5:/-WJ1<<IGO'%CDJ$3"*2^NY +MNB$;+D+$IYM9'5KC_4H3-A(4KQBU<0`<>$AT[TF1JE$"*BXX%WW&P&O>?'$! +M:K+'+CG;)X<QP>Z5C/9VF#JMEK&L-U281V"+2;"BMR3@)O4?S[[A@A5![WX# +M#-A;NH>THR-R85\C*O`3T4!M676/59G^Y\P3IVR(?WNBK,AY#B\M7B2P/FOQ +M%T"N5GU4*;7)JQID41$G5@)*[=1#&%W'GC,;",9*'<<N;R`=C)R0K&QQA.X[ +M&WE>-/[7_;R-L:_J6;]^LG#PY,.K)SK;LG!?2MIX,"O5)K0=X@.1YZQPT_NW +M`8"$PR[KB%C;'C?U-/KN>\@0-FZ5+Q9J2^U@UG-23IM9^:7*0^D$!Q^B!)[% +MESA#1H_H:MY&E%=%!/[*3FZ<$XQ=3B_/,VMY%DMPKN!!TOTZ[@#T'5<@'@_! +M.IR(''_;SZYEZE,&W&'7$MDI#0>^(W!/AC>,"%U-*U19X)JV=$'$X2%1O@N` +M4_!MX-(+:34ABHD7H]&Y26_Z\[8O?A$Y6E-7J*-,C;F4'KP@]0:%?Z2_ASJ7 +M9,[N$2>N\^%2A3KH2!S1IH:<'=96,"KQ?P$Z0O)UK"[72=37#_D0^P87\3;U +M)B!ZHP<OW?N)[MH[]/$4A,T"X5*]Z2!`\L"HPPY&C]IRA%F:W'5,U$\E@V9Z +M:O$=T1I91E6O51.TL!G]+@C<4:-`*;:JQ(N@F,B405^,OS?8SS;8Y[\^6MB? +M>PU5<W;0\Y@M"4&87S&J7$Q,.$3Q4%Q;A+4U[WYH0G)!G:"3-BCC=GMXIVGM +MHS=&D=&Q01-L\J76-BZ#WQ-[3L3739`0-QDPW@'COHH@8%LG:!Z,ZNZ#9RS< +MGIFA7@$T]I=D"(MK-GJU.2+*AA^:;9_+[4/^2]&?D'FUY3Q][<:'ESU2BW+- +M*"I_SDSDLI:GMB!^&>ICIB2"_RL@7V?83O@`G:A.B*V"U)?[^[H[O?+BWK/' +MJ42%E880VBJ?.`=RWY4*T4)!G;)<2:E[6G!LQWMC/B\)EL7O$L&%?IRX(?OX +M/D](3K+GK(9@+AI%'@PZTPW2Z-/<^+\=A9.NM"*P$C/'E>@VNS>9CU+T(YH! +M14SI2"=8OL-(SS0P(X9#+/NOYAJHLJU5#^?&W0K)I"0=23[H"L`Q[Z+;#7/C +MC!LO<8OXO]>O4D;@I]N[W?B!!.165;0H_M[(F,Z5K[+@`@\E82=1]7602(ZP +MP:FE+S:N/F>&D#4C'?EEG,J+EHIA71B.1>JO^4H[@@='MWEMP=4?5_GPH]<\ +M`5+]48SORP1!5\@L!D;E98284?[_)<4K)N:9`):W"LDWT/I'C*!QF;TH5"/C +MLC?I5$H\.T?&M)AI$I=K!OS:1?VW:W+/G\NJTR8`YZW]J-PY5'T$BOL+<3(^ +MV^J9])L/,J4VYQH+$^MZ(V[4PA<&.&W_OHZ!WS&;DO(8K=:=2QUK.BO_0`9X +MO?7WPIF.3V/S?)5&8P(R"1)PFD5DV0Q?_(BIO,"ODY%QD<>1S6A,@SG"[G.' +M.,LH,^FIAB^>?AESY%4)H_`W41S,/ETM]\92U>86%J!7^B'<`P`D&F=I:F6D +MLV&SD&31VCFRXLIL_4U<5H_Y[-,W]Q'W*[HPP`3<.:8M;<#C4&;&,ZX,?+Z5 +M52`!L'80>=O\UR0]RLU@ZBZ"+['B_MZ8H;>8ZW0SVZ9V[/I+BZR[Y0-,7.16 +M7)*CFK40I)PKN0F65N5\-B%\N5X\VT,;/'?"_5[EJI(9.-X"8K9PGRB-:J)+ +MSE816?/8IB9I#GXJ[*4<C"%N!$TI6Y/GIH8HE)BS7$L&^Y9539SEV>`A\8L5 +MS"5X3)A+B6(`HFE!8G*YU\FWQB\]O&;)*;M4(W#D?&RRY+`7!4U]8H=^_'+G +MT7&KGRM/9*O8=L=>(BOF9Y]*O-(=HG]Z925[8H&9J8RX9M2IG!`!/<VMY@+^ +MZ%8N)0>W@Q4#@Q!?MHRI85>'GO`**9=,B`I(GJ'!B5IP')I0L`M&G->+':-\ +M&5=8"05:T(H3PKL4$WS.KR!X\G`[>`FY-%=/K4>T99V]DJU@;4G?BC8SG)TA +M<1%5?J"P#>ZAL%89><'!CXJ6D^?(,A5$Z@6P5*:!OI93);=Y(;@8KNT^WJ;R +M+CVOGSA-&`):U!_4``*##L@.>K*9_W@&C1/3W/DI$F.,X_$-^8-,P_Z7F'^, +M]!@XQU]P_PL>)#+LQ/%)^(=E7Q*4MO?:MB#?VS@[YM6E:FK'34&$5#=:S5V; +M2JE*O`ZQS6*H/BEJ&G?_8?GTC/.N'T,;,>]$H"9JCL*%IHK,:7%%W-`[Q4VQ +MP02MGE*W&JN9KZ2$I#W73"L_Q]&A(3(3+YMT[Q@R5AZTF8:;'>#D?.Z4/C1# +M;<:`3AG]OIA+9>X,8,ZD`)`-J.DF_<E$"LRZ*B2$2F$O3ZSN2N[ENQ)UY=@V +M_F/SL^CTJH8Z!ITV79%?MF\9A51$/14"(GN<$/4^7VL+&_=ULI+PX$`F%##H +M'2$G6\5T]G8;2<.;9J><Y<?<RE,0QT.)$8*LN,MZJR86C]&Z<5_YM[PIV$AZ +M:"%4@,YL@)?&VC7)/6K-$`<)TQ.$66<*MJUQG;;GA-UEH?&FH7F``7N)FLB/ +M4RI-1$BAD&'`5=/.M-W;^*S8-]OSGDL[L#/N7I-S9U#RTFV.18[+5/LC'&-2 +M.L5K!?!E>A$F7AD,*7^C'5EC+ZMJ.$QX3JSMM^!O1?A;-YITI6EM)50TE6O5 +M.NEU\9XN"@[I071[ZX-%;DOFRB..'Q2($KD"'I?>K%\7?MFZ^FGG=R>K0Q!] +MQ8A]N/,<N/5@RO!:`5K,DZC5HY.\+^LM<`F3"+.D@1X-@R7>2N60^EE9Y9.B +M<L@DNQ/%*KJJZ*:6^69I8(O^3@S!.KPHE:("*^^$G:YG]MU_6)0!I@6HH?H_ +MIHHZ+4P*(%8NFP]`-X#/TT"Q`PK-6%F!C%\SGF5<A:.7X1*V>PR8+1V@ONY! +M\UFKIX8DZ'OIL3]0J?AS>I^M^S-_94W*I2G@LHV4$>_K6-2,?P!^`43U_,T+ +MP`'[$@R"%MVHARF81#MOI4DDO<@MVP7%_?]8K9DUBY@ZI>TP-R96Z'`GS`>1 +MU9I<%SU#\:@.&,SF6W[!]\@>$7\8@=0Q46I:>^G%3'<,B)4Y8]`[WE^%?D[P +M_.\D9T`F'Q`$7I;XK=@=-%>VKNU"!^C$G&Y2'\*PZSA&3[;5)0"=O"(JE9-4 +M`OZU)+B[JEYKQ>"^#WV022[=P#8"&7GI]A>X+0^?AU6\WD+N'YH&0"XAU3EF +MG@$@/X#Y$9$Y!G`2U&_.IE:QOI"LM@TDA)P##O01!4"GN"2**B4'67F7Q!"? +MD'!3@<"?"6CF(+S?40OA#>0SIQLH(HO?-(R/9<$=]_")J0XM!<;!F/J%5J%` +M4FL3W+M05'>7%IA7)Y$"\C^+3<$'-^U,Z+*BS8T)!N5:L#[6=@.;+0+P@" +MCG:7=F;3N[1@\6A&RL_'.0HCN^1=8L)'XYA)%*>][@/`U_L``LY>;V*86-7+ +MLXHIC^-_\=FM;,[_*:O@UWQ2ZFZB\*4/KK,HOZ((("%O),,BG]:1],DL`9%Y +M!W=ZKHASR-3P[2[1U]]D_D;LHX?<&=5,_KOMLGFTZ]!E]3C**&<IJ!_`2M/H +MB(I(0A?\Q7(S9R3W7R6\72L$6@8#JF5=/@7=J`HDP;[3AS_U/].YXCU'FO.P +MMHV+#[+/#@!9Q_1#YDG]I-C18Y>R\V?S1"]NT?6D=0N@I\K7&@>I/0Y:C48* +M<_.?]N6`P,T;E4*V7<<>_*'W?B</1%&[Z'%>7I&^_9-AR.GR`05T8P6*FAE0 +MQ"@]Q#O1:VCL&:>5NBR(<T.HRH3M?NEYZM.Y*AVBEUM`LH]6ZYC7RU,_JI=V +MOLT9LYQU1P?(OV$*`&\C]8<C''(7.712$F<QZ=A[@(=P^LYJIX:U),R/!R:X +M\Q#T?0_+-GG7YW1E:]>+\.GK>N50%.IFZ)(K1P(FK3RA5\I7]FL&4PN6R8@! +MS;Y24,`G;`=!FI]7$DXPVTL34+N@T3`P^EF)?14R9\D^82^*V\6E,3C-:NS# +MG[^XZQ=E.R'`_F4%;D8#Y;$F+L&K`PRU6`SA27T#$4P[/=A#07>Q6RP&B[UX +M=0B$<W`*];6=P"JFS&';0<;I4JODZSUC9&(ZZPV]4Q#19\X2#!1].(4>>XEV +ME(A30'H=6#+4P\VVP7K*IF[](*;#?4A"H59?6%)30WB0;K0!P8:4;YWG(6:Q +MQDZ1MR]<DY*[51)D+>M1TN+<KWC$.T3I)F=W"R$TO%D',?>JV=@7.XW,L3VT +MY(Q+QB+HCGTY%)=1X:A)-QED<X:`/A,K\EK9:<5;[/+^Z`DV,A%/M*Y$&W#> +MY,&C:O%<!O>Y.<[B3NAAKB_"%+N%,5*\C%?.1C-#8!.8!^X;Y=.\FE?0Z5 +M2<5#^L8K<668NUK+_KW4BZQ/T2C/3@,<)(&9JE$Q/I5<3Y+%^->#J+K\MDJA +ML0TJ<W.7).U6\`#PO0309BQRRFC8[KK$VDV)CUV<7#^NRP1?GC6.J7&>)^A! +M7_1!-7^B]ZW8TYMC:MVB?D(OW>7XB.'ZP9B2'G#"?L#=;UP_SC8W$?]U>9,T +M>WF"8RSC6C"U<:LR?RA-CHQ)JKAJ2R2X`H+Z)\0A2X?Z+3?+^)]_NCKX5VL) +M4]CZ#<O-[P%K4H8^>=E%`?+;K26HC2/M`2JVNZD57#8H6.TZ9W*_UQ@E$WJ: +MAJ/(-BCYU,AX1DA\:B7QPG[GV+F,+.B1"0G%_B8NRV7%JQ':O>WLHNVHT5S. +M7?ASA]62U11]&#O;P]DC6.@-OG8?OT=(=G9IY@S/=8_F7D[Y'HANQ47NE#5O +M8O*%!<Z:%/9,0&]KHG3UXJ`Y\A_RQ7V6_*TP]F?6/0U9SQ<KUI3=2]]@DL$= +MN1"YM,$=EC/:QSR,J:^G08GUUP?+.<=R,$K9FE7GN:$"6SMMA+B:5_B_,PA1 +MG*IO^PNOL,_KB)0L4+LD0(7/53S,)!FF,V4*21L1PI8[C86QKYOT\K"8V^7- +MT/[BQ^]W=9M#_;MX9'1QL6S1)N5VS#-\P?Q77=3W"3&MN_F!4[2ED'(/5#&S +M18CBB<UX9/N5ST0/:%Y(^FSY`<S-Q]4UOHL76TIQ.HX<[6,:7G=("?U.6GJ, +M<&2Q[E0%9F&]UQS_-M6OG="@5:@+Y35DWF,.="Y@G^JW+E;_KV>/QO\BDHB) +ML'M(N9F]DRL;L,*!.OEK7.<=@"8.])L2_L2$[/A,9=]TV5"BHP$D52N;%4H7 +MS!J.I:"75K''NIHY.=T..;ZD5B-I\P?"#9U/62_J'6VW]8*G8E5PVZ]$A##" +M/U0A;$1A$<78Z!V6`V>TRG"!X`0<E#&/F[>&_!ZJ2!EK$+/?[RC1O+N,HCTU +M%M>@"G)3?NLYUN7"5B@IYG;Q3/P]\ECCV8]`__B]2>;U3Y0X-R513LPE?[_N +M1__B_:?FI"OT/Q;7$<I(2+6QR?0.6\JCA4?/JE=VQDX'O/[RUT4T>Q`ON<0P +M?*FZCW1A@WHC).V[6C(TBPU_HX8=BLV^]\-<FW_.QDNJ&ED%:?RJ`F+12[8+ +MWX\4%YP1G]@[HHF+SMA@9N2!C1LI5NB=<,T:M47!X+"/BF8)8@HB&Q[]EE'9 +M/%?]6<5`^B!'\^,US>'C(,/F''SW7'3--SQ\W<W^P#SJM8<PLRP9_J:L4-GH +MTYYP8P$R.7JDT#>4CS9/D(\<\BB[D&,RKMIDXE$?;2M'AT1+A36&B<H0H*@/ +ME"DW=DFH;-!GP<3/>84C.S<1YZTNM=VZ#Y[CO7ER9@;!WZOBU<ZJ&T);\$]8 +M&GBNPK`%3G?Q&7,7/H>RS`-`3P?7E5,M5"L!9J`,[9-FCUQL?#JL(FW2?'G, +M$4'+H7_8I--"Z69PM*V7,U[AT?&O#G7^U0Q.AW_^"`;(:[88J'3-_2#"?@;N +M$J_/?&91L<&930O=#NGM5379!HE!3-OJ<JX96PF:AZND!I_1]/%&UJ-#+DYR +MM*/Z_W/O*,8AH6^(<?KXU)JN[]D>/,,?YYQJ?W9V4-H=+U&%#K_-A9[^JRXO +M[M>Z]V:%4R5RMN6PBL)[D)'@GDR<![VESABSV0,<+51V>6\Q295'%'!8LDKT +M"L.?8-UY5(B(S_6@NU79P"Z"HT/GQ'W,)5E46QQ.T?XM6^9!!R;';R2U=GOU +MXLJ+\TIUOANF&:3C.19VP>3RH&!T)+-"JH$@I>Z-*^4XX0?9D\]"H0_F-+P" +M2SM&!NG<7@FIOY;DFF47>\Y\PG`7/AZY#B+0KGADD'(:=5P;S"L1C\SF,ET( +MUL+@0L,].LQGH+/I](S\OS;J8XSU`V=#H)C6:++XPY?-3[>Y[I9DZZQRBX8F +M2#T!SX2C&^8?)W1QA4P"R@?=0;,4R.3ER=JV>W2"3K)UHU0AW(I)XG!.J,K` +M7KP&7)Q\-;TK6+039GAL'2T54M'FTW!$>'A",-446@_W$!W)=NH$(WO\;+BJ +MED;Z7YE1;WMCYGT-JL^49/9H#R^%'&)YD92SKR@M?(;U$'"7%U<^@48LB]SX +M[TEJN>#Y_2)EG-*PHO!=@3P_,40L<N$$Q-IVSG,+1:#C;[UQ8-/QQ++B<[\/ +M+<J]@[OR^-]19O8(`/5&4-.F-Y)Q;C@9R4Q;R_(Q6=<CQ)6-6,NY')<7?[N3 +M#++HNH0@B5+>['9-*D(CXGBHO&Y!.,SD2CA,_^/I51#'$H9>RQL;"0P9\34( +M2!'(Z0%9V]1NRS_`BO#;\FHV?('Z:M=Z:F9"7D[1.%73Z0^;STK:<>6R\]O? +M`1I-'E*V]H#-QCLX"H_CJ4/BFIX,.!N__'IV]^'7`.QKU:/T5H5TUBZ;`<$8 +MW?>:Z&8XFO.Z7>Y`^)FZN+@+_W,R&^%K49JG.GT>W)IFPW&0+/__2CGG^9Y^ +M7RKM'(*CH?CEHS#TUB:E78]%M'#4CLHD;X]A%A-^:+0>2Z2=QJ!H2'M]9C'F +M_0PXV(QGFV2%<M`D7ZH*T^H7'?'D>7-SW%`$R_&X4MB4AKGIO8?$)VCHXYLF +M3:MP1`\SD@B.:F71`6OMQDHS?H>D$SN]%(%)H8_='S$'V[V6O<JR66`IQ/?E +MI.BG&779F4)1O"Y^`OX7\,="2?R(>-"G">(Y/?Y(QE,['HKAM:+6Z__CF^S[ +MH(J&5";P!4RC!<2XRZM/`LV`\-\#-2,/>,L-P'/1.O+4I"RGO)/KH[W#RP(V +M>CW3DK+Z?\7Y)])NXQNOQ/SJ1JPBK>@:A3X!OR-\'AT5M2U4;!SX77U?^JN> +M6.QQA!,@U\H/)R+2RKEW[!1\\U`6P8&QM5@I<=SI-Q@]X5_JM8`V\4J]NKB, +MBQQ0K<*-=3%GC/U)+G<9`;_\UI@=?&V./MW!'R:OX0"!K^</L6[U/AW??;7$ +M'4E3`2VN73''!;K$X[&_)P8P]NC79>Y1Z3]?">*$6+36HL:,C^D[,ET&V/+W +MOC@JC<UPSSW9:(T*I[%,-]%\_[9PK+(\?TJK?I3R*$@FI!G7$-S?1)1=#Z^! +M0;4\Y2-^TO=*B]5DV5OAV7>82%HJG=R5?BSK[H#<*(MP9GKOWE<WE48T88.$ +M3;YAV.!1RU+$P+F8W;_WD;I1TB*.H&MRSS[2MF9`7)=[:]?UZ-3GLQJ;'T2Y +M$M,[;&PIT;>"0%*S'TQ[G(2E--7K",DGB8X1PLGJ[U\&5C513>+15<".KE$8 +M_B:>I1=%Y;10Q=*%SPY-\]Y$[CJ;>IFX$&T/7UYB"#=6$W4)Z0.B-H8-C=DH +M?KFBYYR%RYL%4Z[9:5]%3+]V$J3PS6#3LC=7$6;0^MBB<U_^UQ3S4E<TED&^ +M,E"W>^T.8F9N*<E.O76PC*D(M,2+T$Q[,-GKI$DG&P8=32)+YY2,X/*;TRJC +M)ZD(__BQ>#)9IK&+Z^8MNR@$0UJC$[EHQ+G&UBK=MHVD>>>^7:BG/0UM4FE_ +M.EGU[=N\D(\I/`T1\DHO+B9]V@!T,DH#!P">NH\05R--@K'U61`@X9PBEW!? +MLJ;9FI0-NTY'4`4:_!8Y-YG*V_A'UU_RM`N3PRX>KN&K:7_R&<X>X:P!:X#Q +M".I:+!R5!(QRT"(WH=2,:,('AO!=Y@=''I6;.!S_"1FQ-KN0\+NS7H?B\F+C +M;V45YL?W<UCOK,5(_&-K7>MNMG/*G!0V(BRSI]0C0%(&+^)H7BZ)7ZL4K'=! +MG)]0L8W;P&`)9"O6Q%0"S$JN11%%`>Z4"K=#R>UW:/6)0T=B_XAX$,^!!5:C +M/`4F5]#=3:8TYM"3W&T2+Z\7/EQDL?3D"EV?LYGJKY"P6O&J&2`^2W"LE$VS +M.\\V`:R./"5UAO;GW]UFE8_`7@?A`G#X-N=41*?S=W?.,N%O(\PHFG#IPP?T +M:F[25EL_HAMEG=P/@(V!7@D:0@QC:^$F<+O%Z?1_;9<-[K]")8AM5]O\3,IV +MB'$-6)FN,VO$D1/9BKP03L#-!5APO]L',YS\)8)9T`9(VNX`EP*X1\`#`@Y= +M#HLQ'=".;=Z%W]B=WU6X5=W,ESSFK=,`>H;0"[8T$V1V#H3H`U&$RB`0+<6_ +ME=5O[3IG(LK_3C:KXNA)CA]V^WU8WN%`WJJQ/%?%B5<_]Z_4$!>!2R#].%9) +MD\>7[&[@>H'.83>7&!6B:V+_&,`PK&+>8(5K*1)<%%2_]4B(:NZ0RG-6C?'< +M2&5<(-FY`87-\Z_%9K^]L!3C&M=2S/@>,22P)9'(6N`BLGJ"<87SXD"RME1\ +M;G/?NE8SX-A-)0O>BXVI?9ZG9=#!BNDM2,IR("<G!TJ90Y*_RR<XLP!U>!RM +M1E_R-'8:`AOB5@8)=#/[$>/84[Z3,ME:.7;F],;NN"M`H]6!^0!T(I$FJ"4X +M>E1'6:[3=N%!L!2^VNP_)68V!U#H"@+JZ,X2QU>-\RM/!*I7E5%6W8%07G\Y +M8-GNT&9/TW$;I(D9&:;C,:L#.U+OC]4D^B+`2TC*N?`3/OG1F^^UH@OWOST% +M=(H4I0.])IDF&P2P)3Z5NUS`U*>OS)[G,L>+N<#_R=4"J.9ZKDE;-K,@H7M[ +MW,%&"0'#DC^J1;UFT=45!</)%/%.IUM??C*GF!Z-,WVJR5@2N22DY"GA8C/Y +MR@@/'?T'NC@7SS"LW27Q]+3AAR>TPB^;4`TR<?(0]5?EX>`V0:O\F(7D-:6) +M1[L59YM_&?O\CLV_J,',/.OP@"DC^CRTF0]$SM1_(GPJ5C?[CX*/(1BX^XB! +MWW#$79\<ORN1PJU8C-F34.^*"V0W8#Y8M!<3^!<P64X,HM'+1S<YNH?]?8@D +MWKVA`VA[9#I61B*4"M*N(V9!_'QH4B,3MW'R:3*P_\>+;K!YEN@0_.1Y4K1< +MNI-6=P`H-U#3CY^IE*LC'D#"YNF&&1B=FSJG7O#N6(5"[PMDY^KSSV]?NP$5 +MLV-4F;::F1(O&H79.&^V@V=[FG$'2XPZM`W,6E_TC'63)(\:^WW#FY^MOT&D +MX>8=L<?*496?JOVQ?=@GH>"\4?;>?%,K[RCN(KPF$1R$_:>;/S7S!VP]KK"A +MPU?@F`7?2V(V[^TYP"P/,A+*PH!.\MP+306O##AHB*,A)+YY<P<.V9,_\($Q +MO!@K%3)X*TUQWM)VNM)8[7B38:%Z8#ITMO;8QE,\7PCKY?7`X:7%[L.P.ZD8 +M(P.P3B+L9W0;L/9IG'[YY0!Q<N<-5WZ//0X6G%X6TF9\-OE9]_(P#B-O/GLZ +M2!^9+'$VYVAJ+E+A$[RMTLTT<:];17:*<\"FSB"7#P&+59ZOQ6%ZN*\&SSSC +M!;F]HMS>@4U@98)((*B$G&3#)+YTW>W0W7F)O\99G^]UP6!R766FNYSB\?`V +MUF;;%P^?*)SEB!MFO?+TFT5978ZU'`N]J]GMO[""BIQ)L>V"E#%>ELX9O)?G +MY.)_O)O^+0L-!%/G/)/*UN2D@\,&5K8/@RA'J.%4EENZ%)?M/]C<^SG!21#U +M@YONTL$_Z2ZS\I(Y1XM:$>UW&:D<$]4#/"DZGYLZNNTB\)=4F244O=F"]_WK +MCK#%<5//]`>?S?F9M$'+)L5,]1\BS,=@)-IV5WF@0&FZUN!5UHRS+X>[N;\C +M]K@HU(M[=E4U:K8"P!IA^7[JT0DNPH!BU!$HRZ_^:5$L*4H;U.PM*ZF*R?2; +M4,PM%D@,G'F6?P*7RST9@6+]X2\B'1!MA)#D-O,(RT(O28\OM<=GR>=_+=`A +MV`(YF)0SO5Y"$F5T[`V%,:*XJ)SD*4!^0V3D>251^$<+Y9*&BI=+J:%AOS;_ +MCH>,FHWI.W+(3)B@<99QFDAJC'!!)I'S4@FABC?$U.]::@JZVW4"C-[9L\-X +M?I[5M7LK?L'FI=!2UX'TG-7*K@KP+<NK.KZ8&VM2&)`:UW0_(&@EF&]8&1:Z +M^4[VC0YKFJ:P[D/:/:*:@H`4!F6"FG?L>MT-"OBW!%_18"D6YU0UM@)Q.DJ_ +MK42U_K(1"ER/.0W&`N=D;L84QA$Z]0BI]R69PJ/C"C1),>6XNUNL[/YJJP_H +M@+]SI=-<15BV'-J;1)NZS9;J=O^GN=:)[75:=A(XTUZ=_4``++=B[7ZP(0>$ +M*Z]E+9F='C5G)34;OU$'7=!`K@09Q,CZ$%UCG2O>_^+R@!>]CU^#POP0^V\M +MS(R80MZNV%3=(Q,5;5^4'.,T+>N$NA'<]%%QP!J&QKB12<%4E<,Z^\!),T&4 +MQY7N#70BP[4&L)@[,5?-R]+P%X6G2ZJO-9`/[O7':["Q@JJ>@>E`=+7:6"-< +M,H<D7!3W=`)L:XJ7=LC[J]$(C&M"FZ5,KF%&!B(K_ZVPB`J#?:9C9]R)50-W +MW64(Y4VN=%T-[[HI=F]S[VRXXH2!8QS^R(6,IKV`T-$@GOJ>9M'=EMPE7TS3 +M<6$,:-S6U8@<;1,*S6$%&O)+N2AM'8N_$0@A/"G"X*1ZALXDAN]&82X*FL\Z +M;KO_BR.)S2GIF:KRWZ"OODZ!)N/>6:I6G6UVN]5;0M7\)4O(XZ.-<=ML!8Y4 +M+<=YE:2ACRQL_!>AB^M.E,TIO4E+&7N"YU7N=4Q2B7J@VGO#TRC/DF%;SHY" +MJ-28#8O0QX]ZP5P(8_Z"@M>"*_BDU'1C<?K0^4'&Z:'C8;)82ASMZG,!7Y6U +M"(,43C!'#B(/G%I,*,H@'$1^$D\267,DJ55KO"#<UH&J(9KM'R4CZB@6C7$Z +MYL#Z[@X?:SI7I#^>@"GL*,B>H!77U,ILH<SW#3]MSSR7"W\[DD9J)>_9]-00 +MDTSM316[.G)^S#32U>>B8=M'0)9((FR-5%X]D:IW@GBK?>B9\S;D'<]$&E%P +M\`\8.4D?E_'V30V(NTC^;W`T_9[P31/K,Q<D;UJ$>I,ESX--_R4O,%&Q.GM" +MYP$Q_RT1]TCXQLD2!RDU9$3_(<(`XHCP9I/Q^>XG;Y/6VRD+952M7$:)5T+! +M*%E%;ME*0$G_A$5M*WS>DUTG54U=[BANH_8>_K":[[5UR1H'S"=7\?"PHC8S +M<=$H$K[7P/\8D7MI'-Z.4F2_UV:#=+7?HR?M"9#S95R2:V/L)0(L,UU#_X)9 +MS[IK']5C+EF5CVZ"2L(^@BV@J,BE7;`?]^"<W8Z%-%TB\<ASB4T"NJM(]0GW +M'H[!FG2Q-#>YU]4'207J6NWL$MIH[OL'HFO%Z7-<X#8,7FZ\?:93W+6JS??* +M-XO`3QV<ZIA!([U9G#M<R*K*)MG3!-ONA_MB/)R%!<PN66#&BJ>O+05BN:4A +M6]8_>E;@G*%-"BTR\%KVD=OZ2UZD&;E)&)_T]4M.)1]N0%J``);A1Y^7B5F$ +ME#4^1H@*.4[E5!19,9N_0@[E.1.G+O3GQBI@`/VK*7D&LD/S")J!GCX'_PMX +M";,)[ZW=G3:*J[S-?^;^7"+*:],8(9WFO^)&,V]#]FM/)T)%U^=TH(WP$`9R +MQ3PRFN2<#EM`9?$B@>EVNHM.K!1<4[@>L3/S8O?/#_/&_11Y1(DSG!<4KGZ[ +M\N1^%:$^D4=&-G`H(:9%S#/6$5/60]=M`SH3L^ZJ7;3OK3DW'!FS0NSS-A9M +MX'14""-AA"$POZS6+3V@@0HB'W!0="QHS/!A,>A0T'R)]9=#Y%%%W"GL4D`S +M%T(H,:J]H;X-B`*R0K,54#B\W[N<NC\P%[CO;2','*SH'GK:%);@1(11(X6V +M_QU5+/[ZIXWF3=\PK;(H\O]Q$+SAI&\YQ)KPGB6DF;#$M-)EM+N:</;6CZGW +MZ:R?_G?5Z?78QE.S>P<Q"?.R20AY)Z"M7?:AW9#@"(GK;O^!),%_:W87$+4H +MW<+]/%IL1<Q;DO\N.<G4"$QF>/VA.`F`^BGQ@&2)CV]FUO4AWT,_--`Z2;[I +MT.=S%Y@*>7_?#O"#9S)+>)3OA2U<\*^5,_0N*/RC.RZES9?.$_#34KC;WUL. +MP<4YD/(BQHPV0=]6-?$_12'0@WG8'RT77SV3Q3+'=)BAUE<.:IDM="FB\NS+ +MSTJT7.^XQBV1ZP:"9C&$`&O(X4[D%37-MIS)?#V1P5.GL[VF%XA"0\1VGD4+ +M5(P-3]8%,RAXC_@LJ^E?>131F1C=$L8?WQ4T,H[^FU?[L)PA"-*R![>VM\WT +MZCF;TXNZZ%S\5WC([+75;>$0(7+0Y<H&':>S&Z2YE7]*B3.IK)NCEQ<A2W_X +M=0A6_L)?N7H/+>UII4E[UH7<GPM9G$"ARN+K;;[HGN/Y&]ND/_.47J/1<XN; +M?]>"=N@Q^1/2V.N*O6Q-6.74L"XJT''*%)G$Q0H9@G$IG]SOYK\\G@D$XH4& +M.DPE#LI)NQC\O7NQ>T_O-NIF/CUW\)J,..\<L_\1RF+67?EDWRA17?D=(;3J +M$5]!P><B.#9!KS-=;\L.,\*MSP`(M>$2TS,=DK/YK`[+$$/MHIGM2C_R7!UP +MMS_=YLFO4(M=ME'-I;$$?RL9'*BMQ]N#T4!6TM)U4JVAR,JERZR&]C&8D75% +M&!55%W[Y>VE.Q]:W[Y_>/,>V"];AI%R'P#SK,X@WEJNL5)CR54V(+;$^-@HU +MJ$,X(M;):&!WWJI2AS\&B?"LOU:Z(X*SGS[N3RU&D8?V>%<V[JM3_38ER=NC +ME>9I'1XDELHF\UGUF+O7S@L-+@;@8(F-U>7:,$=63DZB*H)L"Z3O!+W<V/;B +MT!=;3$Y@Q]\1UP<FB%.KW;8S+-MQ#S5&($C"?/_B813*P'+==G5I(VD*-LTW +MFY1AM>2P-KM]'A\_9D7Q!DD7541\=JPWAR.X>(OG^>#GNKC`.YCF+@>FYHAA +M?B(-A-F!#8(U3-5^D>7(#A#ZI<`_+&6B."&3$&WVN8A.TS:)*X",B?;UR9>Z +MR-P3@Q#?*2(7+;+97O<J>ATSPS&7;>D'!+$<N,UOO&R4(C[ODN,"M<GIWI#X +M*V`M4M3)UF(FJ@N<EP>,'\Y(;/[`;SBN[Z<QDF\M=UJ2=*F-S:?_RH"5Z)7+ +MW>F%OHIIFX^EX/3`C6A=L?A[S)]*?#D%2>3Z=;8=ZR"K1Y:`Y2$?WE.\;65` +MR:`1([CA5-?JY8!B+.U/]&#U*94^>HF(0%G37F0"+-/"A0;.K\=U;ZO9(LIM +M_5W"/G'``74W*56I9XE*\)1+>I==U=)'5*X-:2>AQ%K^)>H+#I'4F-P4;UVI +MCM*`^"BGN4C*.A*:+.I_M'=_[CA6Y09PS?`AM'28EX0#'[=.Y`ZY1%Q>4H)- +M5ZA_2IIWB\KG#<A@H.J]%;KQ**L#U\O.9UT(W6$U",$MH3S7I57$;K/:60<Z +M+6PY^^TXM*_4RZ?1^*'/4N\*#-UKK^EL21ED)G>/K'$A$Q.8)QC*%GV9]HM) +MQ.CF8AH8>M$'$!BBCSN&B`0'I=DN:-(#6+SK&B"D`-G@]5#('>WP'%"E4S2Q +M9VPCN1OA3H9_W2VQ4/TMN\66#]3W;'7P:Y-S<`6-_J(T*#0\2!0=C0Q0)ZB' +MKD24_W86/;8RAW"8;_(Z#Z`%7/5"]M^.`B(%$\$!0.%M6^,,ZCA,$0R^R(E< +M=1QB3@Y1BLC[^P5K@@;B#D*]P3CU,.;9DS79]4=34QOY2#_4\+-.<D'3+KN5 +M^71;#%CC4L,[S:O#`.>>5B_&T-T,QM+6?2D4+Q&V_E\-&Z:!4\,!<YIX%T;( +M5KUR=+"&W!,E&!?16%2W\`L4=2/X;W"/%O$+M?)2N*3OL@011SC+0"3A?,IE +M^'IPLNOT>[).&U*L3*##/I&`($,FCG#_LG"NK%M"+\?-`9Z\X#QY1&2M+.]` +M"J4I3+W?SA][=C)CRJ4C?3F//^FH%`W`OPKK'CH1WY[$6!<QD*V:R8I:6'9W +M\5CQ[[NAUY-KC\_`6&["K+I@1Z7!($U(W`I\2=(25AI.$YI1>59G%6OH45&- +M]+[BW5JA)Z25G%:UHI[=K]$_R;J@I3)JMVPLBH]R4_\)PE<$L+A)DU<\_%]B +M#.MSS"S/:;3HWIE\3%`T35NKD^(0U`]^YJO1,*]`WI4KNP>VE)A$4_I'+P0, +M=IR8-:P-8%#U89RM;WVCZD:""0K^2'RXVIHWTHDC1)F.)#BGQCLJ4%V_9)ZE +MZ@)O.NS<WAP5@)2\RFZ;,P1*@UD7&AJR586;X5U7W"MJ5I@K]8##F@C5>A_" +M\'UAMAP0&W6"C`N29IQWM#29LL@JX7;,,#%!!>2E%%1W@?^[SP^J8N)#2_[Z +M`SYTM(21`:SX1-L!:0/,&^#?<0?YJXPR,L,N!$5MYA+M"+CSLN%Z?)7%OR/L +MUH+@[G#-(!&\I^]WQLZ;!=R?54J7C<T[CC/4EJ(4*114%.2[MKN43W.=.3T3 +MKAQ3U$V<MDM]Z+:YJC)H5>V8&EUKC7]T1`XM8%(03R@V#O_UKJ.]K\L>"?80 +MQ_QGD>PL^50S]9(7!/AS,4>^!"3`)@QI00KI[%*`,6N6<H)+(K8Z'@[G=/%' +M.P$2*+IT9Y.CJ,&RQH97WCHL@BSD/.#\?GY#N#1HYS=E5KAK!G7B173CX#;V +MTJ4H[/MB9=G_>.OH0-Z'H`R^7@D/<6/L15A"1VY%EPE,L[3*)U':]<4Z+RIT +M'H.:,!6\L,/L/C?;3BI7N*2+&PDAR:(1;(/=+#CO:G-XW+#E^'4_=%S1@)AI +MYQ?0:4FQ&_B*N!-+V`W%3%DDW\J0RZ<.D\9R1!2"<K@C`85F</,N2#3P/15U +M)#N7L6[J,0B1@H]?<.E4;)$&T?AL7M!NO-:,$818W)"+;GEWBW1#V+MU^\8? +M9C20CL!Y?SSGYQ$&-:I2P:9-*!`8LT934_-47$P)O[G-=?[%J*[J686SWRI0 +M\O12]+I'IF@%S\<<:#IAR,B)HSM]+]$6H:EFV:7UEWZPD[F?K(`<R)([I.&3 +MDP?W"D9N5&A@!>GNKW;!BT34&B>T\CW[(3;D&6:/_-32_'SE_VNE!<27K>&: +M1M@CK>!+/QFCKWK.#1AL28DM?@662`YOE!@NK>PU08?>3-^^639Q!IZ@<^&B +ML/:=C//X9UY$RAT@3>&R[T_W%H*EE"`2T*\KL4C+R_9C[[08B8"H22%ZCLIM +MAZ@U=M-B5FDAZ7\NDB'OLT)>EH,8X8J3BQ*8ZJP1G!(N,JX271B!"WKL<TQ4 +M]A'(P(-J._$;NQ-PXUB&0*T)6EXJ%@/1L993*4?8A?D2BH;C`7QM(`ZMW-VE +M$%3)`7S[KJZ)'_%%C2*+@_24GH`L"4:Q2`<E"R.K80X&"/P.WK-]MQ/M9W7% +MNX*_586)[W5P('J^)E2:'*;9Z\ZWN&Z:.YJQL%#4.HK_7A5WYFPC+7G2TG-Q +M).'+M673:_(=8.1^8+&CGV:*9WTM^@YG,VXU_"4B"\D$++E%BVBB#.M.+;D- +M2QBQK;=!`K>`$RQ=TOM!X`G[P\%?,^67V"N2/O@;`\3W_?H-JLA+H_X*AP&Z +MMRIG$#0!S,\O^+T46!5!FP'OLN$B\#)2]R3CY@=B?Q#M>GZSM[XB/)`AE4/C +M62KS/2PN3DWREXWB&W,%Y)"?+SQZ'C.8R&C@/_R$C3*1[`N$7(P7=;M7-U[K +M-!%,\-=>2(@T(XQ=E16O=M:A?=9#5I55K;)%@+5$(P=VEG2E^?N7DAM[`LU< +MUFY7YYM]#QH<!M2<9UFR6"F^RDKZT;IDI/)F^-?U:51U7U%@(&FI*P:G`]!8 +MZR+)<@+`+O"G5DJ%9%]STO6.ZW-I'RE'[]2,MY(D=]+L(^Q'`V=CPE-/J3!( +M^4P_\0W(B!T]<7+:?:`O"3HM&N2)_=N:UW<C^(E1)L(N9W=/:C/K=_;4U&F= +M<T.>?(X&6H=J$8?OV%>>J:3HM(*_+A8C)Y87#>TR=P98W2C!JN+WTI+#_/N' +M4#2;Z"N2WNX'P07)/OSL%;Z=.V8KJ.55S[!?S]TA0@#"8<*FI;TZB_"U=*3, +M_7K'M>V2\>@Z,8>5/OY38E1!(1,]VS8%82VI5JC-'YL\35_#3CZ@G[2?H2(8 +MC23%NX^1`5P3`*FG>3/65T\,!76=^E:2"=L8U[CWM'4EC[)9W#C]Z)\''G(U +M]%1<E/%@Y,\A*C1*YU+2@LJ,;KY$[TGFTT)TE^9=MC2$^=V3X]K/61,0:QF` +MFE_3<R'KS$PXO^-^?"R5TQKU7Z2;,26_%Y]@WY-(^I*%6J\OZY`RM33Z?Q7A +MMRYI_%?D^Q$,Q[K1])LPF32Q*J%+D#<.P4B28:*A^AMXCID]6-EG>2UKY,?7 +M;/FX:RAY6X1\SF^=T\>D`BRNE2#2>W?8VY>QKAG#(M.D_I2Z%5FW*57Z8)O5 +M`YXL04+)TA6`XV9RX&=0,N^FW+JEC`3*6]0%,9)?UX'JG)#]N!X2>/&YMQ!2 +MM#?(#_]I42\!^.S!NN@(:8X@M6D$;W,P]ML73O`\!MS.5I!!VXZ0<<!=1!"5 +MH/X!ML8MB35B;``UX8"-#E_YI-21C%?-J.MQ0\KQ))`!FQ?@WRJ':1Z(GB(A +M>WX$\"7T$$&S>\4Q)ZCPL,_8H@M:W*#&SGL:Z]&Q`S'CYI&3MP"HVAR7>C** +MEB4'F]4_^+P&=+^T<0FZG"8>8TSY%8XUX+)R]-`A9N;*;]NTEU^84E38>V`K +M;5_(JEZV,V"[["4>BH29Q?E>6].&_?_RS=+!EF4MKFM$-!*P1"XB),24U8`S +MG*^&,`2T)"91<4;FT!"KW':07")`>C6?@CKUI*:_!PFZN!V.5DI^)"@K8F4; +M:7JZ#@2OPLG%S>C+@(IBNM0-X7].M#`!2UH%,-"\X\+'NY@-[P6F66?O`A@Y +M4K//]65)5?;5<A"$)F9C?(6L3]=<;43"I,<]T)]#!)K(CO^#GV;C^0?;I->X +M5CSU)I/3][!+?NCW,[6(RND>?!.)26^KB^:#"TSEVZ^$D\JXGP8L]YG:N#,* +MNY3_.-XQ-X$4W==2%47J0NQ&.*CN`=46)@4`*PS&MS!2VB;FY-IA*J4+'R#8 +M;5C,+F<^<V-.P4.DC-[FRB,3&!(*$E2?6</`R?W*VP<)M<I?IXRH,4KUN<', +M`%&[:-$ZT)G;VOU(,.@%=DP,H^0:X(=#J(A.^X0&YY%Y2*N&$;69^!U"]>._ +MEUHML^V8GVZI#PGY:60RO=FP$)$+N&^F-B;=GHFZ0(O`5A2`=P?/3@MX8')M +M`LHW\:LT,RLW!S>HAZ=+RMN?''LV1D`#_4K/`2/]<OCF!TIV%6,9TF:2=..T +M<1[%Z2X^Y5584]1;>GA)2JG\8DK$YT*@\'^=$OC'@$AWHM,]L_N.4N^.?EL8 +M4SS.;ZJ"_(H8BV:@HVW&2=0S?L;OP9F>Q39_+:PG>9I1;9`TGG.$VE;![0[P +M5D%?D+;IGBK,+R=+A%7=;F04@M0(HC_JV#U:LKK0/"YIQ_J^S4%<2?8;!P&R +MR4%;VGQH\:B?7X,.YNB0J="?!>IXC%:U9<CE-'6J=%DC'#'%2@;9T8UX+T\U +MM'2*QQ7P?37<`L;*"U9#:5?(]C0T:<5AZEUM2J9#0%F10=-O&:F]J73))FAN +MQD4)`\U[:W3QXC%S1"PZ06`;Y]2[\JO]A&]%.2BOHG[J>GF5LDB\;3$S8-V< +M@WD-0/PJ0KNX_ES"<0X%\L-*1QQZ>_<7L6_Q/3<Q"'X/?5KZDFE913N-3[7' +M`$D%>ZH-:30X"@B\\]`4/\V&7*22(W84O[M5!VM98LX0FH.'A>'1#=O$5LY8 +MT<F3A<F$2_-4NAA=1ED?0]M.E1A>0`-P9)_,.))UXCQLR5E*[+B_"?;__LJ1 +M=//Z=>8D?M^N34OC37;=F803>4,2,1O(NA`<J+F`XNW%UUE+[VV=YT9,@RYB +MUWJO?@<GZ2&,R<&!XZMX'9ZIUO/IV9HC70"KR#Y;1.::0+_\VYU6/(?IB_A) +M;D%XPC4,<%WT#9X+&"'J%JS5YF+4@X5:S)?^NB$*%ANKMG=MW\S8>)I6+0B? +M-[=-3>;O:%LL@IC=P+$QXE,^,%$TB`EE$65[[,FYZ!%<O_$,:?WY&$X2_/5. +MPF"U6)C^Q8]3RDF\-CZ+M/>%T_=M[#;-8&];SVA&0R-+SL9"KIW&=D3KJVCG +M#KMF2LQ3*[>\#7QS'LZU$T!(+QW,PI<$#W!RQ]O[E*!QV\%3Y433.,):28,^ +MYQ8$EQ3K$!,A/M/4S<\L#=2KR#Z!,`N3C6_-P,C<E\5_.2^*^]H)O\37(I^( +M/^'2`R$BG=JUV=SK.DQR&\3`?[/#(GVG$4\:MY<C6(-EVN)P\LV2NT<@!U%( +M6T;B*UO_2?2*<HF:X?EJX8GK_^+`L&=N:R7>!2.8@^@3E3<"Z&P@!`()?W*/ +M<Z!NAN%2VM5*.FSV3HZZ#G>'U:LX&*"99H>I38#<IV;S_0FH(2G_Q,7^N)S+ +MC,QSY@XNC)B(<V%'*3CH>K.==7\2(TPB-XI(S0F2=)K(80).-_K9GZ=#HR-T +MF?'#LET]:>4N2?)'YXX7_'<AQ-I1$`'::]$>#5CG$]Y5QM>5',4>AE06.IMX +M4<A(B7^WVOY`2*55GLSX`*B<$9FO0^Q8-+GF7Y;M+`(0J"E"!7(;D!?AK_'& +M*0Z#^/!Q/([R?/8MFH!I]"1$1O;=!4RLP+:I;EA1<8T#!WX09SGI1X*/)+\L +M>''U,)F.?>:HVA%(H;70H27ATLM-@78_YG&[P1U[Z^)Q[I_N);I9X^W`,^CE +MSU._36MV<1Y2*<P)S*^5]./XR^D-]$>W<\"U!M;4EO%>O753O:]BSB4Q(0TO +MQ`D.;7`8?R0^($33=UYYD0RR=F:!\%!EI6'D?Z#,Y$(EML&)%\,^M!K$5A;A +MX.'0E:QL)U[:+RZUTQW7YC$?D)\PSQP6P#MF?QA)Y3K?_8V,E]*0!NLZ7M'M +MMRS$+LY\"^LF2JU/O0R90AOS=@)@GRHE<A.%JM,M-O(GC6K"/6Z[7Z4L"BS/ +M6'@7S@]FIL00&TU]11`;IWAY6'R,YAX%%V@FE\>9!>]XE?*W2E\:3%E*43HZ +ML5#O!LA"C"\LC<U3#LM[AR`*!E5X(?CDZ707J4?\>2+PV6UY:"O&@;<RWMRE +M9X^-O;@U+<+.W3'47#R@AD+UXPC<%E<_6BH5L(D0R-U/YST);NN64Q0_LN?! +M>1=%TT-.,8V4]K#G"_H8+#L]@0\-S=`!;Y_=ZM-P2L-0&ATAJ=#Y5AN>!\'I +M47,UUF=_QA5>\$,5=&WZ*>KNEF+WL#U>Z+3R%-:W?'+0K4Y';&KH)3),+RF? +M;6D9>K4&O(>YM$Q5%.7UQC,YGFH,+7,0`$U$7"]TRUV5FB!F5=']FPN6F5I9 +MNREN(UGK16,Y?!)\\;QPL)TV=Z_<F2B1Y*96%>7)=N7T)]@,^W)M8^.`=>^1 +M:6.D0M$`E.V;!#W'N,1!I:`L<<$DV)F1PQ:(77441J6OW_;>*Z&C(:;@A0?5 +MU+P&L.B.6Z:US`W1A4E'5E8S"9FYOY_R4&MMY#X>[2EDD;SI/87>^(+7Z386 +M$(<.M&::XL^MHM/D()O\0-5.5.N"N.^.3<F,+JV>JU6Z6Y]^0982(US[.V&L +MDE[85`$F/.?5P!]K9T@+"7R$4-3RP""[`-4^.>YD77V-PW71Y@>P6JZ13-7E +M,VM'%N2V#75X3,<5*NNFCS.?6#"0_P)O;7`6TQ>8#]VAW(Q<52&Z6<W06TL! +M2*[?WO81:1Q#\_@9OQV,WUTV7,$F"FF'6EV%5EAP0(M%(IQ,VN<=0`AB\:M0 +M13M+,IDFDU:,^&-L'KM6L'!:,U;5>NOA$Q+?,%SM5>;MU-MG4<^Y8H'8"B2) +MDJ"2-XG.?CEF"LNFO#PWH(BO"=W(#?591/QS9DG966[F9L>)^4ZD3/,/?&`F +M\?)00EA?IO,3;OP`7CO^7]!/CB*PQB;7K9F&_C8P-`[$]V*=)E]^]\G0V7#? +MYC64!?A,G?G$.8D<T>N;&+[I'GMQ2173%._>9`8R^0:AB&\M:#-"=OC6!5$8 +M;[7)I8?*L.%?)T.H]XRA+.D(:-W=*7C>-">$<L5],+*(G>"V'2:Z7HU.=0^R +M:;-',/N^^ZR!A$BQ#?)&0HH,AKF7BGHLH(D23^:-<.S<$DZ'8GTTM-LK]G!8 +M@^'@3K].82_72YHDZ:/(6'$"VL('O8=LE%5=CKM&!+BP]HI/J'3/``8E4"C- +M*I9-V6KN:U)N``^8Z8UR9C.U\\6*G.IN$FT8K)+.BE#\YI(?W__\M0)8:XLY +MCU3=(>[)$AA4U/?F>2=69:GRIEOAT)P;K]&ZV1V+K$/F'J0KD"OZFV)WI'3/ +MI,MT(,6NY>N/JC=-,>=R47?U"XRIHH=R/PC*V9+8O*2$FJ[S^_4=PRXQ57A3 +M/()_]57D4&-RNH.G;+5U'S9.B6N$6[#%L=X#"YF[]G(?!,E9^'(1RZX'7@Q5 +M,)A`KV+^(#68`!0BWD&XIQXNOTV#`W"'M=D;*B0W)IB(W@+LU\$G7/WKWW$> +MP<7$F.2&AF35SD;V5_\UQNU&N^X@6CG,/3K,Z`-_E8"(/S7I;U]@T`.UF&9W +M-Y*3:6E,\.`>X#+YG7P#')VQBHA:]65;]PXFVYD:.9JJTG2='LZF$J[W'*(\ +MFHH%(,:C_U!SV_!NH8_V&0FK`KWW#N19:E9[]Y=E5^N8WE^80JHQW^9F<F(J +MBLU$^,$2KCR]-AHK/*CY"AX\Y"%4Y&*.\KVWF<DVT$:U^$WVJK.8=/OJI+^$ +MSIKLH1AC#3G(^YAC4O*)[-F*\TX";EE)V@2JNH9TRZXL08OF%$KY*5HIFIUN +M"FSS^&['_+/BC$J4]"YYN=<OQWX@'\*UYS@`G0&.!U1H+ZCP++R$!T/$R)TU +MTW`00YA?`H2+2-`'0@#C&KX;>O>68BSR_-\";)GIC,57`6<W+(3-?W31O(C- +MQL;`$$^9!D)Z8?CQ'\Z[)AS<N1K1ORK.D`B;O1K$!S*0`7Z?BSJ/\6)Q1@D1 +M&>$;0UJ@U@P^`N.I^WIH\187"\5LQ0]Z\QV`-@*/NK3@!#).54MP_R.JZS'( +MD4/WS[#^;O:&CZP_N9%DBL?OF*-T&&C*%Z=779NXKN?#D()_ASN_P^,5V:>) +M=X4?(66JZRWGZ2E=++4<>5OF4I2]@_#=R0^SP-><C6\7C5P*)<.'Y%A'.K&" +M>&M&<$"<4%0/*W:DR;T)YW!AEZ$Q&$05+28&U)`.,S;D$<.1<M*Z[`U#.I*, +MM<AZS]]"0Y0&%;TB;A3I2N:J8W5X)!4B&L,K-OW=97'+]S#QHZ/N<4;.T,WJ +ME"5V"-VGZ)7D@B_6\USZ-,?%2#A?7'5I9]HN^8`4GT+V]V#0:7:/C.])@.Y- +M5Q>N*<&7*7T*Z+!'4J#_YRT"?)8B$US=DRG^QJ(I[`D?QKL!L8Y4#AAHK$RO +M+Y_7R8:&J>IX:>8ON`;6=N#4M$Y+!.C10J&:152WL]P(L2XRZ7<P+N"Q4CXY +M+B82L!@EM(^>WEK<Q-44W^=^+VJJ=_\2,C>[1_NC5`^@[&]\2)KYLXP?0[G2 +M*C1E9<S-ONVLX/]:_AQK'-]T"NJ@S,`]!=%_R\`''%^WJC256Q@D%J/`12NS +M*ENA45UBG!RUG2^1)73[\,H3"`//]X":W+!DBCFD=<M)4;[>G*VRT@;`=PH$ +M2!@R$*]%5$D>--I8/+`(0WP.^L3S&>O,F:-)/3!"M,P1*F-.J_)HG]E5>?GM +M,G08D*6KZV5S$!;C.%[-"NV5H<X%$\#A;'$$'O'&WK[^_)[!^DJFOO2WC`80 +M91:.(^IB->`%U8F,<!YX1K!9]"2M''WF*B[ZT4VE<90!Y+1'^-`9-?W==UXS +M-0<`*\<@U=;:5KY0R5ZDBQDH.E/\46&&2$SP0/,7(6V.54Q;;>#E0=^3(L^. +MR=/IOV20TKYUAJJVIHP$;I]O`-TM&Q&`F$]O_9<WZ)'CY_`V>0O&7D@N0J1Y +M4?[D`]L1^7[`V\H[D/Q?V$F]O*7E209(AE8NW"*`X>+%%1?FPXN(0U(M##9V +M(M^9(5366T#>##=5+A(L?Y'NK-3%&K=<@\58`0?/E0@R,*=)1@6%/YCG`$FB +MJ\35'&RIJP=7.L]4H&&(J3N`Y#'^2'_H\<*.03QFBV],N-TUSCTJVB3I6R?F +MC/8D81F3/$(DRFICIGQVO'0ZL(-5XK(XU%?J*\7T62/+_YKRRSN"U.5HUU$< +MVU;FSWIC"BN7<B-QSTT9S/S31,IM%#9/ROL*$O-T[<W66_F*G2NY-.IM)N() +MIO.WDEBIGKI<140^@$2F:MFJ?]WT9B_DL=I"-G\E,J7;@<?$`2,TI@$^QE"= +M`01&!"'O"'_;6SG\\VT)L4A+WB^ML]1W=U^T+.CH0U@,QQD;DJD(AGQ-4>(G +MGWKU$I<XE`IUG*#H3SKTM'D%&>XDOP,'8):^U@$2WM9'8KW?R3:R5`BJ!97[ +MIKG<B)5,8K0>,+9G\B_Y@H["F^FFWQ)U8!_V:0S-X.PNE8OE!>R"FA>BADVS +MVXS0$O]O;:0!<EO$-5X:?8NY=2#*CBQ(4QJ/,)[*Q]M_!AEH?X3W4\YS>7&, +MV]8,S%@6S-':;NZU]\`@XX.#^2\#`G+5NLQ9>E<8N?MS(T>\+)0"J_7H3&*Y +M34`*58OIH1`!"T;*^?A^JHH=/<F$;2*T7=K/*!4V?O)B)>NII1?6MQDYL`:Q +MIN8W[H/8$A)E`BKTB9'K9-#-IL]G+^V2IHSPN/$N?-?9M5,VQ5F<%0?:>8<, +MQ<V&TPTMG(BWK@'^L$AIB2.DU5^J&!QW@+<WM,B;6_Q4U4#E'8]6F^&W7L1C +MA1HA5:Q%$@FT;RS?&7N?8+>0*='TPL;>!7H05H^G3ENUO5T"[P[)H:73R'-R +MXD1XP;8-0%=EC?\BLHBWC).DW?#WZ"'9("<IEIK`@=4-YC[F9`?ZIVKJ_PVJ +MTJ=N"PSB;42$_E;DAQ1-XATGNV>A''`@XSDB5&)E5"`#N#&!`\2K[00NNL=& +MZOH@#T=ZC`>J=!U])4NW4D7GD,K-4NY7XM@#61#(V>1:-C.0<[!EK#NXZ"@? +MAII]!%B$AM!HR1*LKBMA,#..2=`44XZ$0$L9WGN=_Z;<GM14_NG7W[;Z)!"` +M6I7.DPX!;+U+;38"[@"');3L9F.[$$.YZ"9AJ9.+1GIQ(NRJ->2JPAZ&ID$7 +M.J2S%V^_Q)/03:V:=R4X&4*ZWFOH\PK)XNF96J:TP^A"X#M.GF\>4JZAC:1! +M)=Q!U>LE64H6A-VZ`RN4?.C8HF<#>DRD@[4?;DYS"+8J$Z@T]C/I)&?G;F'X +MU6VT/C,Q/X<^S$*3$2$@1Y*JT\>>T>(]!:#,A_PN9CA7QZY_.1<M98!],[=> +ML0<VB2<'$"@-]3;;X7T7))<6IY6L=GQ<(5.L`)*,<-T\N(*W?V(Y\]8`X-B; +MH6]Y1.M^V\7"G2LJZO5J.E]^GGF:))UC"\=,1)-BQKA%K^7[$T#&B\DS@$(= +M1L3^I@;]^+H?O&CLLJ8DI8D0I_9S"(T-/-%,6T(#$BB_#F34,;2.VMY0AP-\ +M<YH'/V72G(7H_F<W2/\J[RARJ)FQDN06\M<,MO$W[)6CY!CZN_-&.FH].R8> +M\?&TYF;):%6--G!8BUVQ((][C`-8C.O_R8+9\F6+3U'/3PO`26CSQN?616.8 +MS)[`VO\/4U^^R\Y*B*W-UBBNO@/0C--T-Z)NB$S>U0$ESZHW(`?[A,M='0>@ +M>\GJ*3\"?VZ;Q5NN;BY9"Z_*B9<<E;)0R2KZ:^SR1T$%<5OJ4`<DIYX:5]6* +M^[\&W*63!IFMM\=4N&X,,Q'L5*W+XR18ZJ&JLH77NW5C+,.I?J(-BQJI&"4G +MG]:\UHOA!88^K1G-K=4Q!^U0KW0RE=D[1AU5SE[CQ[3OPD4UY5!KC1J_.CY_ +MTX]L6R+LZODEV']9SLKCE!Q15$M!FW0*>K%*'<AD@OTAA/7PD367*"M-:<;` +M\WA;4O.&](DID)G:U)%^E%TDFK0K%P81?3]-4R=?D&R_TR2V3&'U^K'F*/\X +M(SY4.I*P&U34$=.?GQ"B?V&'_-CWM48U8@UJ.NS:)3:G'T/E@,QB0]$\&47E +MP]O-ZY.%'%<>Q4"CK**&Q4)O8Q)4^_QZS_+CE\.=0C25??Y7-#2E5(L11`=I +MU^Q)A-'S1)U8S%BM3)6PX;E`Q"X1\S$ZC;!83ZU`01F)@K9<&/W4/CW&^6\] +M$#^:[9E9M4HTB1$ZQ[_)_W=E:-!HHIKX.H"J]^2EPG[8+KP")RM'M]N9)]Q$ +M0/TA1#/@_7C(/%(OMW#-C^A4H[>F(%LK9^XDJP+"@35,-A-*^JO2Y.-WKD*Q +M-K/Q$K30)TXR..8*PB!7;)0*DI*3MJI(R"B461U3[6\E49@4F]VP'5[WO!1B +M52PJMAN5I7T)3_,[]&N;Z46`=P?!V>_1"/M,MZ*V\G=]!2Z!4!*BPE$Y5EPL +M*]M_@UE]!;;1!Z&:">%@"<Z;-KE?X.4T5P9I[J]D":R6%5R5Z,/'!,W=G65T +MW*<0NLC%OA,+]N3>=;Q"(?@Q-[!/Q'UJG!>/UJDA3.CWY=VAY^<J,@);P.S] +M-QH*]Z!NI&@.HE9?U?7[,O!`]H@3*&-P;+H+:;3HA+'_W*YV5BU,30)4:BC` +M2ESM*RTAF3'':#$CY5$*+?SF.TB9OAQ"+/KYGY6+]HXB;5`9Z[V.#`;?X>Q* +M4(6'0<:L<KF!.BV?KKNVU9;R1(]K-(U5=1P3"A8S,T?EUB(F7!XN+'YPH8U- +M=D3:C#.057&4D^%#!12YI#X"0PG6)AULDX)OSCQV3]S'RDH#I#MU<_<*G#&A +M#9N]T:NO+)CGHVY,9[K!W36`[8P-F]QYI$C'#Z6H-33G'!>EEMS!30;*Q-_L +MM&#;K"+2SH_K.P]@!)?#I)'8,H.:'<KI]7M#HRXTLF?,^,M^_SQ[P+OOXPLL +MF/K\1G[,S$>SX>UK5NM@>KQXR9\SUCEO<2,P,FQ1KQ7`\V+]YD:VST75< +M:9^$\*<X`1T#$&6L&*,>+*B@?H>\K'XK9-2YSW8I38/H1>^M);<_%H,"%9M_ +M@:#U[$&S(D9HT&E3E?R`!*I,)'^Q.@MQM/YEU9FU7@8\.T0;N'Q$^AK$!@ER +MVINNKOHW?;!SU]V>*U7&19HU\4=U\#2R&)&'F/%5L9!0I/![C'2<0YI-9CK# +M&YK54X[K0I"*4%LYQGF6@^AZIF.Q9WR>T2R[E/6M+&^A0T[(;-&54&XZQAF= +M;*T?+W/US60[M"#X/18>,U`9QG(PY-5C#FV#RNY5CWPC&^K'`I+<>N6H[U#T +MT,)1>(6[ZWW#=4Y1"^0B2KYO+H$_AE$I&9=:XW$C!(O>,D$=/@9I'NYHA++U +MK]&D(FXB;3@N_P2LS7_:C27N*TN3@`/>N2)M!;-[U%$C9YBD;S-8!?6-9_^_ +M9B'EX9B'*OQ/'6Z+YT?A>D]>2RY..S)X^`_-\J%?P]M8"A7_=Z\Z$1R+"/C9 +M#/U\U]PJ\3."M&#(!?J_QO4J'IU2D/5P?ES6JL*:713(8I8!Z*FP0),JKU-N +M*`"`N[@12-1+%$/55[*G>'+DZPTT4KUNV2E"8]8,!X<*</$#](M(@6S@"6T6 +MCWK3L>84]_RB_*+#A[PJM]=6_;NH6$X4V04>[9ILG`-S[\EE.)0*2XE]+B(E +M^J2+UTN@=N/5$-?:&,!H0GDOYNYOS3+-R/_DB9T\(Z*T;_#$9E.#.KRP,:2W +M(6-QJZJA.SS!]]IUBOOH^U3PUQO%!4$^_2Z@^H?)Q:3A@F]!,"\L\8"*^QI; +M!"96)0'`X`G]42NP,*AI%T@'"KMLCEJ9WM.N[J.FK[`9HU)BFV"&A(I(>3CQ +MWO;Q[,$#5WHJ:JDEQQY5V`%^NR(X1M8RL9'J[\'AM$K]G>\1<4T;;:IR#=8: +MD#!&SEP1I//DNF$8K6;"2UB-U]XPV63FQ'5?QW2VC(4B`G"*I4VUX]5JG3C2 +M0ZN+;\_I@+'YMARAQ5R&=N&J*:!W4E%F"`4[/S%Y/NBSU,IR1'K!A2ECS(<0 +MH#M.HEU:)/J(W\DG5)RM0+31X0RM9(O=2/83IKH)>^.BRX1T9N7R%N0#A\A. +M2Q&P4?"/'.6U3M.Z6XYW?>CG)RTF#G\^J8!LKE.EPH-\TCH^]-D"#(FNOPM` +M0^Q/ND']^4S6LRP@HQ7(`JM(.+W:X=R<)!$JX?H'SJA+-A]];!L\4RC)/].^ +M46/!!V(;AGM6Y1+2K]6>:AANB>^QB87\7_=IPBT_(-W\3U968WZ)'!R5I%P( +M&,$1E17:L06W?CQN[0P(UCN_X,5>0E79QRHRQX_O:^'0@RB)[AQ/K:(9IE/& +M3Y[EY4;[4+,/?&WI*:"G1W/&TCYF[$XNU>H5*SY_"<1DV=T@O8[B9,GOC>\X +MLNG5F7'_37%1WD#L_`&O-#*ES\D'*)[9$@O^%WY7`@E5GP0=\8AK]H]*N<YU +M'W/0+7W0C[@VY#444KJ>SZQY?A"C2T_5/\$?]8\Z<<^CZH=Q2,)6V-0#",`0 +M^)&\F`)8QB3T*)7NBF_'T&Q$87<Z);>*++J:)BW%.ODN53G[2W03X`?*,CGR +MA6J#;M[^.CL-*RYIK8/@;.\OP@?:76A>Y8FH,>^-=I)E4)GE38_FC+ZU/>&- +M&F8YQ8$6F267K\EAZ%5CU*](%;K!\+L)*JR&CJ;(*R=V5<1PWO)*K?AI)BE6 +M_E-;7Q35HN<O12&@94]WC0,]4L^;YW/JD`Y6X.;0F4``-1CM7]87_#QB_O(* +MN,1TJ/.`*WHF\>J4?)-(@\MGEK+DVTBF$="_XN\T,5_NR,A)%*2G`!")Y)WR +M>/&*;,5^X3?^S&Z^;7,^^D:P(70>3JNP6=C-,5H74Z$=JU81$F!&+%6ES:5Q +M!;3?QD2>1NLI#!D="4.HW&<)WYJKI1^WC\/JSD-3X=CW),=7S^X):KR=M'+^ +M7>ZL,*=WA?<R).KB%@=Y<)*[46SM?7]CT+[Q'U?<``Y]7Q+YI.,C?8FGZL<7 +MX;R;N/U=F0GC5-%%%<T>/4FTZ)OS]CO<BFD0%"!&>/L1L2-8GD\-^H4R)4UE +M3A,ZP%CJ@:OI`O!;`<6W+<S=,R\3X'Z_^M:Y\Z+$TCYM47;2%=>A).EBKOK> +MX?5AOJ)0<9>G$)&C;)0F@5*.5-UVM_\<,?#H]KK4O_OK_C@#T[E9N/N26L\, +MS+PT/S.=_#@S=2=K+:GGTH"TO"LI-'0ZEH;[+;+H_M%4!']D.:WE;(/OWM0_ +MU(\^.5NOGDZ`6^6&06!>$,+N_=""8#_\XS`3II81Q_!:24FNHF\_1EOZV<9_ +M;,R,?3X_L):U.6]]RWMHKS)+FRJG'NZGZJU"68-]E@JB7DZX^5<4RR:%%/Y* +M4W-?%\XRQ>H00#6;L66TN$GQ=7#=MB[^*CL5E)R>6O'9%=S?#=O-=K(`2X9# +M1=EK6&M"VJ1*=+9%">T087I^J[4U8S?N82>`O.4^<4[-=Z61H\L0J(T[X4)% +MJ@:VHT.>E;]N[6$%Y!(\SZMV>X,EXZW<.9YPZ&O@X)-'`O>-S3'HO_8[J#M; +MDW#9-\N`/:'/"]*OTWU?IU27$Z\&)H$)]W5W-<S7.E+D</`-0N2UGX>#[X6> +M&P6:U@>*_$2^(L<F%HGSE5T,+E4RDB#/=!!]4PX;%W?W\2$)TE0B5X'<2:&; +MK@/PD3=8EQ-E%<#3_0<M/$8&4&OF:K'WP^%207EQ$S&8447OI75!/F@%_Z?6 +M))4>FD(\[PPNFE(J\[<5]]&PB!W\H04[X-8ZXK$T4&SNE2VE:S\@_:C)EHV; +M@0&P)AFY_.I[*,JVLH/@>OQPX8B"*[U9ML6\I*^@;]<3]".C(?IL0,UF_:M? +M@&O*H^^M_]#_@3L>)QB)EV+PQ"'K!K5IHT'-NNG>CVK4MU]:^'8&8O4<XP&/ +MHG[]2R%-5X)H0USZL7F'FB6H[;]Q(<1(BPEIJ+:SP4RUT!M%^S4.J!;N[3OG +MX<U&B$X2`CKC95-`=0)<6U`;`7"45`R_._F$XXY#UVR&6.*?KX:%S-E/8V3_ +M&@Y7F%0'S7N':X6_%FA:[5@G#,L:X\B%7/0A%]N*>)W+)<[]B)_D7^`*I,$0 +M4ZTS4.F,#B6#G^#G3@[=(*DB#UJ$U:Y):I+Q!36MH\3>3,,SB2^)/IR<0#3- +M1@T^+X^'Z>QWLH!:6IXA=^L)RDE`EF?3<:!Q&B.T;8F\A=*3A)BDPP6&H.N+ +M&B"P&%,*I`=D])&-P60_C'/&MP]JE<_D^F\(ZA3\>0DK#]"G2;FA+6RX955% +M/OQ'K-SX2#!$$YR*(0^3^.W)?$`H'86LG"SP0!9,0'Z$<4:6&B?K,%(5MNFC +M?^*.SB20@UGU@TFU@B@OVD:(TX<`J]'0.\W2Y.Q.W1@1,X=D2;H.Q5HT&*'5 +MI>Y<9&PXZ6%9D/\+!706,<U*+V;_@AFT#>;"_HF:'D[+_@OCLR"D&1D^\&#G +M@*>J5JL6-.L\<?44B?-/'?`"V8<0BS=#,3#&,\,Y`6'$>,`9CS4%=OYQ)A2; +M85<0-$JX`R3O)#87<=_3*@LX*Z%?A872D/>/>(,AKY^]GX4HN!5;%DIVFL!S +MO61%I<N7/185SI/S'2N%PVYR-TU/]+8M0'<`U_0,#HP[8E*SA";\D,:?YK(O +MXUA^EJ])&F\LU^N!:S8A=?5..[6+Y":EI/Q=.;1"LPVZ$2.!/99$HWUG[&6L +M,(@*A;&!F50>MLA%?@^]C-OTTN4/'#HO2K%@"PMY'&MQCK&^TQW2747TN-[] +MUG(W7VB\L)828#*2&MKIA.MM:8=,%D*,.CX)1,\>"*3+/Z]JKARRM;2_-E]O +M;.N$N0PS(,YS\LF^;G/YELDWQUAY>)&0@X\BQ#B/HS((._XMU33`]KWPI=_5 +MPE?#ZT;XBG?;*`F!@>\^R@LCRK]=T.G.>Z@U\'F`Y[-L'J%Q8$Z%*3V!'$$T +M9+,<#+N4_)^!@+KJ4/(K@\L1GP'8-`)8HO1C[<0Y@TYW.WJM7DRYT.EV0&V+ +M%@S##:[+\M-_]Y>R5Y'F(Y#J%52%DFD8LBRSN!=9!8,D0(ZJD)@=`;L^+'MW +MI"'^*G3:Y];IO7LA^&9\\)(A#.2UU\\Z+GH1UX_NL5BT$/Q\"'O;E$`0,BU_ +MW$9DY@JB#):.4-M=7W'9MO7REJ:W=B;?Q%=02:EB+'QZ+MNRBHO/E+"8TW;1 +M<3,_))I.FLM<)GGL6MSH7II%:PD=B6%^%"V&S^4N!ZFU>V[.UBK;-L;G7BO` +MX18HD)F'8ZD7_'>=[UBT"VYGK8:P#I!-R)]U'2HJ+7R(H^ILL5[6I9=_)K%S +M*[2N/^UY:`HU\]RHJ)_BS6)^I*$;0]0^^$O:7OUK%M1832X!\DTCW.'Y3SOP +M20R-L3K6O[X'!J4I4;DQ79A22U>P"X/:V?QI$G1-Z&QP+JHJXJ/![$[/FKYG +M7V+;/O,G_0HX#9#B.7[]X5I">J2.VBW8URR=^Y(,R)2Y/7E8V(6]K(UVQ!3& +MS5B>]?/)'0+L8*IG#EHOX9LQ[J+`AI5:0E*R1/'D=)RF-]6O\74D/J03&QU; +M?FARE5]52BKJJF+I+T=?,^($`GSJH2?PT>A%G\!=@\Z,/O/72X4W.DN>GD<& +M5JZHDL'8+YXUDX-.37@'H!WY!\CW=+[*NTJ#@&#(\NN)>ZWYRSR[VBJ3+4OC +M<EUTT,%27H[UL>`KZYJMA>3U^?0NJ??9)^#E0:=*T&:^P)ECVQ0!Y$`M.Y'R +MYRM&Z8;D;[=9@&J\I6V)K-X!MY-]6EA54>`11*E]8E=+:N+!!<HRD""K2Z/$ +MZ8*7]!&#\N[`#?`P(7(VF28(K*O2+P/:_DZHOUZ0*3M=H\L?!&:^^QK.7L?L +M/5'S0Q%'2EO5UZDI>@\B\`1FF2$L.9E+##(\@5&UOVP"X&:JK4H<(@*]0>F7 +MD7X"[4OHER7L[A$8WUK7%1I\VZF(URK7/TY9==U8')KP/(MV<2/5*-<]^RV: +M$8'D88:V2O@-4I!LU/=3X67XR.1777PC3=FA#(V.L96.AA6D.XA9I+"E9>)6 +M=12T@6ZF:0'^-QC+1]$6UK3>Z6:6+G!H\M#C3!V9Y*)[)[TD-2+V2>&300!4 +M[BI.LRHPU>D1$+]-OQR;;^%P13E*J#B453'@0YX@_AQ`'%:DGI,*"D%B\>!5 +M=LWKAJ2H.6H58X`.[;2JVM2K=+HL=(=.0#KUU8MOTE-RM;[<'75!Q`GX_E:8 +MSG(*-OD#Z;39M?2.:LO[>HU<@3\LUIYFO=$403B>*CZ55X.O9PK';OC?24X+ +MU3I^K/1LN1@D*[V9:C*`K!(,C9;\\+)ES6(#R.%B@<9&Y5_)4`?%2)UK:MS& +MJO9CS([B>8Y7<`Z=D&]V\=00QNYSPF+UC*7I#*Y0K@!>/24FPMILVHJM?>I@ +M]E.9<V7^_J"LELQ<'S]6T#<)&>@-M\OL(E"%MAQAA7-=]O7AY<%'3&]DM*`K +M&DJOF;C44H%H.E=S1P=)*]7J!P^2^"1EK%U1G'W"QBZQ06^4XJ>54]L,^GA) +MO<_!Y9-/BG!Z6!338Y;WRH)&@GK\PE@P:UP`O8BE!XOW46OM_-%0A+12OO1) +M\.:K7,O[$?[J?\*FW2Z^__1"5B1R8?&!J?L]S((S8XML3!A2EJ&,K+X/082V +M3403\<^FJ8T"J\)0VQHM-T]J,K:U#;/_6C6?O\ZP7--MSEKLC"&+RJH2?I$: +M&2Z?&?R8Q3$S+N-&D]JU'B,5%M>[*TXM0NR!MREHK,.]F%FB50D2#&=M%([. +MW1"*X:X.6CS)H(SD1UF.U%9"A_2;R,Y,X&P2SG-/9;A5;@[>EA8K-&T#\FB4 +M<`@`OUZ#3TLZPO3A.JGT*OC+M3AO0].Z:\XZK1Q97-P;)F`TB\A%M*M+)3Y\ +M[O1H`A.:ZQQ""R$4`!_8Z1J2P^HR!$854(OJB4X<#-X#R1@XZ/_J5PJZ5A]K +M7EFUD@XMZ"X?L;!3X3#&Z9([O9*!GX=A%#V7Y<[.$S\6ILZ4\<!=C3)ZF@*U +MC@J%J@1LN#"J%^ZSLMG@@*YCE&X]!A8JIRQ<VKA2-T(I5>:,$IE$DC"P0IP= +M,UPZT&1^G%?(@?^3OD)@&CH!P5S(,85D),767KZG377;,T8,@TC_HO7>;GQ- +MJ*7GE9W$6XTC[JV[AIWL>0NVZZW;_*^#_?3YGM-<1.Z':H\82K$=GI\@,G#B +M?EZ$-FPO-!`N@A.QQ9,8TJAT139EMTW$CF\?#^AW?B5'T#?GDC[NNBQWG$.Q +M5X:Z&WC3I+\K7J/_*7IGD875\T5SZMTEC,:"LQGMOLL8WHACT!-Q;J@X]J#A +M*]!I.@8YRNY#;P;Y>EZ^-8?\O31>8:_"EEKC]S8_S89?`2<PR-P(FW>`S%T! +M@30,.^DRZCO"CP+CV$`;9\7A]*C&&,H[9`?/Z-:*N_#M[[J20OVXE5N6R07M +M7%$YP^WO4M3$C>J0A&O7P@4+A![L;F5DJ(&:VF)Y26X([\$46F)=V7#'@6TT +M]NN]BU].0N2SXM^((9N,:.?.KJH'Z4C^K,=]L<%I1!2:YPLYD@O,@BP]M\BN +M'=FS6AQL`N'56-EYUEXI!'Z#<&T,N'WK/[*-=W`0]2E/"0%_+TR`%5ANRJ[4 +M'4F9F/Q4[+F'"ILBBFF@"YX(>]0&;(H&F69([H12[$F.XYAI.@8I!MHP&2F3 +M@<-?O'R/JX'/[3;6[B#-Y7>+>_IB<^H7_*X'^[8_Z,)9_JV=)GW:N,P@W&-> +MU%A]"%F=WS2]BN'K(M3*T0O([=5=X\*">J54)-$>AR[2`MB>X");[.U/?[YF +M2'SP).G%0;_,SDBC1E.8A#/B-D!_>(/STZ,B(01M(2.[ST5?26*M?"ZU-1T` +M<`#3'E[J?K8X?LA474>@3_BJ',Z9A%1TUC*0;NL"'>*M>W_U7DKJW4YZ(T^_ +M4655/Y937]6,<86(JT5T[D4\O#H9^CE?%JN$.AW:H4.=TOF-?O[Z]I_?$$X^ +M:9^.\YS$#4;!HYSA.5S(M/QN.YWIYO`JR[=9\2^.VI`A:R?&B&_08DOF'2'\ +M(1V#"I#AKPF@!T$6$-"0!:X6R*V-5-W8>D_"^'6O!\XJP^F_7?_6*',]*0V+ +M3`?*V[4]?HL6E/-I*,;&F%>EU5:00Q+`WX3:@>'!=M?9DGR8CE/-M[1Z^733 +M*90O+7I@(!_$RP4P_14&VO@)C_L-KUD=>_?@C)BV8.M^(E9,J65'6YS7`Y`7 +M>D1AR20-38@".:P85H\"4&E?)O8!ZR:9]+"\\)U?BYG%"%*K36Y-\XNC+X@` +M%H4'=#]I?44L+!^<$D</*L1CTEWWRB/3N_!B7XGOX.^1WY2!_7Q-Y4VW#)Q[ +M@/P/E];[XN)?E7G.)<4[/%?&K%E7)QZ^XP]S@4(ZZ7_\\.7XO:)[,EEC=D!K +MA#6L>_<>$YL7NJ-1N\-?Z,95MPU\=^^G[I@(*!*U)-*[>L&TL#'2R36!L,?H +MW"FSB2%^6FH8-VF\D:^Z.C#U!U2/NX.W[U74/@&&'2SPJH>,'>:HOTH&26SL +MOK"[SKCTC!^%9-HWLXC<UD0:9P/64;YCIKSHDBZ0)T^7"VZ>28'2KI$#2T03 +MFJ.=@]^`',_1%XY)D^"+JXO1TIY:S@<@P>TX`=@(HO[.MOP0;^/:#?6%HQ#W +MBF-&S.<LY7S@5@<XFFHT7'P*5R9J5SK'04^!RI&/IGH35GS#WGS!#X$>2!TC +M]8]03],QUSHPP^I3S_9=-4&B@%CPK]Y^NF\FL5I$0W[`\E73"EUT<(TM+*)3 +M"?:2''*%0,ES*K#BYCSH38@>B+&"\X_Y/,J?JUKU-C!AQ:0K-B7\T1AO[KNJ +M)PTJ/&D76@VPR0GOTS&`J4*,'<GVY"VE,(9O\[LWUM/@'O>X/&^Z"'ZF52J) +MX#7"NEMZD?Q_XX,-KJ6)F6RMS"XVWCJG&5;U2"<(,29:DF.$38(7%=AO#6-M +MR<&*BHU(OKI'I?@\`"C`'PCJN)D?M1#PSD8;$5O_/W*'"SRL0OD(U1%X*[[H +MT_(GL8ZI&L,`2HA=QP0<M<(V[U;^A/+OSBEK_'L`["S`W@#Y`[5$2`5HIZX* +M5/V(/C%B-]<$)S)J5"$M5.**7,#S#@H1>P2+UP4JE`%Z7MJ_EHD4C?"4I^&I +M7#&*3G",RZ$0M$K2)W;@U*;%._RQEB-/EH;`G/:FXFN:AZ0(ME1\G_;^#LC( +M?(24:?FM(\:MRY5GA%/#QN55D=I+'UD`-5LWYC837^<J-?/8U?:JV4H.TQAJ +M4HYL,JLW2R.>`ON=^ZH0B95!]YU.H%R)DD&=:^);=,ZQPL2RSF3.\I)M<KPD +M4L>PRVEPJN*P32?3-K,_U!42KOK]'UW3UJ+2D64XQB@X=_Z&$MV_-2^M;A5L +M$47DZV$W*F14)<,V+>>&SUP@I+3HA=D=#W(OA"?GF2)Z:;2I0YK]V19N)#TC +MK/S`N)[9[_GN$\QO?M-^+=[^%GUSE4K2A?*;=!Y&J"ZXN@QQ6-.?<H*19@RU +MWBOTVI[?#4W2QJ)XFP,0N.%'A:=/X_V.HP1(L+1+/V'>*B:W`*Q*U`8[>-S+ +M0@5JQ=\Q.WEFG\WJGT:G%BJ[[40-G;N74&]HZ+48`$^VZ4^%+;U/1'@-C[1V +M,-"KP:5@#`VC9-!U/3D?CBOY+A@!GS;)%S']!2"5&Y6WRR;Q5/[E&[@:06*Z +M*6XB^L+W78N-FH7OA1K_4///LLN0(R5&#)5Y_HP:[:X@EZ'B:E:V#,OE;AJ2 +M%;S-O`'V`C,QT`'S=0)++/#>09_!TG+)UJM]M@>UOGSK-$<9V,-1?WQ#"-)C +M$)7*L(]I1VF=VYP_+^7ZF8L#'.0=U%2A.4EVP=R9'UKGBO8=S!\!B6!4^NL" +M`0S-8HQ3L7SSW;U-\0?89E?,X6SMNLS!)P1>#?$)*M99:BW9%M7#)W(:!)B< +M2>F$-5]E.-M<P."?4VGCG(:BONEG)O=3'@05OJKK0LH!8IZ3W+_D,GWB<'!6 +MTRZ0(.K"^117Y(F0T>8KX7:4VR/:KFIEY^Q_2IRML]H))T2.9W`#QZ3*MLN# +M@?X*7I<\E2'/JY=/S3^1&DV\(7!T3N<7(Q1Y*2+$6-)L#>1)GL&,,NZC.=@! +M3409^;,SHY+_(#"#E3%+;2+RT7#Q4`X:5TX!^QFK78C*AG^`?";8TL7)^'XW +MV(Y,X>%IJ/;!M54(8<+.BA_/?*!>)N7OD0)A<*GM,X'<;WCR)[&PD,83A>RV +M#,YYAH37Q7X),^JZ>TP@[UBBO"0H:GN87)/GRI>8*LE'K.C>5+DK+<B2%!TU +MO.&E5EZ0`16<\!W\ZN"NWU2>,I4S'T$6@0ULC'V%M!+D#F[ZE>5-<[=<<YFW +ML?RD=MIW%]UQ&2Y`EW<V<R&'H?L-CV]U$U0@RVP41N>)'\FL&:=UR+&EM]>" +M'&]7`./;YR:P+_DA[L[_S:,K>>L;['_QWE/0>VBRD`J)A]465_;PP1XN5]7' +M]NT3LE-P06-J7#X9N%;+D&>7Y5X&;\&)<L\<U1]I[S3\O[XAVU?MZ>!;4[,G +M`](!+3[=:59+!>(EW_>O_C$CNZ(9'[;"#X_"$U`JGY%_0T`.I3:XGN!#.QRH +MA0V^\0!!:T#N7IZ5[NB`_*>M^]J-X]Y!3"S7\J)9J-08MD^(C!MGMOQN'9?W +M<B1\"Z%+M.#[VGV#4K^@A7MYW9!$$?/^6I]5@+5GG21MV5``F#TUECH'J!TT +M(#W1?^.B>XM!D80P(,OMG=_EW'GAV@W3AXWJ9QDZ);=(,."TMH7J!E5V(<@@ +MRI298%>,K)K=2U',UR8!+Z)YT;'=+J$?@GCQ?B3WS41!LHV,9G#)F'+(9EM- +M:;'!6]]81C'5>`BIX2Y/F.6V5/JJ?J&\VVTR`<"J.3ED/OJ)PQ`XK_\ZJW1H +M%G6YM3L/!=J]EO3T#>O$<WOV&GK&<'[T%!W#5%)[X35W;!8N9K7@DY9``KU` +M1P[\[A*A$$%[P8W$+Y;!MCY%'][(N_CD$1P)^%[#`P1+-E#:H(B['%[:=\Z< +M25]:@N6\KI*_V1E$`;I8PTV,=%'(:7I.%%4LL*)[+_,1G0Z?4FP+VTS'$R)` +MD0DR/AMR?M.R"`WP?_<&03+ZBLK#5M*&I2DI)5J-U]\.^5PP3@DR`:,_)K:9 +M*@`(>F/4<)4RXU.3')IE6<H2WM+GY@=#6FS^[5P>\B@A0].`:W2[KZ(>7R:` +MD;16/W>EZ6%NWD>46+")Y.CFB5=I?Q8(\O=8-K5A]*0&KH_N'?XRP]>02+I0 +MI_2$[YDB']3%BZJ;+2*61:?058^5XTE_9WG*EQ_EBRPBEI."[A/"`3:0<T&L +M-P"P+S#"#FL'MUQ_A^<4#]G2G^`[>M+](D?E4;VOWM#B>.]0W3M/2T1"FW)? +M@[A_5\&R<YX$%T:?W'?Q0^),5`%3N+WW^2H`P<S6!?&<U]NC5S`J^FKZH$"( +MJ>DD4KC^R73@@_2HDE+T)M,E+0&V8`NU-,D4A1HSZ/&3!TZC^MB>/)11)>V@ +MS$F33C9\?+$$#(*`:-K@7`C.@$)Q;!L$5@ZL"+4)+MK8*!B<]XA2:OLT.!!; +M%\6*FC46#5YW;YS!1CF^,.XUG^3^=S53"/0`I4`_&+&WTVIDX%K+G%3<H4)K +MI=CI!,/+.]-ZY1Z._BW'Q-)BJQ6FL^Z8QJPDH!GYI2JGBLS!>=C7W0Q'X_(: +MG88I8'_P\KT%+=A)-+6WZNH-(;MFE+!\D,C\S.Z9#Y*K^M$&K8CZ86\/%A,X +M.:]JI$25^HS[_8Z1\"`Q92>7+1]Y+-D.3$7"'PR01LRHHN!09,^M=<A7TT>N +M1(M4+O%A4LI[+I<^FE52BW5\![1W4KLIP*-XAV]84RM`&RVW@"OE(B04S!:_ +M(P/!Q?[2_\)@?8%OP0W$@O>X@+NLONS$^J04(E5\O\I"NV3WQ(SRU!+._/Q9 +M4#<TM;"F_C85\"22%.=?HS@7<79T>XK@UW7`YPYV[K)+1L74($+AR'H9],*& +MW(<.,]"<R"Z`5HGY41%5%5(1E/5QOW_@($<`7_LID3483_G,EG6W,TH)Y7RJ +M(!G4=&>S;8!\'6/U1B`%)>12;NKDRN%![JEX-$/Q;IP8M]WB%(BIAU0(T*3$ +M:_!.50C6G[]M1OZLE3@2W.4KM'(IND9V;C*`Q1>SD2QFX%(GL%JCDH2':!>4 +M;K_,HHLJ1V`R>O8^B24,6BTXT#>.5A$LPAQ/B'1`^O3A^8UJ*4"2-;9-F%SV +M,AIC40EN4W,(/.Q5XDW-F:YD+O(B\/(#*\),Q_-S.VYV,]N;NDD"V;##DN.+ +ML,/)+D[[+E_M-NN(,I4Z&6"=(R\[S*G)PG2A/PCYK.[T_#+9;"_S7MX@`*<` +M7WL7FH8U=H6CLZ@P!NZ+)@<8[AKFWY?>%9]?.S/OHI1&CD$$F?_5Q?`LRTD8 +M<S#BE1%O7GL]8,:VBQ/)':-\D#I2<#M&-=Y,D;Z5M'HWHQ!5ROHO`!LX-YM- +M"KH'V\H3<?WGQ^B<Y6I89H#9J1M,\3N&X<T.%*2EEB"]RXE)/%^N%9I9:'ZP +MRU`EO]1N7P_O(<%N3L@K:2"?T;YSP?I#OEPD0&]-=^GH=NBWQZ\95OUXC?A: +MYS!4@[WJ\7WG2R"GK6:27E8VU3M"7#PX%"OX?HTS$3K=NIA3W)G9)2W@)4'_ +M/7O([Z_XSNPMANPK_[0MNH5GM=3#/="Q^&%/1_\A]JB5O5VS(0[OP242ERUJ +M*)/TY1=.X92I7D(E3=\$/Q!SGPZ4QK.BJR>>W@?8,;366G#$'::!@!5#>S,L +M6278WC'E'008E7/X<QD39IYE<)%C`]G-^MLMCB<[A<1WS(%KF[^6&:H:?H*A +MR*=U6?]POZPA!/)DOPO30R`-F493R_,3JN7>4@,?B(%3YT54/\2YF^.ZW?C3 +M*[_*OTVC%BN!+DIO_%]!)YZ5&>Q266#A'9J4MFZ-H^H$(JC.[36D&\0K5D#. +MFPD0RZ0/?+N'[?*`.%DZ;!OE$S$_T#_$@A")E($,;%7.E*/51*=2NP6AOJ:. +MY[6B[]1FAAE_)<1*BR)8K@M,12$3TJU0#MI`/M9+K"[.$L:ZU=ON$CX^=.S4 +ML+"Q\A@K!E;:I/A6P,0U?A<]N:::V`VV1SA>VLJTYD?).>;^.^-D7C!"BRH, +MO78DT)4PO,YH;4V=R"GI.W5\Z?_0M[[>1L-^EXT,%/3::&WQWP95ZERG7V_Z +M32=-6!]MFA*T:2.R#K/52O[9(I)@8R5B^IA,'@K):S8EPG1-SB?SBS??/@]% +M1_D(#''JF\HV43HHT;[@]0P?QG?[_Z[HYC*<1":K%V%Y0?'U9:\V5EZGZ6GC +M)L*8;DZ4\62L@:D_4J6A0T@>/!)(&"OQ70+<"*D[==]`\:WQ#6DQ.6+W!$*C +MFR0$)@K')]IP'&+'6@TA`(?,-JUV'OZXAKYU<Q',HIOK5!MT2C?AHUQ2A%O: +MK!Q:CLY(6^E>XJ,K9;^=F7E\)E62R8MW64R]6[J]HA-'?/5E;/+>9V&"%K7Z +M;$F`8`R$O6-^W\A*$7MLPAW6_P6P\@BL(ACY.0'2:V.5P_FY=>4O51S[=A48 +MQ]B0L2,J,T%*.%"^_*4B=7DY*\4X:/Z@;T6,4`4GW="\B#70_R'H#6`M4Y?C +M'S[$Q:;F,OU"L4</72^0X`S=BU$+1NO,N<%9)G;@VNK%+AWSUVYI&OZ0UX]7 +M(+RHR>#$#.YZI"[OC;KX@H`E_&'SA`S<G7A?GA*!(NP.O6=Z.DLYI(T0N_ID +M#7,8;^5,?$2B@6&E0FNL`CI5S)@T(ITUF=Z"2YA5""6C.SG2]R<_6D54CM<X +M!DX9`9[DVM'!8QAHQ8,),<B5R/"O9YL$^6'`)2N5I.D9\+',NGD['J4!UZV> +M_]&[P1,R:>H'<GO<*HT3[6$DTC3F)-O"3.TS)W@#8/9Z1:$:M)QR;O"5A[+J +MYY[8*]4#/=H9+].3*_M]*?:G[YV*DULUV_;(?4EE>7JDL7GQ4-ONC7L#SOC) +MW(4X>``AD6PI_F&*(IGO0C:1VYHAVP-XEY,1CK2+#5E%?>S5BVJX,W0P(EQA +M#T5'"NONIU;9#/SC(,504&N^S^Y^NERSBQ9ZQ)L#:=DB&"0[OT7TY\,>B]SC +M!%5^F(-'5XGL(2/R0PYM9-D5LIQ]Y:#@KF,C7"]"ZL3,RLYQ42CNIL:$2<\3 +M_NDH2[BCB:9]SD5&1"=I(50(CO:=)?^W!)`$V%G>TCHE.NYG$&U8J<GNCC?V +MWP:IBA>:Z^Y4"3.ME<D%5:&.BGB2W.1M'+WZ-).ONDKWA?%3#7^;BEOJKA(# +M)$"$!QE,0^8!48#*_<-Z&'JX)0]IS08[OQ`5.G<F^M]VDR^$7D*9!S4]$<)6 +M>`DP$\_9<EG?5[#_-'-?=@YK/Z_&\8'>:A2$5ZP'1E0YTMCR>S,*O)X,"`/R +MB'PIW.M(>JLZN3;:Z&2/!NH<SQMB#.WIDV?D2XF#V]G6`ZMM;<5-EQN]1X>1 +M`SHEX%R:..<]UI^\+E6'AKDB>8+!35,$1]?1<:<(YE#0:4T\ANU^3[MQ4E-4 +MEMS#'6+%PF?8AEU%[FPW8.^S-4'$E.CM_8/AR9!]YBHYK%2^IS"2I*V$:CH% +MFNY0<S6-J0Y%.;89NNV$=[I.$P=.W^45]"UDW%KQ+F_`56P:L#:!W$G49:F; +MP'+1$X*5$37'\<D*GH$,H+<P/D6)TNP-NW/!4CF4@356M,"81?W!4(5.0,Q8 +M0";-A%_*5\%#Y5>AO)'M)Y'8)/Q17)'MUA')#8/Q/M&XA>O*D=^_K_02+`*& +M#W0FWF;M#LL0=;X@)^G9%IKA+"--=V(46F,`7L-8IG2,$GD,L'<8KKY8LG.: +M0`\]/P'N!8G,9+%BY5,&.T)V=?D-4J]>\['-]!,Y9Y+@[.E(@P+\8LQ\HDH? +MNT,C-+9#+]E9[##2CKZR]8W6B%0+KE:4W?6ER!H!VR2L3R!%YXN,?+5>+,=K +M'E)+<MQGJ53MK;+@!2S!<`H6M^O.0!U[B,V$UI];P,(Z`4)T[1!N%LH@Q9EB +MS=K[4VSS=RUK=$#>3DM!51DN>V>TQ9TD.S>XS>8[BHMF()=-4S#.V=8+]#X2 +M38<B,'IF;:K"](QAD^N)?S6LHM(7QNNJUTG%:4F+Y+MAW8JT?Q#;Z<R.S]U. +M\-Z6/2E__!OMN\<R:MV$.2S/R6>,2)ET+?:X;2B6X]R@:D.S$,IMPCI8:*`* +M)Q3^QAAK57J?Z-M9-DDMLAO$6>I;KA'\H9B*ZS$W9[TN:O./M$W*#<,AX"GX +MI:'U7L'6%D+L\B^.[MD-E(A$V7@\.(?&^H'J"<;#41[$Z!<.RQNQZN='>YT+ +MBHAS$_:F_%(@2X*1$'?1EZZX#L4YP8=?WP&`RA0WWQPPYAU#+.!FI2Y[%>2D +M7IP#GNZ]G.,Z!J7F^=;!"&5?`BSTF[>DJ^_!XGZEII@L]`#$W2\XG<]5@!Q9 +MLT87O;5P[G>E[_DN=6U,H`V12A>LH;TXS114IZO:EH/];&'KK(I=*_$5T&U6 +MW/7L;R'D'5K4>6T45G<:OU><!F#L\,N%V+!$B:Q<+N%=#*X-H9,X7>)T"B=$ +M&_[65<5C'HP?2MZ0I#D(G&XXX*^D58P/YS,(Q>4?OGCKF#1#(1T*3)EOY;[N +M?07GS^?O7A;9`:JM:X(=&P'A<8C!>K<,CQ?^NY3G?,Q;>!DDP2BMZCL&&/[H +MX#+[3J])&$7_CO\96)K$'Q9]5G#(QU<K>8CV)(WC/E#O/'?)=<90;'6/61O: +M]$"_>D$7"<QKR)YZSZMM9E_'!ZZSTG`TNYM7H`T_IY8]UA3Z$A4?,GEQ$$@1 +MH0;\FO:U/89_%EH%SB9ZX9DJG];C!V-@TZP#!.A\LO7^2S1[@X`==78*=8B4 +M^O)JQ6PH*&E"=9I;B;VN5YP6V-:,UM.`,[,193NU&DA#W@Y<X<;?2M43ZMF1 +MG7MGZI*8HFM9LR\X:<CC2CQ.!9)08'NEZ2,+F)-XV^J"IR7U^6J&W^IODOKL +M:T.F$^V`;^.8D-!96RG".<.<1!E/@O8-<R>`#OJCJ^XH$N"W?2JIOK^:MO8P +M3]C_9<_T?KJ$,'+Q&Z/VK`"VPT$SWSR35P3#W'`H)3F!%[\MS\BJP3!.(\*1 +MG208+N!K22!'Y54V[G4G*(.R=\0__Z3[.+!P]G2-?BY:=J.]-)@D7GD-7/3L +MD"EE<CTT&8C=\CZA%G8V4PW?24+H[#.YU)HX/^-3[HVRH=[U=GDJ)A&>WI'` +M0V=7T6TIY3XXVN8E"^%3'0(2K#_['19@ZLV^KFF?5-2'6J3(\J0GU9Q/SS+& +MM9$^:5`:%FF-'+FB7,O)_"K8HIG!')=U9*QD6*VTN[\6YIV&&)!FNU5JAD&I +MTV)4K;0KU?(DB'4>H<PDDM.?<L%22,R]X%)ED"C[_9C[@B`UKHJE],G]>'-" +M&^DU=C`=LXD66:,["6[7.U=*`V^?[OF8`QVPTYROAR+(WU?-IDG;??@C<V&^ +MQ>;&;;]1_-U?@E7;YH#J(_B<K?JP#.XE$)?87<Q3+/B&'*&(N,G)U(TE@;9! +M.)X]5XRX<B_N7,24-`OQL:#&'#H^"ZGTG]5VNKXD:I94)DA\A\">0_H2WV;) +M=WR@5P8^DZ6RMO:)?'A')DA53B-QQW&4%"XYRO7?=&D4[_">A$5!R&3%`P[L +M._7V.9T0B]U5XXC5B8["JS^"&Z1\P%B=P5`<56;DG;%*"LS;@3_!.Q?W@8G: +M/Y^/KM.+=/*)XV^>+[#)[C!9G).QBQ!DO7F=R*NHO[/6FH13UAM(1'4V;Y!O +M0)%N(UFL#%JI"5;#9G#GACB@4W3[A'=2U.T'U$HWQ-7G\%N%?]\IHJE?CR-8 +MI;1^81FV([W;:I\BWEAH`E*?<7\O?>QDB1\O-:7K?',)`'G^J-=(Z=K2)/"0 +MZ6'C>QV#/#2%=(D^@2..^:E`FSCOI!#Y[S?+%SAF"G%/WBU"0^?:%-I]/&YM +M48[,R`*K?%D[8@1J@]DP1J5;X^Q8MJ7#\%H^:WP3-1<QGW;B*_N%UT*!MZ?[ +M6R0;MW$UOX<H!]U&&)]6F0\X`W74V3$[P@@$@>L&\2^;<5$HGI*YNLUQ2LLR +M[GZ@[H>6F@T.PB=*/1J6#P`!V7Q17^S4;B<;<[.)T[&9(ADEW9+EF@@P\>L< +M2,2PCZC=59ATXO_("FV(C2V%#D^^WIV7D<NOE3%.=+0M(QK)1#N0R(I7D%+D +M@*C)FNWD5_UW4P$VH@Y$L)B*#(9HLY\][E"R,ELY0N]Z*-FU^8E<?'8*MAEQ +M^R_TIF8V$[D`[[\0+"-_XU;BF^V7-<5V59X1,=7[U!1B#BL^)3`1[&?LNY"Y +MET^M0&[Y<[GU(.)'*&$WS/S[$;BBK:=\:J7+""T.59'QR.YWE':'V-5Q!37< +M(NRV*?'EY>ZWZNL`QR^?IG1BV^-2M00QAS"WR=KX4P_IF0/5),Y:3C%$(P.( +MU-"#V?1?:OKS)7(.64F.VQ=XJAR+V^7QS-*\`[XXE383092F=C#WD!C8OS3^ +MT0'"%P*I$H_UV+N^\FD.LWE%P+A!_301#3&8>9CTAUKN:H!$_?"2%&(PM(%Q +M!3G@FCE\2*YQ[_DON0!142OR\S\<2[BDF)*#*0<\P]/;)_`HH+@`^10@+&=# +M:'ZG5"W2Z#9ZVH<Q$[E]RK[K[>06A:$>PSA*=6V\7;B/:T2V_Y`>'EB%3I[I +M"*?L"A'"LPUVC;>?&YQ&N?4J"*#-@1>NN/@]&$Q^OT?[:$_B\H%B&]WE&&G. +M`\31";4TNC73HB''$XO(W3J$$?1R8CO]NH`Y%KGXIQDF7JN0S:J_Y*IU.#JT +M>QB>D$K6Z9^\43<JXJ8<A?HIS2E[,C,R@+A#"1:$BF(+9>)0#7C;QXXK#6H3 +MTNBC3?3>`&0I9I9EP`FT_-^UEH\2I;'='H9ILNCCT8I_M.OJP!X;@!86_J!X +M+J<BCO<S,TO/'A=42V1#I1!Q"^E%8?87"&8=[M#_J0=?P7!9_`?5'5-KB..( +M;=H)UUWJHY,TTO0#6RK;!(;YW&I'P]SKJ+$&X!DA8AQ\^3#R20<2\7DP+2ID +M1#3M5V3/*8<Z)Z#P00$%9*92A)8-NX3.GC3(55)T<`*U<.QAF&H9\6QT3EGL +M!=%522C#P?<FR"N+7$[UD85C5ZK""$%0<(#R$J(+@P_L3PJ^C$:`7^BCA3C3 +MC,01&_.3\(*Z,%,P'1L(:]T9;RX#;XD0)W(JH7U.RJY,O09G,V7ITQ48CI)L +M[%S1J[ZXR`>`OPN++*1B1/&-)5[I+7B.M\X0)L+WQCJADVX_86`*O796$F76 +M16FR'0YIL6]B'5-+>"'!\Z3Y?@%N69":2[J@P;#)ML'L1NL)5M;W_"^SVZ(0 +MLU<AG_"DC``O-1XII(M,8:!)XY?7SI<B6<`GAL-5X4+VX&?GO94R&W-IPLM! +ME!=X*CZ.L=(\5&E.7+OOG57EHNV!P1AT9TR=81B^>Y6).2P`C[8#Q9':4_UB +MR>V")LVF3]B!XB[M8-J??_M?_'RS8"V/E%D```$``````!H``0``````3%I) +B4`$,`![!^____^````"<HVJ*`0`````````E```````````` +` +end diff --git a/libarchive/test/test_compat_lzip_4.tlz.uu b/libarchive/test/test_compat_lzip_4.tlz.uu new file mode 100644 index 000000000000..6a230c5e1322 --- /dev/null +++ b/libarchive/test/test_compat_lzip_4.tlz.uu @@ -0,0 +1,1474 @@ +begin 644 test_compat_lzip_4.tlz +M3%I)4`$0`#H92LX=B#^/,V.RMB3H=-9J&)_2[OLAN752"JXEYZ_G)C;@/J7Z +M@BB-Y9[^'[ALT^7`3(7N!KF!'#6PF`@=V`V">L0?;=OX-*CDH_90X##_1@T< +M];==,RL,I\/9VH>/%)Z>_:ZS4SDB_6N)LMB#H"1=E*W^T'6/5=R+'3I9%JVP +M`/W$QUD9J$$<D^\G\FI85#'0'QG6H_;I?0RGJ?1'Q9)8\&>":?1U-V.M]A"_ +MBJ=<*?B6VMA:Z/VM>WIK%(^--,QH\+P8\D!P->[9_W>%O/:-86#R\]Y!4RLQ +MQ:@7GT?14O-\49UMC=1EZ"CX373-#>9C*_W)Y3XF]5/\;`03YR709\T\<$C= +M(?O>E(E"T>Q:)(RKN_@J/C=:(AW)*=!U:>YTSXBEQ#B96G\^/Q0RNB9^"I:* +M3!'JB$H!,ADB5\UJ%$'<\0Z=U<R9MRS'<Y]"(KL/<N^'UIGXVOIY^:;<?6NR +MSU4S#M,.,0!T\F,7TOQW[XMF1*^_6G[A-H.:H`E[YR/EXLG80ZZ0D/BFC=W< +M:^C'KBK-=[K6XXCMW0JB_R4:?,M%R>AU?O=0%.'=]/9"/K4)WL?`H$MGKH0T +M8RL1;!17_8`->99"#@L=?7>G!N=GWDQ*MJ&23LM$3$6^.$2[5X,]'2^+%A1+ +M*K.7`17/0KM<PL!23`$%\\0+/4&[8TG4[U[GW>]^2\<OUGC=[@B+=Q7:5<;- +M?.3W'A"&E[I"RZ^VA,`8C+4[0W&VF2H>!R4#+JU(2R9^O(&;"B1?<4QS,!N# +M[87;Q7'3YJM$7U%!4WZ,,GPF4]SK_"9MC!]IU\^!/W?;28*6S>>7,7(^I0CR +M*WH)-&0-=4U)C0\@A\,W7A:H,LWXWW"S>LICA#"L/V)K&4VF2>N9[Z;$#QNU +MP"`0>$CRU)NSX;#84_SN"TLSU]5F2-:[BV77H,(Y/"_S.Z6G:NGR0!0]_[,` +MP#Q`QFTHKK+D'JGQ-N/GW+)MP)UA=XO!?*U9N[7\_EQ'6G\3U;?=F_5=L83? +M='R7)WE#G47`@KU!.3Q37&I29N<8R(.\[S$*XL)_N.9N,=A79K</<S^F=IH2 +M;9:3/W-UGZ7&Z);:(8"I[+CA8*+S!WO^B%':<)U#_W-NMS,.=FB5`GVH[6_R +MS=10X:R/KJ[*60Y%U4"LB9I^2-WIH@&G^8]S>F3*[ON;7IA78J>Y*7+(-(@L +M^P,4M"5?:AG&C]U*C[&[R<D0B>PCA8Y]@B$?>]DLI%>&@B4*XM.[S]KIM(ZM +MOBOM^AX>1I`/73B>>[#`K<!`"Q0%S6B</.^\=0MCHQB8P<83$=`)&*N6G,E* +MR,>L.'!1I1(]?9FT9<4WA5[Q"ZB>UI3@2[6?A/@\'+-MQN]K`&P;/M@4'O<E +M,D#V!*LT.HA&%1."]_3@11\R9X)K7,\+N"2!IH3DO_?2HS4:OMR:`BFF?SFC +MW6'=[ML1=&QQI.[/[0^_0BU\A6"1)[";;$2'-VQ9HJYVHG]?&2";^4[EAJ$E +M,8"MAOML!W,I0(^<6"/C`&1CO8LB&<W'F=17Q#G+2YNN\:+=`ZT'E(U'._[J +M<O'&Y6#PN(GHW(!#);X;=_J/J@#G--#=S\LE_A7P)JA;5<L+I'P3I,(X;@)M +M,C;Y0MLX!/`G&R3X<I<LKM/H6-+17U_[;R&+IUROW/4IGF+_UA*'EY_OKP%J +M&X>7L&/B.EWLLF/+O]80B&O&OPB7L+P96W65'I_,Q&@Z2(\]A=EJJ9O1KJAS +M(8M\93[Y2"O7$-!BY<986I_369=^3=+GFUPZO1XNKX^#680WE]&/&S\P27(K +M9QIB+_?JVBJTXR!*,QM.9MFU"51[ADM%CY5`+B<XC935^6%D&>CGJ^7,6[TK +MPI,BT0T7\>$D%VC6EK_+\[*]5_1I:#0ECE9J&])B+L$,^3(I,%O];F_X=`SE +M`*?.-%)\3!'X/G)#"'&#GH_R0>3Z-X?QCU3062B#DT\QV(5.UH;;VD3V_DD4 +MN%ETH#7T):]-=8:VE0/)Z?S4,G/"RP<T*>@V3+D!G*6^U=(QN[JZ4=GG>%LU +MS_/#J^B'8T@X4O1H83(X3LE'8T2]504$B[Y)YJ(WL0X<]QENV>Q?\1=,/W*) +M$R5:E`,N@W.'D$JVBXY<1D$:AQUJE4Q*NLHM.#^`&_D\^E=$K[R+#]9M;]X/ +M]5L3+!@P1AEBTOTAO3D+V%A>)BWU]FA:%7R5%JHVXHE+/WK/:DE8<'R&-^BN +MP29(77T"="9S=-?KUF2YC(.3@5H("SJKVQ''.8$MG)7[RTOB(9S'4]ORQ@6* +M.<X:U@'>Z_7WXAYG[)V8C*UL?C@^GQB#%W2D/+^FMG5CZ)WR']\C&QVRBDM+ +M=3U8=[.%/&KH2/WJY`,[L<>$H+A&M."3LV\G*A5WGT`W&5ZI?^*.)^V3V3/S +MS("R\[7RP8+Y5V3M)-6?MJ<UP0LSIZ"8SF0VT%E9C@K/U?J$4`(>N*U$&N&Z +MYFP&UF7$42?W"HPTJ4"._:0U"K2.E``.[(KRS:;0^GK0FWYZI6CRJ"^/GA=^ +M:Y4)?,$IQF2L+A1`XA,9"O^%$6&=Y$ZJX8MWX4L>L4UX>9B+H9^BJB4PC^8_ +MJ6\@[#4.1*M3AJ5P!B$'7PR1UT,EI,$CG2W'DY!I::+^#.NLCKFQDB3:Q;2V +M@67H)N-7LV.<</@0#NT/RCN.3VRUF-#3AJA6-OXB9V$$W>;S%/F%1R_#3+F0 +M^V0U#&.GEI7"5P\(AZ$-)`JR+[@7%-2H<Q=U_OSXM6\9_(-5.S7%I0Y+$4.O +MBF["#7?&PC)E-[G;CTT.L^#)QN)0'.HF7:-)K@3<F+>H0TR`3:1R9?S'V.F/ +M#SZT->AVTT1GL<*!O(T%OHD-\64#+0#\'`07ZZ1H/R!8,ASU307[:\(X$*[Y +MI(#-RH`.-*@]DNL(/,C<)&$F'!(@2S(XD]-QN,KR(8LWF]Q+G:SY+BK*48IU +M(CBU\@`73V%KY1XHA;IEMD=>!G.DA`&TV!I>JG,E:]&)#ZB*EZ@%K]=^=)R, +MI4INNLZS(;Q^+PRON5[A4K/MN)7%0*V\-(6&LU&3.=.V8(]Z)-8J',MP`:!, +M!PO_@8I!7\CU/IM%UU6"UKF]KYH,[I<;J!T(;##*H`OAL6R\7-%E$EV[_5]= +MX0#606T\\P1$)'D_%IJ+EQHJU%8(IU:%<:0L_56!0<4:W;7AICF\?Y3?GG4D +MGVJ?]ZM+<ED1#M:$OKN1&\P_'#;SKR-I8_V]"A,:-(TIC>M1=UD&-CCLT?J8 +M+P/WSX+<0/F21YKXX5@PEZUY-==!N<!6PRG1L>-_V.)67:SYQCD$4/OD&DF* +M56/$>U[\O=<%4&"L4]$COA+JC4\O&#+[6NKSA9^AOGY_4]:&QL!E@1NVYW-& +MW:)JBU[R/%D*ZS"Y$MNH5<\44N^4C]#ME`^H%IN+X<![M+7[A%Z<R`U,NG>` +MXZV?_GW@'K*X_9:1X!:P@';G@KM9AK<OQIGQH/=^Z@"62*NA+X`D&XG$Q9&9 +MR$"4F)@-KI4VFFP5(39]]FF7%^^9K50!1S%)L4M-8:-=!YL-S>7XV;=6*<1X +MGA\JV2;$?6NF?G_=EN3T+^[%)7:8V'HD%EA\Z04<XH:5-4XE?<9=`FQG<?8` +M'0[O[H"9@GS(UBWR.]V0!R?1/K?B^''C&?<D2]L\5?]OM8Y86V)=@&NY/(5A +MSV/N.G1(]F%U%CIJCK3A#+J8.=TB."7.;;V97[Z1-*KY)D+1:82D<!7WM:9D +MON54?9PH+A_Q@MR_%.&%_2*94-?'M1%,^IY`B$.AJ(.%B";Q]E%I148:YB!Q +MD1$6*S/IK("H/5H\&GQ@L7__O!CP<'Y"C&F.L4);^PR@T?&4]8MH+R''"1HO +MCN$;%/"6+V6H>?P+?/0;[J!(U_3-?]DHSXLZ-$I.10Z)2=`HIN!6,'IG#;3# +MQB0=4*;&T6\,'D+[;X!$+%&#W)67$50T1SNABMAXD$..-S;ZZ4'>('/$IIK/ +MB[HW:I?L.AD,:XE]?AZVD=FR39=;>=KMGC15Y3/HI[5EZED<<G!R[5"9,!R) +M7#4M$!*[/]B<I[&>+5KJ+V9#\R=GJ2@;/"\QXAI%V(*$:_T!BOWXJ>XAG-DU +M<FN'E*KYY27)AZ@G3S9YW91+P)T&0I[#,'OJ)K,D"YBL\.2W9<NIINJG(N8G +M(S4*6NWVYBZW/2AB5UW9A`SQK3'YPC5<655FT+^8/KE[#0N]%HE*WPV(X@20 +M[X<4?&DY4$/%HS&?+Z^RP+7L>W(MO`A,-\N#KX=>`K?3Y-O"TR"0YNKZ]$4_ +M#LW!#9]AQKWGE8><$(X`;W\:ZY<R4CU3M<`1+Y9CZG@)OD2^A^<T<F'J\DU' +MJ*#.F4.97J9CE]RX-[6?)MQFXA=2"?DR,]%ZV,V7`H`0GF:IU$G7P/R7[EJQ +M4)?-"=N[(AD*E:*7G%!]PLI)6*34B'JS)_RR3J7I^3\>[N+,(Y[F_^SJN"SH +MG_G:5:ORO`H9<?MNE<&YI:!IQS6?60F^KAQ/E,2T+DO#5$XB-HHH52D#61:\ +MGWZV4M5GHBZ>I8:2^HP+43HT>G]ORJ8'A'-\X`G*[7,%)K4;TWD>F:M;88W2 +M9#MY->P)56[-O)SBM%FNT$)2IHE(/6//2AW9N:.9(CQE;25[8)JTD\YZO1QO +MK??5V-H+=.7Q1^4L1Z[=.2%QUVTR'OPX>L]J_R2V2BX/_W*=U=C%<;<^"7[` +M#J85&2=2_U7)C^%YK8_&.-'_AS/D1NB]ZE](F)/A(H+!=J9E>6CB;-INS_6\ +MT=/%:!E?[AO!C(8^[1):7/RNBY!I&?+(+/P[,1W)O\I"65QU=5UG#*1PD[`G +M-@WNR4=*U_R+:1_7A163&Q`/.M9KP-+UK<3`\_.<*`4<TC=:APWLT$W+Y&"+ +M#HG3*O6`Q,2]?%TK,T>ZYK.EVU!1E*PM[FY)]<00(%V@98GD9WXKY_HH\;G/ +MM?VM*XK*D0*A^/_QR;#C/J$C@E>O&-+0H=28=8R)UBH`ZXHJ,,F/K#4A":BF +ME9IC7)*6%<ACMLNH&RQ1AZI3%2?H^M@(51M1V%0$P(XL!^@@K;N!1V\.@O`C +MHCGGRDOZ3;]^#Z57RVPKQ2D37\-^X43;YSKD\FC\7.Z?H/0UI/]B3Q])B3(E +M#&EK-`*ZAGN^DEGBS\8%:]<EGX=:RPO-4#T`KX>^C;I9+OZ7N:258J=!\5\O +M[TB-!+V@NJYF)](.B+FLXI;N?S>>`O]##%@<*S@8<)'M%H\(?T)>^;;LCI&0 +M%Y`)KOX?A/U\[45]?:^4HZ1VO7<O)/?"/(#(Y^-.\693MY)EL47V/\5G_+"\ +M7L`G,8C%C:,$33*`>:-BTN.T?>*LS1H`)@`^`E#"QGM$K<^$K+5H9DOM=GA? +MAQKQPG,[',Y)^_-`@Q5YNX3&P8XQAN&E<FJDM1M['0N!W]K]N8,U,@QVA"X# +MKA4N:Z/+#UN!(JR8A87Y`*64P=Q*26C$[3_$"=NAE10NQ7XPX,I@%E:#_9GM +MQECT[TC+4][[W1*:I>1'F__*+R_,5(MUYS%83-KX:'M`G\V0A,M[[MH3E[<I +M^I=?UN@.N'7/?9TR<:S0JIH-WL^%U9AHE-9/G[;!:>OFM&&+5@(3-N0XGP=- +MB[0.P7#;.P9"9SL_N/;9?5CIX+]!$2LNJ@ZU7!;+H,NYH0F7F6O'B=(-V1;D +M_JQNU_31Y_EQ1@4`*SUHDS03O'YE'$?MN%A=:3BJPQJAK:%2:^C-%K\9C#>K +M:Z^OKN@'8GS:1B\S,V@9BZI%1S8B+I=_]M)9?Y'[EUE>:4<Y.9QPG"=KVD;? +M*6\$?4VD^U6C8Z)VC0X`@)T5["^OK(Y4EP4"RK9I?GSNKH'$-LOT5-:G.U/G +MJ)`CZE.CA?7_IAT=ZUT#1E)DQH_GPP+-;\9YVTKG>$*HW%8(G*JJQ;?<<!VD +MQ$_1"S+F)12T7HYS[KSN4A*;.)-HD@3J(%ETB:$5)S<+GX*RB1P[<.K%`D5_ +M+PVXDF+YK!M+'&I1+"Y:5:9?$BKN/]I[ENW'M(^K7*G=1\`G6R8R4O7TN1K> +M'-ZHJW883"W\^TSOABE+Y-8"TO)CSCH:^YQY#Q5CX,?1R#+3@T+.FN5(`Z1H +M_3$[9F:[_@#0?ZAW:GAP"(W9#ZT"O'82@?=V?EQ\T+D[L&.`7#DAJ/6D835. +ME?0NG7QW2C9#5Y&H@)@&RXL'B*3/FZWW5I!#`ZNN5X.=NEZN8S451&K)P,4T +MX):/I.69JNJX/!C.BLPD5%)RDA(VA@;AH=)3YBBSMRZIO##)IR6GA5Y#SEHZ +MS8J.B@[6X#MI8>%GC4N#Q&L8@5I[_:'#KSA"%3XF(B/'H4FH.0*5J-]ISWYR +MDR&L[<S\:W5:Z[7M.2.#.&XX1-K'523PB3`7?ET)-<56;W%<$!&X'Z<-YUGM +MLTCJHQQ;S]]CJ&GM$ZC>W.(A8LBJ*$"(.ALZC4Q#KON]CV-41=O,$ND,&E^\ +M/S7)66B,(JWS[8_#?&&HU<:"X?SI)Q9_.SX^N[37NSEF!P^)*T`WQ(9<$N,* +M2V]WG09<E\F[[9)F)LIKN<0=KAI1-7)Q1$80<)@U7I)FYE\?!0ZKX::5HI8@ +M=F\R3"G\,6S)W/QD%T<J?.H9;B>&T,E]8J@!+AL@X\,9ZZ-*1[A_=-Q3_YU" +M\NR+VDA!DQ!O!<,\_9ZROABBD1M'J3P;.0XU_39Z>5B!,!D/XX!8`?L-D_6) +M8&F44JIG]B*`0JZ%6*?62@2W],'X^L5L;74I6X=N4G*CW9C<'E_R"+7R%<@Y +M^$;]KF:];^!F[I,1*$*<KMJZR6_CORN.<%7(W`AZN&QK5:7QXSQQ1Z;LG&08 +M'>=&O'8K>2/#*`S3V0WL4Z/9PQ\V8T;D\32NSS/45I24`7@+E1J`A!@*\?_> +MCVC7^;Q2+P*YEWTT9&W0D$SG&V.H4R,I?'ODRP!(U6[P*%3%XVH2S>^P2%A& +ML+HU;OUG%6[*,#!AG7.XU)/2"/&CS^EP>R<7M$HF:DY)^JKV3;)>;[.Z-3)J +MQ:\)I1M6Z<BG3O,=HW<D&3]];Y+%1_"5X@@S]FP>5I4#*2<W@M(/^4[[M'?P +M_"S!R@IN$_G(UK][VIE,S%J0R"8'VF[V(;9%^>#\HJ4N?9&R',"V1(4G>D3> +M5Q05OXK'DY.WK_2W&'%.(PP.2['T&5"5ESD%\^)R,PDXDZN<+^KG`P[WF5SL +MZ.8S&\QDT+<Y4:1G5*"KL4[2W.*4'/8B%^"E2PTZ:VF-.5+BAB6JQ`#Y(.K3 +MI?9_=N:NU:=APF%6XC(ZRK5=D[5ZGH!MML=*-*BHS2>XG1+>%J=H,18><2-K +M-)1E-6GGWAD'H8,>LTK:3:K#$B=AA-WJ*)_8YBJM6*]PPQI1O[6YMG[,:"A0 +M;K'*`""P;$@"0M8ABJ8NF_8,#B59<!];<]Y2JWB3@>1U%&@4%]!?D8K<&@?2 +MC3ICP5/76@=HJ3F%^*H*(,.57/\5[JBMR3:X)QOH*/2*)&I+]$P?,JNT]Y6C +M]S0*;?.A9M.']_<2Y%WL.T>G+9:ME723WQ7;HE0..>CO:W='C;VD19!&-=>? +MF3(@ZQKO_?3#2_R7F*VM528)S@C25J/F3!RG/\Y+[)-9-[86)D?%%)QE'ALT +MG;DS9?L;<3%(`=/Q#_2;YS/"O4>0;F6)P'LO*I\?"W?PB]J9@&2'%&J*[I6W +MGC4?)459G,^!Q!,OV(+H0<7QZP.TLRE2UGK!K([6X7C.>]E)8__0->YGK8IO +M'X"&PHD[N%<G+Z9[A'BU-Q2FTM4&+;>W2)OPM?2W]TYOL`T8FIB5B,YZPB94 +MB$K(,11,PO7HSBQE=JYT_1(BEPQS*"@F<9.>8`'4PFA0"3.RX>P5`9CM6N61 +M*_,GVM@JGI+*^&CB&4<K0$\F@`+S@\"^HJ3Z8-DBCT*9!N<"XWCF]!%6B]?8 +M:@E[JL\V'E>`W`D&$J<Q38]1+RAZ,)BQL<[M6_"$C_[7^9\><B$X7F,R$5,, +M`C)3`XX'[)YEY+1R.W[C@IYX-M4%I)L\^\PR`\/_(3MJLY@RTN#Q@XH-(,%E +MLY9&M.9[)Q-;#4X4/;HJ+O>GN+$F"HO]11IWDLCRHL-N)%"FEHI7^Y7&`NL8 +M:S:/T!V]XJ+!'3ON/^_@?U%F-[#8K<Z_,*B$ZHQ0MHGV:P*>H?_+-).H*/@N +M#E&O:!DFPA<2)C@?.1.:<`O6T]'Y1)'?N:%^8_PLR4L,]1CA23`5?-P]?@V] +MR?"CD4BQ87\FM@X@#][TC6UU<.5_<HHT;M=:L]%/Z(^DB_P-?*2`Q&^]-`<; +M@2C;_`0`47TQ[6>^OF8GZV':&3LBEE%<1"V(.:G7C7<07H8U"2;Q73'9?=/Z +M"D62.ZF8/MFH6=//7__?I(Q2/<ZZQ6&8ER]SKA*O@\2`%<'P$&>&EB&M91=> +MDH.HMZ!M=(P%L:;A^;KF=Q;S(C7DTO[L/HC@-VK<XUL@N-YIADL:S')SPXFU +MC^(-"V9AJ'4%1Y7;X5`9LR20?/F""10-^#LV`L/%+0!`[(>4!9#,^8*%$O1U +M8,`M1G'OQP`OQHNRDSR;ISMABJD1A]C^\J`[Z.@>?#QXG@E2(#X%P"IR0TAU +M/!,TR#X!7`BM/4D<MEQWFN\H;"VCE)[.F&X-R%'0B?+F@IE48=8W0)^!]8]4 +MY@T%.J>2E=O!ZGQY_%RSTP8("[*,4<DK76EHK#JR*[9[-H2S]-$/(=-@>^'L +MP+P#4[`'?,3X`\&^HF5?^1AK9`A>$//OO(A`L^13T,SR?RMZ2WGQZ#Q*V>A\ +MFUYT^A!P6W+5CV&^@W$YK64'U9?N8V_NBI<'6=!3.C6N9_1<UANWF<L\838. +M*K_'FX%]K^UO5L!H+P;R[4"4:C)]E>?\B8VO=KN?525GHZCO`D'Y]*&/'])U +M[@6`<;DDYV_[-_&MKLO6&MQ#_@N[*>C;ROT+0\ZNV8P)\[(8V>`G9.HT1>:, +MCY?$C#QN,GF`G:%3"PM@EI1$.!@C8C3,N=!/\V,6OE!>P^APHT$$C#/2-C:H +MTP3KKME/'(%='^GF1#4]8?#BUIW#"W47&:6.Y`<0+>T_/^581F/LJ8>FN"], +M'#%"Z'O.KLG78?8,:#<U>%7=&JH(MUXNX89`0IY5DUP[U%:&7[JR"@;KV=0A +MU0/:$?D'066J(Q>;,`]03>:Q71AA(W1RK'>)$[M5%I);8&6UM4F;`K[:GMI, +M!;+"YUN'MW`#@6P+9ZV->^$Z9.9Y,&FA?]Z[8S1(RPF&BJBIB5Y2Q_PP_)WB +M,>%$&RYNI'CY^I9>:O@7?CD=\C-Q2"(J(-2)L,DL&L_@OAXL:8WZ/'\0<6X\ +MB@J'%3J1/PA'GAL+1AKJ[#,TQ96WY]@%QL>7X343IIQ8(841?3X(*WK%M7H< +M6`2,KG,":;3743/YHEZK,_D):[WD7.=#1=B7$<8)U<I'C]26L&&\I%XB&`&[ +M'6@A\5:=/7>:.&)NV4%2(N19XWGV$;U@+A&EFN=%[\@_'1&<V>L,8HSN/!): +MHO0JSJ!R%%1W6@P(Q@1Y8NIWTT9%LUU^>82]^=]1*EX"S2PA_GY2B0@EHL@0 +MX1>%#8C;M-0MUP_9X2TPIMJ:YJ9/TW9OH;:%<VS^U@,G]B>S96QR#EJB''H? +MO^W1>]]_B#*DFMM/IC=/J&+07U.G5BU+N'QFY)9<R]3H&_]$GSFU84O5G@H$ +M'P(RZ@8-FW&?Q^];+A]W#`]HR<V-E6+*P5#X!9KLU.6IG901C_E(#B$\`).Z +M1O\(";1+`*7,F\UMN#4]VY5VF+R\D$GAW[[T"0=FT/!WI`J;!>%AQ5B:>7PH +M\@&-M+,<"=?U].N(MGT<X'U<$IL($1995L32X#^08:P_1\G202G^\,>4KF7) +M<[QM2N2!U>[@0++=A[$!`P"'F6B&K0LF&C__9[XC-H=-7EQ'M<+P1A;Q/T7U +M9P0"YA4L'O](:RZ=2\O":^WPUO"V^/(Y/(SM.T'.8N)3C<Y',Z.^`Y6?JNAN +M2?KR)A'WDKJ/.22F&9Z(K9CZ)FQ)VZ973W5RG\<VGD0C`>N>@PL?`1UFLO?D +MCWR:!+.N;XF:)P)2>Q.!.$173<344:"?56>+!4JX,]CB33J>G[-CC!:6QPA* +MTP.MA_,.U9.DZ4QA'UYW@CBE]P)>.,8\',Z".F%D]:F*%=0N2!9W$M])Z'*/ +M&0D]7=C$._S`W;7GCGB3=$8_U@8P[2*I;3LB$,V>+JNGXZ._XSFD;R-H2U@S +MT7[')E@0WXY43HL"(+MRS)_U&E2F6+%+I,]+',4&]("O0$8`^TZU$M!:$D]V +MA.@`.(*K<X%]K`-`L(NX7N*1K*"OG`7*6C:8>HTI!3Y,=S#2@Q7DX%,K4RQR +MSCS5?IB[,&`S@0_JENTX%4L#_P86$IW$@JWK$;.#;3$+7+1VQ\>+09?(G7L: +M?TEI&$[XUER],#EASB@1U>DQ#;8ITB60([BU)F5ER1(ML`'+.C)B_TC[6?L[ +MG4P/2LX.4HLN=C8>53>CF)275@:8HA7(82<=7&9#@%XBP9A<05YZJRGO-<>" +M+KQB=_;(6]H@DN)92UQG;:U_\RN25>X-V#-9J'^DE+17T_7":\&&4L<+NZR9 +M>,(1:ZRHY>`J--W\-'V>.($@ZT)W7**+^6CA*G#85CP&P??/SFVPYX'^GO@% +M!+POA)'`'=2'?B0X"G%W$I@N%KH%X=.1L$<8)==:$\6OP?H00)4WO/M[R%,[ +M<O\754^?$(>8:.CE?_1.(-O8QC;IKFNB[@498Q-]\DTLSN\[Z!D"8$N78-JW +M,J47AFEQI!)>N3#M8"$Y$YC(Z`0NB?RYVZ278@-KW&6`G<1RH]'<C`JA&L0& +M@G0)W6;SJ,,</91#^V",/0OQ*7@[SN$T46YNG16,B>;#[6.&(GJ&M?"WGVJZ +MIO(LD,]/J3X7I3`%O9A*'ZQW19MM7:``_CWT:]#4=>S2UGU?G1+7E%Q%Q/^' +MB0G-"2=M]MS6$QK:=X"B2J4)@)5'E>$SKH!%$^9/)`7$S>69&^>+G4KAOYH1 +M7H3,G/+LAA"Y2#XLD.46E6]'B9^]O?4ZN$:O+*09&7QK,TU/9H(PBYGM[`9[ +MOV5PX</P+903UH3->=Q9#PZ/Q$-5UY%;@*X>0$@50-)$[>4$XD:6$V3T__O; +MHJJ?B2R(D`Y8AI`#,:"WDP(C"LBHO1'"A"VQ=0W:OUFU2$0>O4LQT-GI\"LB +M@T.$^C99J,!2&J2YR](93N@1:MAY_=JZ>FFLWXLRO7X1&M?V6X^J;6&LW#[Q +ML&-'RW'_GO2?!S/I*G'_P^F"^E+_NQ]LT0QI:;-P0(G[M-Z*9PWUAN@(4T(T +M"W;_&9`LQM"P>`02[P3,9TUT&ZG'6\9)HHHTI2BR`3SQJYJ;44$5RU;08;S, +MAOK>-$?J`@.\&HTUCJZGS1BJWE=OV\Y&>C(50O4!TD4/,'N?A4U9E&AW@#4( +ME'YZ&V;TO]:5PK7#Z0VSAB'8IPJ3$&.A)'B!6W9Y625AO]$0U!XF4;:O79QA +M5CY[6:2%FHUME"F4>B0CHG1]@I-XVN(C]-<>CC!;^WZ4-7HCC'BMK+QS4$(] +M!FG2'[/DOV>&BC`\1P;5]NO:'@:#8]&D%#J[&F\C21CGX561J2(TVE,0W^?P +M*(&X<*.S9I<4\S,C1*S6QDCB@>B,*+U]H$4<1<:-4ZYS&U%IE>ZN!I<#Y3)Z +M$3.3=V?$.],E%L2IZL>&7R02C+37S:\?X]N53;37?>WK7+O^CD#KM%@,H'7S +M6'(#<4X5+(M18E&34T#:)P)CH&)CA6#:'>'ACIH><<$@"&3N+F@QL,[F5(*< +M6HVO+%_A4\ES&HYIM:*$'D.FB/5A9W6WJ+N2BL%$.M=IGDMZO8]\"@&P''@_ +M?"F-?N4V]W#2'&O(T574)>N.#()0_Q1X;L_LC*-18S]'.ZOTRGOHIB<4TBM5 +MG8-9B)L`&2K`&U!XL>\%Y?1<%1B95Y:.\YZ3?ZIKKW&EBU]-*.<];-')1#KH +M<,"*VLU+I1[@]X7,B()JN]4'<GI`",T-FUD_+5QA4ER-=[58A,)=\G:O9L"H +MAVE]K-=8'$,7&<Q1VAI`F$-J5>&I+5D)U)-_\D2F+[8YWTBAJ6WD9W^7KJFD +M/I?[2-(](WE@`:8==%&F6+S\^]#<COS)>!$>L]<2Z*@FAV%EK5/9DY1J%^T0 +MTIX=%R#L@>+X5P@]^DXF>B%'-XX@?2=_U(IFW_J$;.8GZC!UE7';RECAND@V +MVS3C.<`(K&%U?31G!.5$6Z9CMEL^-?)$O$(?=@4/\:GP^G63>JYQ;_OH7!5S +M0--EI@SO!'(*"?-6>@,8NR'H$]OV<<PY]N![MP-E**$S1NFWW1I*"[FT5\BQ +M]+"-TX+S!!YA(E2]9PE8&<N)@FTF82*OZAYWC=_K9?A4IL1(O1,`SP&T/?B) +M4:=*+5)PX9.(V;"V$64LT3\VIK&J"\$5:<,3@');HKN+QWB.H`&_VZFO2L,/ +MW\-F/3I\P!.6?TIDQ/^ZSQJ7S[)\KTQ[C]BG#7-!'I\X0)K#[UZBVC8P(XHT +MDE98\>9$[KE>NOC9S1O26V-XD8""5U?+6HAQA09+-E</*(R^_NXZX7U>IPRJ +MG442+-N=0CH9`*QSF^IL0QPI275&(VC=%/:>?C*BLJ8B7A>[I^>)T*K-L";S +M%$ELY$"1?%QS`AN5N/C=1Q?8R5*#AOLG\,@("-R?[,0T8?4O*>C7_R!2-?%9 +M.K4!?UD6QS;M'TJI[,X$%E#(8.:2DXZ05;VP0(LAI.SOI8?C8:G3I6I3(ZN) +M2@ILKTF&:@**3O\0AZC!$K"F2-FO0I18OV\I+*VF]LXH[/]0!*37G-Y,E^AQ +MH9108MD0\'OS904R6`2G6*N&0C(]_&;X2')54]-15PHX>-AJJ5B\DS^]6Y?A +M'P"*"&PFUW;RFL,IZ@0TZP$X#L2A)\O4BN=JT;8/TZOP"FRC.4_@PE.$`IWE +M@61(O"2)'B6;QA3@UN`"G37'\*DY..&\&LOL)W-Y*E7T3O]!U.9K>SKN?L7A +METN>&/65ZN9ZZ:&-YK5_B#C""Q`)=V[IBO`CA`5X^QR]6]7VJ+N%9OH`/!G\ +MAC0&YG$LW5A?R<$^^1M!+L,9K1QK5]1,`'.RC*0'+^1*`D?6U&OS\9S7ASK_ +M&;OFT*)<>O`,CN".T.Y:TL9,,A-IRB'%M*+CK/J&ZR++'>&N1E<0MT&(J.\C +MTQZ/]EX3HCS-7"&E+EJ`6FT"XD!>-`XO2AB2;`?R7GE/F/AD9NN\+S?F'35? +M1D(O:52DTZD"_2,I)?\Q%PC9DFTTNXR"Y"#8PK6,-RX?KG.9OBUYVQ_?$3-F +M7YHECGB$208)K"<B!P@A9G8J#H-Z)5E5/!IA8W3!K@P5162PZ93965[+EM,` +M;4M])>4W?ZAAM0'\I8#\"X-V"BF+0&9Y4J%*!T4/`W6>RK+U(0<NRJ)?3QVU +M?HZ]!FN0-7X8=-G[K>=[T`$+`A]G\&2+9:./DE0_7_;2'!.Y&CW,&TG%.[B: +M&6M;J3(7@0&LK\.I:$U7K8%@Q%NJ1COC2EG-H%$9?77RBKMV;N,F+?-Y#LFD +M0EM"$I7UTUR.RW8/=R3W%V6-8&-:L_#/[S):[MN<(L^SA$["&TG%S52QP/FY +M6#1+I5']G^4>`*!_5DMIO29!?M_M4!.?<4_@FL9!)]%:^7,)\S-V^<:BFNHW +MR@[3<',1%>]U%(1<R$3R=]VVOZUTE%;4SQJT):K)8\>:3)AMS:PFSO577TG( +M70C,5UBL^V0W#"(&F?7'K?'D@!L'HWW?31<R'/UHY*CHH=C8P^^B_0P`_=97 +M\B9=+DQ:\F.Q).:1J5_7$'>`(1T&W"V!R#'5/0#4G@"$OF,]HQ>FR:W70>8" +M=#5<2W0L(S'="%2G^.`<"Q</]X=`<XID?[?142?!DN!K`[%`AGU3:@/]@90^ +M.LY&+DM-)7P_445L`,-W%5[6YA?#@A*TDS4RY\6H@;8M\2/$@=`C[F=)S-.3 +MX>+PDL.18;BL6_JY=`Y3Y?,U<Q'6_-<-:#Q,7'1,)*G.(0)''[S2F52GN2(N +MI7K\)4AMA]Z/'8P6-TR$9_>$AH:&X#Q>0/?$@'81GL^0X^RN)M0/H?_:,G]Q +M1E@(0J,;\)^NZW#@P7T8AGQ\3D>E,3)&*)Z"ZV!'<^\-<)D0(K[&_A"BQ69> +MFX=[3FO2;"GY!($X.*SLDF[9AU8_?L82#IMVU":UY0E#9XQ4N^3S$OZ23H`. +MBYW0-`IY1K"<FF^4^GO$Y1O!Y5]8B^F]?THC96MIHUJNR04K)LO&BUD0TJ/H +M1^..GG1KPM&EA@M>]1SNNP<$I26*1#LDR,9/0?IGAHV'',.B$^H-]6(^")6N +M-"VJ&6WOG_LD])-9)L[BCV7/9]<*EZ15X!\QB5443BR'\'#:F+==X3F:(9\Y +M0^1.I+/ILK(A!3RSO?Q+M54[?CUJC;%`T93:)+ZH^8>ZE//K?QQ?ZE.@NI9] +ME&RIX&I>\$3/VY1G+Y\5)F:"#>X,<<I$FARZ29-9Z#%WJ<KZD-NA-3,I,ZF> +M"UNJXVT925OGBW(,.?LM82M`8[!&QM1WC\73O^!0LY%)6_LC<A">7W)E\EG\ +MFB&EMAEOU\ZO<UY?9NX]RGI.A+>S&1T@U&H(%B$I$U3"NV-K&6I7G156HM!/ +MBN^5),B\$?:*DTO:+Z1U.W2WOSY`"GU[@3"-Z(;&^!'U_T$F9>P]M9J3/**G +M;+%27\("A*.]Z6%D![D[F%+4AXH#?0\5U<T<S"03AF]2XL!']V(!'92LNDK? +MM>LM"ZI93I!`AB7!2.(_4]XEWM>K_H[`[6Z^-[8'.NTF^[>UDLQBI;JC'^'> +M,N*Q6K<`'/6C6W8#V,\WHD?[9":S@_T@3A+/\:53OQDUB:3-YKK78R]2^M%K +M#O=8_L;&7]BK*9K4JQY$*ULBD$9SY^VNHT2<=%1,SC7(6&4\BEBS<O\>N4&I +M.Z/SUPEAG5!A['@(9B\2%@V77LOFDN.E6$AA5(.:C+P5W31RB=EO"C!FZ'OZ +MF>=</FQ=;2&".?N%@,&;M5:VLH*TIR6_$TMH.K<Z^M*J,IL.U.I!TYZRT,;0 +M]A6XR*[P0""W`I5(,1$K*S(PVUYC2UDQF4&(SBL1T)_'(.9_@7Q*3^"!;KD& +M`307<V1,<\\PBX4&?ZF]N,DY&Y3NBWS%8@,J1/4[OA_=`9S2^[)3://-R,LY +MZP]\:Y."8_`Y`F6G-&>5U$-13,QF,G*`S6^-H."H.T7=DQR3Q^KMO`EMTG^! +M+ON3@U'0#'.UA2-I79A&@WYM8#VB<616%^].5J7;9,T>>PB$!YURL-WO7P+= +M$)13:IB:,AV(F/V4ZS7[KO_WVLM)Y?2_H`L=FB:0;92-:IK;,(VMINF^^U95 +M%NHA<5Y^IQW"%2C2VD,E^&XW39NL#>4AB7V98OWB[>2SBK[@D^>,UU"M,\>Z +MVMX_%6>&>,LB8RVT`CN\5%E+.E3$2$!P2<OT\VEIQ:>!^41?3D*A++MIS*&0 +MU2V=_$O4#:DU!C9*XGP;"-#O>_Z.:)@:OBL906KU=/S1!04-F0QW7.HC:(S\ +M1)_(>'\J*!FY*W=)8&`KY.)H[I:SGYE-B$5:0L'.:U>"DY)5U8;<5=]+)LCQ +MDI8PSOAF(VZ[*J_CT.`$FK+3#N0!+C".!?L7D%5D`AOI$-]-H["BEB^X)>", +M^QGI7IU@%)Z>`R!T@[B]@57UI5TR3?F>5L'Q@U?2/C3*EJ166E7A@EDH.DQ2 +MAOH`XDLK74J[H!3\_D$D/TD&G,#J#SW;L_J*[P1@W3?_XDC4V3UN<7]G!O)> +M9T4C()FO`2IJ]YB+RLQU]"LO#>JAN_+5T,NK4?[G,]]\N/EN'E4>`O)^?=1E +MC2&O1-HE9**K\&-)_G"45"N8TP/I7)?(ZM&\&U1QR/<VZ;*V)F&\+FVH(SY[ +MJ#=;S,"$R00/FMLMV;-=1#!WQ>2"@,G!:]>XM.PI7X#&$=TRX`G50=H"$Y@R +M8_7]])79.8,.(8R&T;#*`ZM&<#T["J$;![O%D>>X;ZIH:#/X9(PB??HCNXL0 +M%&/[N]T"GR`;:\%6U,\RFF6I.^;,DM(9HYN+2]*3H7B0:Q3N6CV-HKD!5LA9 +M,?(@VA.@,-8$\.X?LM(FE0=`3:7ND&Q\%@'GZ^6%:4AJ4>>%M@@Q@&`SHJ8E +MY%>N(X_]^LX<MJ:34TSN$Z8%IDEWD")4:A[6(]&S>]&WOUL$=`'HSX=W+>>? +M?N*2-H;CN=&UN/KL`Z@]ZJ>KAT_+"3F!7,9I!SK>[(#2%!'1745(3;^]\K;( +M^/$1J4/>K7*U7KHU?YE"!+SGK3I_(Z&NNHQT.&!JL%PI`T6%/C:F/T$E\X%@ +M6^Y5'AI3/FDG),LT"^T-!@17D](S3UIBI2Y^6K`CBUR&Z:I#9X12K>@.-3@' +M65"TVCDR*%`V73*E:@FF,>"!&596"RGR@'/IG"J@U&^5[`I$A,D9F'$[@R\< +M%7FMZA)3Y''I4]T,@8V(],"JS"&#Q2'3P(:WML:+#5"0:;&M')^.9H'V$"-/ +MW="L0S"8,.\%RQC"WM':18/A<>NPE^]SM7DV^T2C]OG3NG$PX*4"=+Y[K#7. +M&JMA9M8F-C:+Z))B,O-';?(7<&WW?]G(+'6UHDI;!.&(\+.<+Q,+DZR78"+# +MZ#F%A5K5*NL@!@(6SKK(DR:SOB.'X90C=D1@)$*ZGF8//1#0OWXC2<E),/&V +M(/^VG_VV[=G#$K!!&N3WYBZ1E)W$TU]GL8HXI_`H#/Q_!9-2FE\!7+QCO!J_ +MK2*/*C(LYS-+",ZB3@[K^T&W(3O`^-Q>:$_6[`T7F:(_GBTCY;%!&LX#"Y?8 +M</"Y=%X<G)I`Y7R7>$+8<1CU4X.<MPB4I;AA;W*VITM_FO_X(G%)4F`,/M+8 +MZQ.'**J;:L!GU$\#&`\#5<]F/#KJP[](/I:R$+]IL6YB/JP$$,/(_U8-U[3Z +M:N3WB:K:")*;.BBKZX;L$S\>A>I@578-@(DU*8'RKMN/2'3#EA^WLYO6IQ9K +MN[E>]6GIPJ40#E`(UR]DO`RF8?"G*6/=%IG*CHD>)/]E:!>%D\"!.O&NE.R_ +M-3WEG:#X6B(L[ZH/PHOS?U)!''+ZF/B]P+55FQ]E7>L]Q8*V=3:89F^\S2FV +MWV8J($'^:0REW86*5"$EDW&Z`F5AQS-49,!/BJ:KI3@/-)9!EY%()<)R#"^2 +M&4[HISGK`>%6I2_T#=WP*W%U[>@L.YE.C404IJZS#7>NK`^91>T0EHS</.$S +MZ`$=99>+UD?%9$=>2#7<AW/IFP$-+:EGYR3I6F-T>VP2-C1KR3%/(G/0=$PG +M=R$RN"E<@1-KNOL=AUG0IN!55.[TNE-EN@&P1HR;Q3Z^\XZ5>M6(CF9DIQ5& +MI;ZD-QHK92.,"2?9_`OAR/7D;,H9L:U=]*U`C1(Y]%![,!7=@*T7)XHVN1V_ +MLM>\=">W8P>FV!UEEN;CC(5K*XUT5TSAY%:]=9--OLSEI2ZG]2FU6OO?T0^N +M.QZ!B'K>NB3KX^*H*6G@LP]XL+.0=@&S0D[3)F"FRDB)?(6<"-\=#9!;)D5O +MO;OD%#8EP]3PMCV))IT7%((8A3I)^=,E((Q(F#MNB]G\FA.@R-^US6R:P'XB +M2E<P\+$QY_Z((>G;3`*BZFGZG5V\$M8L[X*1_#>YV[U,.7!8/C1Y$O:3XU_Z +MCWWK6HG]?M:L]*YR0`Y"P.`)',F7WA#&`)*LR&3N)I?%^JRDG@68<)9L?M7[ +MD,CGX7/>!C7#P4D>C=9A>*:4@OOJ7D1JA63QL>0E0(C;3<W6?<X+R.U!90QB +ML00=R3(A[?T[<C[M;=$W?^),<P;S1YG<)-C`B?J4K_Z)$1-7'H)B!8T?9V&4 +MJJ]_J^J3;[2V+C!L!:'P[$A<W,9IA)AXN7$-(YG0P]BM,\6T&0".C>WT>V7[ +M0<K.;4#2Q]!P3]-F15!$1<S\0#8JL>R<WL)R`^.$PX\<%L.0&9O8:DS$+S2R +M[BZB5OGKGH@.CTA4@J&J>FPW"!:#_Y[W2+.A#E7Y5CUL4N<)@(:6!BB>85SH +M#1NZ*1I*HCK^[W87$9`*$8)9$!0C/."6OW$%>AI4G2_5J&;I'7Q<4P%,@*(E +M#RO3A[8<N\)X8%!@-<TEFY9M':+:Y_61@N&2(?ZB3@=J@\EEBO['/V7E$XJ, +M=J0GE%OP4V^%K(.GC3J&CU$`7,9M>'GB_/.LB\[/O=6_M5&S,0!*2^V-,AJI +MISLC],1(&C#:7N[4!B)"IWNY!:%YMG<Z(8S]1D:1>""-ECO@M'>.2B#3?=]T +M\&SV9T+GVH[Q7#S&B$;#0EZR(\L.W*&_J9G&QSOM5A:$_WX,Y66X_<N&"`$@ +MEO**)CQ3AC;2Q*(2+3W?I#5V*E38U]A/F(Y^<*"85P"T1\%"V!N363:"2H.R +MLY*'%0/X:&$AF:NY?>6`@)5NY8)R)5YG,)C12^-BL,Z_Q9']6VNE/V8%8-TH +M:>3^@8;E/--]&,4`L]T3K/I..CQ0'-O[MW7?Y&0G4/01/RKN:C*]^#[%DJZV +MY1CD$)VYP5AJW+E72:Y=33NR?@%S63"1\(J49.P)J9R5>)/(ZVG0MO`6-Y&Z +MFS]G(]&HP`(1\[5,(""/*4LBAO%1Y.SN5Q\\3*5!SI[LHDDF,>2]5FBO>M2- +M0^`3P!5HR#M^5@91LO%"-_!C-5L%A3Z_/T,N[]4L(XAD3US8'"]:."LH=Z>V +MO26[]Y&OU2I7H<5XSSJ*U-Y&Y0^JK+L164AWS313F^=2^8Y>*`,K?7SZ83`1 +M9^T"+_#J*=I].TSRCQ,?"$:?,G_K[:>`--'?O9_6;3)'P>(Q8;74@N^JI?-3 +MUE+82Z97`[S3*5IR[XR9)^*07*R_T9[KI?F[03_P(30EDV^=N;$Z]T1;/QK2 +M>P`6^C=K%NQ<=1L,ZQ:^<8Y@(L=!):)H\5NJ$`/X6$2AZGO;MY6B6`GP04^G +M.X-9=!3[R$+1#BE?53RC>MW^)5Y5M+>[9L=3Q!@$J9-^.0NN\NA]=WF3&S"% +M<7QL5&M#U37Q^>-'BCD@XH6$B0DGY3**^_#VM";$\ZAA+"0ZW7=#@D#^;N@T +MA.ET&'5"`PQ&G&]I6OM$4D$$?)9,RX_9&UAHIN#)0XG]3A*39E+C/;P'Y6UE +M:B'=FOKAYRJPS+G+F(HH'^#P-#;7.8+S,*@%D]2HV*?Q`L3TG&,G$GVLN*E* +MZ`7(/9G8:K_;L(M>I_NIQ<7L+I_1E+!_8GE$6)=ODGD>+0_T"WV4B";WT2`N +M!S_NF"*-/5![Y\P94@A!]78RZL%7TGQ>9E":98JB2J^1(XFXQTBU[*R<K<%( +M0(D)W#>@6'[:9!6PUC"P\Q-(`^$N)P.-AU#PDWWD/N""^_H<6U`5%X_0,*VQ +M&_P=W1K)F795P?=8MTIDY(_LSDUJ^@#'"Y9SF.\N=+#@D$*8?ZK$!,3S2P=+ +MIA,C$7?`X0F7_41/\\O3UQT5CE*;7:9FQUI$32G88+*O<O()WEDO!#[Y9H?4 +M!!C5`L@>N(9O.D]:A)3#UG)%&!BXAL.3#_\ZHXQH.2"->:J+#JB^#!VOFZQ` +MFKH7![_.H]=VOR(W?X))$2^7)",SQ#(Q\,YFT\!\-"F?B!'O3XF-3\:9\\T/ +M`L#]2]:KGQH3)R$1^6/A>#+GLQ9Z(A(,;0X6]'YG$`P>DN^X#3V%_YNO'B^K +MY5B].NR'1,+&#R;BI,C?N+UP7-`;?.4`RZX\N]`V()J(J.(_[V:=JMV3C:%' +MIBTL*3<EY156G'"K1&HUAWO"ZSIV1^Y^E1OK;YO&FWJ\*(A)S1^<2I>CC*8& +M"F%&5`B)1M;.X=/T[G@YQF^0X".FXI@HTBY.S#BF9;T![QCU$F&Y96PAIU9Q +M*KN+%+9F$*>]@D9X"TPSF*$!IY<8K7!*K\_1X'CX,;`<]H1S--&>]1%]]$M* +M:=X"QF_46Z^A#?*35IEG]_HO!2S\RUEUM7#A7E/F-A[(N(9;6I]@/Q)>+I;\ +ME1,T9BFCAI1W<#O3F)Q,'Y2467?.GI0<@3-''Y;+2%UJD?UIP?758<QD)/NM +M`G[Q84YJ=;SG$*]25NO-?Z']/B=M8D\^\_#3O3YA9LF$;;0^)!6II?.U&,'G +M=.H2QWWR*1Z..:4'6X;^.]1`:;[1(8,E!`9#>&]`W1['-$V+(-BDLW-P2XF[ +MZ\<04J+R4`;*V-`?OLOW6]T8$`5B2Y"X\+@:IE?X+7K%ZR;&\%`0'M#<I5PO +MNEQ[`=W39S,&-9&9$)FJAZ/0H8M=$K>'RN#.4TFQFNE-`I'G$(2?B'C],KVK +MNWY!\\383#.H]*1Z9YE:0.>L?C$OCD48!P85S6^S7+UPWF16%FSA!X36J*E( +MK)NE(_Y^0L&.A9G_070^^XB[9M(;^S87!(*X"+B5E:XOT`1SO.Z@'!1_TH=Q +MS<7+J$^4#E9TFO@2!:8KN"CRG=T-@XMO&\>M?UGS+N0VS.OXXE?)BV-+?&+8 +MJ$S?I!A@.#ES%M@4!VJP^%;?XFW(??1T.:96OGR@:&&>*N4E^1^R?!3E;;X7 +M-.T/8,H#;'!.);I%U`9`4L<UD@B'I(Z#$S]0WE#6;JN2MO3Y%)\A<$8-=HFF +MC;)Z)">QK%,8V'3='3V2)[`C3PARWX5LE+"\@9*[1C,I*I#;WB,`-!0EC+%= +MY]IFYN,3G9TO(IC[$/AN;O.H!XPWM0CP,(G.F(Q159_E\.:U)MQ4/DWF$I+, +M0&&U(!JWT]XE:.D/QGU4".<*'YV;A/;E;M\H'UQVNREY:``?T,NI\N!_^=6D +MY$J_16EZ<)6GJ/1?*+;YR+:R^Q;)!,Q/0&=NT@M;I@HI*"V[K)F([AR5!%I` +MZ+TGR@7W&X99)Q,8[J-9,1ZPR;T&AF'.LSL5!$U<%"1/9)%Z2V[@Y`%-DOGA +M`KH0Y?H&82FBH.(RBH^B2RER?BZ^42^&'A0>R;!T205P%#1;/NSMW4B<B_?* +M=VQ8O4Z)_T%0715T\A(8D''*IR_3<+<9)I?NB0C@^4U@/0Q0FGGEWF-*TG^% +MP'1][PE2#!7#3WDHB-G34F=:4/DQKP4K":&7`#XR\95FM;3EGEQK>BC/V+;I +M;/@O7/K9ZMP<6(<'E4EZ.OY?HJJR`Y4F[@BAPGA6(SY9'M0S'1L_5BLW\QAF +MVC(Y4"5-)2?H83U8$DE;4EX-DJ>79-8A`^A'?#AY_.;C^?VKQVY5#4/9X$_P +MKT5@\.TO<%EU)_Z+ES?G-\-7DU_=8UQ7)8^[B:&=*D?V/3_[]<%9_PI@6#D\ +M2A[$<L5BQ0Q1HB0I@R_HPA1WY%KB&$92"7J:JNQ`GY)ZB-.YHZH8IZI2U]&Q +M1D6%Y;U1LL7R+KOM-F-.GS21:6+]`VF7_2M]_KHK`@2TT>K['Y=CR0MU%2)< +M'F6;L2Q!P^E#:0A=<*7RUL)7O96.JQ"__7N$330.QYKRDUF$NQ='0^:@0M<> +MQ_>@KV.O"-8X\E?K+LL?W[M'3#O\(CCVB<78]:-;3))45SG=E!>V6#3%])"5 +MOGS]15=&PMM>E+_]O23T'>=2'II'GMSKE8CJ/EQ[23J'CT;7ODFL*\'<.C[E +M(*Y._\L@]K@_'26\\RJ+R\X\IS,C8:\YKCK9\R,\L+LG'"3UN.'/^2WFH(;5 +M!K+-J)@^$O)I%^$W,/M.>N%XS0.D=:!L;92J6>>6E$#JHE*FQ9V!9[M;?X>P +M_>$MY@'/@/)@8@4A726@^TJ(I_)0:R*Q9T&[J/?_[?%6@TD8;5&_%Y=ULCBT +MT%"(AS:`%[M5B)>HF\R,I5009P.(-.JKZ-H/OY@5%:JZ2^1L9:-V;<H+-T<D +M<\3;"G(C`OSU<18\D+H.MJ/M:X!G*^7H?$=:R>`>>VW$$5%55;7G]*YD<O?Y +MR$X&#]:$(074CMGU]:/-($(Y(Y+<??+]N%D2B02.'17L&?])H8!P(E3KH__, +M1E\["FHQ^;C#6A`+6,A!Q2XC!:83)0FNI[OTK8U?)F@L;JPPJ-.;#**:]MTO +M&_XLQKVQC.6-,B"'!JSV:N#O.UH2_%3:OJ05S/$9"%]&%RI1;X($5!.P<S"K +MB'5L&VXV/_*"%Z:OD]G:;1H3`6\\'!73O.\SB`Z(FH[J:I1`C$ZI8-U:BH\[ +MY:G_)I=(P7L7#1M]VDFEU5PEU,>/KB$,5\'=0Z<O?%.Y+G!;EK4UG95"-4-A +M(,+KO89`34C01[2>A8D^CT&.N\H66E<F);BA3(0!G3YQ(3FP'!:<]D&:ZA@1 +M@=2<RY'U!Y""-_2GN?!)DG28>B&M^#/;M+2Y<DF[.=[4R"05"I+0XBD=G4/D +M3OII/W`9O=5U(>FY+K^^[I&Q;/G"4%'V,![D]F3LAS03>MGJZ91>.8P79^%6 +M@`_/F!6DTIJ"89"^1N(PG9J.N&N1.YS-5$X=O]L$V02*<4^T$P[Q)Z.X]_GY +MCY$VV"9;!]><9=,GH;Q'@=]TFQ6`LV6%M4#)[H5T`P(O?="$X:#D!=;DB<W+ +M$Y4%SO7.]R^;)>FI"8&[,C)3*N2W6M"7RO'!!G=P'\*W!@[4&I?'M.NJW\$U +M%"\,UL$^?&&\7A=>Q"R3W]VLQ`?@DGT+!U0=F8SFR`7PL_`54V4)TOR66PG\ +M>LZ%';W;2Z\;ZUU2OWR*`O?Z$-X;BKJEXP4AJX[\[^-5:?)=98DNSIXW>AB" +M"[P$CV8^(I,=3R%@<=2)/G^6-"))2/*L+["PJ%XWWN#3Q5>J6A&'FSB+-D]/ +ML_+NZ@F2-"0R:/ZSPW$"U7\+D@E.<V^A+Y-6[NKRFA+%6KH4OQ9_,.U0A^*1 +M)RQ+:-G`9$)^YV&3F5!ZF?^T0;F5!J/D\*,II,0C+#UHX"?G`NSS1E+*#N,< +M<IS:]:RD5M!UVOZ;KCIDW9H>U+M6PKG[&UB2LP@+3C8]TJ4/#!EC>[#^_FCT +M,LK#;3[><*.NN_;$7C2$J4]%>5*#IOZQOQ7B!I"SYYB?G5<:27?R88F=>'S1 +MHFX`#?XX3!8,-?-#]OGK6:D?E>5S\`?1=_S/?C)P<9(&=/:H=A5ML./0Z#;E +M2;ZI7)WEF6E08(P(P=P1QI_;MVV13CZZ:R#&9!7Q@JJ!/Z)MDN]P$:.Q&V20 +M(7?+(35&_#L6D&\@5AR#1V@U3LU4.Q"1E;@S\\%4WRH2-<V`R3K&S42Z'C.) +MQ'8/56="I'L>D6E\BH&]$QK4?N@E@[H$,_EV;DE%61+B=^Z8Q]]U;5&ZQ37V +M#U0D\YT@3(T^5Q=ERB"CD08263`/KFW;K#)QX*?[MPVW4;Y06S5P/\S.MC*; +MP$"'T=;S)>N$+.-'6&N<<TOD@.BE1F<1SM6ID0#F0B$WOG'?\^+3R-2"(R7+ +M6*^LOMG(]1^XES]\4+`5DY-38&M.(DQT$`>8QKW>'DH#&GCW@]5[^SR;S#`U +MJ744'._J23'6E01S[?").@!;_^%80]4FOR8:N^*)@\>/B&Q5F:="!J<`_ZZ4 +MWM5$3&QJZVT&+_\.PX=&!-K8@"FI&65D*M+Q*%._^W!J6WG#6!JNAL`_L1]8 +M^SWA1H.T6=FJY.PUORQ[>[RNKQ/GF1U+VKX1P6<K',X56XH>R5G71H`\84!O +M*;NWA0%]W>!:`FLA];<$1(1&A1@MB`L>1&#@=VGO96[C;[KLY<3Z!$P\%N1D +MBQ3V,R%(5P9EC&8WN&I(IR)VI;#LXH$_0++(UVERZ9'\IM.4G0I.A2%[/9)B +MX:/.KN]AS7K`FGF+9IJXNK87C>?Y<?GT$>$U6;B`;:IN8SL9QY<C[45T\2)& +M5$WL[X]+X)9@E3@IE/K?>W/S!68\&\%O^G$<<DEXKJFWZ9`2*1Z%0V'=*"SC +M&9^>KIW'9EXGB6C>OLMPBPUAH!G2M+:C4!XED#7,\B'7<`!`\]);U]3-&\2- +MFTC,=GVT,)ANZ6"(A.^#"3C:[`_+<+4`<MA"%\O=T)]WWF2O;$[BL43-VS!3 +M?*"E)\%!/QV>8VC'`>-F""3)VQU)NMQ%[P.NLG.H2E8ON+II`;%R2C$1L%'* +M2:;NSLA2Y"_:&8($CL9ZX$JM3V&T&N_OT6N\U+;(09C0<O]E=/U?'H5O])9@ +MWVCUBDSJD36BLM#X7*L0KRT_H+F4WFNLWHVE5P*!-8*-C@,>9&1"[O5KSN/L +M[GN`A'G62I9ZA\!!C.3.(6D<`1I42#$N3B0S>$4I_P#&@Z5'NZF2[,MPQ1LW +M+E,T1M7JJ!ZV/#%GT.0$F2<X@PQ&>R,[4`&V`!F[JJ)807AA'VMEM^2_'&*< +M/#0CI,>E<U&_LMJ4L24`D99`6^G2C&D'4]8;'-7-V*MRXUVRKQ3IX-2C0C': +M!R#&)D79'YJ>:RF5MDZ[VHOBIRN+=C-^C0[==8?3P$5W8PD._H-3@,#=.O@Z +M*1].4A2K&CY>-1W/VW7B7VV981ESW`5_FFH=--1S<!;.PQJ?S2U^R+A-DVT* +M)G$BWVBG>S,3U?1]E?80/@<&`P*$/\OT9$LM;H7]JS\G@:1.\:0<[YJ6?ZB' +M&`7DU0?1\$"']$Q^>65*+B<T@RD1-$,:UMR]Q:5+JQB:N=K#-[]B,]GB\6K9 +MG>=+$=:8,&'JX6GSK!>NJT:-B?O3#ANE#V%')1=F7IUCST(Q,1>;<;/8KJAJ +MM9.;$."V\4ZS<,+4\NA8*P'EG7>0^F\Z$N#23.7R5ZI:.:>IG.P6S$)9X7^L +M0H8%`8W^5'"?\3C?D>L'%<&:LHEE@G`02([CR+\#DX)+2G1_0!#(@=NXD<S; +MNXH%JCO2(3&PTIU6`?Y+^(,$[NXZ1"-G-<JG%C.LI/0I:]<T#I/;:C`L^.P, +MYA^K&78E8E_9X^-O:=(D\V:%%W#NY"7\KI,?[R;Z]%B]:M**AD^2]"N<7`;1 +M:*?-Z3HC`4&*4<YPMO0&V`/PCP>U68U!>C3*3(AY5U>%/PEW(=`[YTZ]CD%N +M_FT2J:KLI0K;C#$INRN:I'-284E8K@`CX\>RGHW.*81=OR\Q/.N@9U*A_3H[ +M?3%<6`ZF[1Q(XG.9=$E;MHS)NX2O+=6F70&7/!!H5;Y^3IE/K=$<ZG##2KEK +M^<&%(4FT%#56W1F^W;H5'F0ZL0Q\%/4[[[8C;O';5NI(\T##.3"3&\X84)>U +MXVET*/1**IO4?5U?W>?@(ZN3)A[/1@NS%KK`055KZ31A>2"Q)A3;L(2VZ+41 +M[,<!:@0'`YUZ(RX]N[K?`V(&&`VGR--Y&%Q20CCE"P_N-?GE6M+^(QG.Q8HV +MTUOFK5HM[4("^1`GA7756/!`S)?;?6?CZ:HAI3.,'MCW$>YB"C^A'_'VYK2W +M_4'IDY>0N"`CR7;!*=+?8"BD^&V9O4BK!<JI=;1HJ(G:.9><>"XP1?NA(H/W +MU^,2./L!1V.\;0.L$N!^9=;PW6G_)/=JK0WG<`J;C`S;E9C@JX`K9/U"!A;? +MS=?=/M-=7*4+#Z!_6(GZ=CJ'"$1%Q8M1@=MQ7[$?,IO[P0*?+S_?/7"3_CQP +MB(U&J[RU>^Q/H(EORB2F^RUZ++]?,\7BO0BR<3N;Q]4-L,T4%=#$L9RF:?37 +M7V<=I9VMTYJB*>18M\;NH0H=B>8[:X%X3)[10)B<;]$4!S?<OB5[Z-J8%.A1 +MZ@\#5!9!/P_.7G+<3]X@2TN)=4]1Q&\D*V=N7<D]WZ<VAZ#&1?4>NG`\_]RJ +MJKH8\<PAY\8(BI0:Z#5Y0+8D"@XY8D,?L7HQKSST)BVO#]4+0,M/APNLU"TR +M\C@:YFO>@:RH8,E22+E<X2R:PHNW[\(G4YZCTYY6A-A`BH27#/_3DN^J^`(U +M)V3B9\062B?S@SL[V!J%L?N[/%L6K!&HIW#6K:#U_P'+^O>?DGL+-9VZX^O8 +M"?0N#CQ7C;\U1IXC1&FV9*6@"T4<2B?'N]'9+S(6_#$^)2W16ZVV.,Y03`XH +MA%E^X9I@X1=$(#FBC/#V!`*",/'^15ULR*K>)S[(#[C(JM)UJ_BY2"NNTWBV +M-.0)PI_A=\@WXK!K!TE;2N8^^LOXF2W+!DQ=/,+AL3O>S$)ITL7BD!?J0F=D +MJ/>.;O9![[\.>+5;J!:9""@U?Y.*F"X87.F-YM57QML%K`AV&KCP\9:IO2"F +M`D\MT6`%(%_I1X]6\G9G/V%)3L2$9^0[ZE+:I1)^7\V5:Q!@?"G/"4*B="0' +MK]-'[*Y#S1T;10/4+21)3B*FL?TGFP*CVO69G"#=JDW^6?Z,>%EI]Y>P$QEL +M^IZF<VCD91(G39KMKX*)#L`D1>EAOJ"'_4<!DUQZMY$L<7O<CAN8XYF=@%"N +MV)U"\?\"&30NZ;K\?DU8%DYZ*W"#-NLU2:;;*.HD=ZNCGBIF9YQ&D,KB/ARG +M1"G1OQL`M,[+`\P`/`^7L1%PH,&9H<"!*D&OU$EHQ,XO3<(0?E6Q1+M;>G[U +MA_C04IK/@9N"I%=B#._\(VKP6+9K<F,,`I6:"CAVJ;4P)?H>,CV)1%V5ASLM +M2O17'K](VCNQOR'167I:=KS04^1F$X)&=U6U!T290",JD@_^$2=5;CKB:%K5 +M!_FCWG.8W4N8&HP64<>9^.%[5Y:;.A+(QD4U$G$!F.$JCI$Q>Y9.#I0S2)_H +MY.;K</)."ZXOQVG^G*X.`DJ$KW*<&6Z^?KIG<BITTY+J"W9A0E=R,:I,>OL] +M%_HO,;?Q@&E`;.\Q>6"_RTR.^_NFI6%ST$H][,*XX3`%ELNRR^LE0]V5C%#5 +M'97CQAW`K3&2XF'^QB=M6PU1%#XAD[VBYL?'R.)PG)I#/>:&SLJV%:Q7RX6- +MK.D8P<4(GI,6_V#+%4U0T1>[.@EC'W0@'85GE.CY*H$^B<RT^B,-VEO6G\@[ +MV.H)/>+'5)!?S0H/\^[`LI!,[ABY][B6?+&\0&Q.L$)94-\F/3204$#&9"JK +M=6!Y!TLOG]B29\BJ==1X04H&1C!4E7N-!$0Y5J-,KL1@G0]">S%'TR;CGD9` +M)J$K6B**V:7D*RH\+\+V_=-0BS)2^<><\6"XNX3&B/AW\(DT,T_#06$D((&2 +M9<LZIREV?XI%4(%O$6:#MV1=FY.1/JRF[4?L;<NS$).\[-SH&[Z10@UU=ZT3 +MCW_WY7'+ZE^(P*?KF45.`+LMN*A0&"Q?"LN>W^K:N>/`O5Y2VI>7GVVN?=&4 +M*]XF;(VE?W9&44>"^SX$A9]6XEU7,A9H3KU[/.)F6?RDW!OXGS+/8H\AJ+#" +M+01-!NNQC7,>7=6)V]/^.)\SY9#YFX\O'(!/U3#ZLJX<:40JD/Y`+9DQC0Z5 +MN%!]]5[H8X@W=+*RWQD]UHMIESO);Q*JDWD_NC3@ZR\]WYRX2$UF%FE6\*08 +M5>HA.RK4X+Q8_W4BE9UDBQ@?SQ^=UBXTBE).$X'.!2YUB"6&?N`[7%I8,%6E +M>:4*'!A7^L7;:)/H+UXM<D/+2?:DY,NY70\C3,V@DTR.!EAA0VWW8J4W.(0R +MJMSQ`U9EE@A_*[#$6C-,<[J`K7NY'$I^8N=?CF%F/%;AV\E%D@JBSU2?3BF0 +M]<%G%&JBG9'&1$P;&*2FE5[#0@A8(D@B3M_--7J8F,LK#=4^Y*4]QL#404+D +M,H8:+@((^6\5/&N[7U6?'>HY-PU0DJQ[AT%(F*M?_1__\Z/X,ACS_N^=K_N5 +M@99"TW98K$+L/]7?M$4>LZ6B<DV93>+Z'>(^;/J!N#;)P-YZ;N4BGY(.%WJB +MA9^\-YJ32K4.//PJ/YP\?]*I\)6N.E7U(;M8J2BZA^(34@46'(M%/67>5^]@ +M@2H$2-4F]AL9S^DEH$HM<-!F%CYZ]!7HHKN''Z\5\4NAGKN']@,J*M+A"RC& +M"M^.IM,+^QBZ*B?_>YG1V]DD&L+_#)EF]>S9"GD6$><#V"FC?MG/AE2D,K,[ +M%,87:I?G3_%:;>"/EOC+/4OXD@!N.<]]3Q,X>I&+Y2*LT\X,19C?#Y[?.H8. +M70S9WR[N#AR?L!AC4?9.$)DH-]"L5I`MD:KEX48I8RF@+Q<:Y1FP23/WV1GH +M,QQD;,KBOVZDDZ\MY-5)KT2"3$HLT!AU`F\CPV9NIA'/#]W/O\:W-E5<&J'0 +M(>_/X]93[\:MV5E?'^1XY6$H=TU+X^1=-W3_WZ@6;\]4C@111`="8#8,MRH_ +M=3K,"M28=\$\3?UI[]&GF)N!E6?Q90`TTZ-EL"O54HDM"0,L68NSL.;@3T#( +MB.(#A`S1$R%P:M)CXZ?UMN`LBM@)T'YUD&&\=_L5Q@,<<+65E4NK=U6+QG0G +M,ZBM:C7PXI?,=U[SE5L@<1D3,,OTPL64ZMY[Q<UKK``HV,GFZ-&_"_I?UQE7 +M[\Z/]6%CA[A<>.H?YI8)=:ZA^9BQ9.P#/MOYO/Z26(1Z7B5;*N.7TLH!BQO2 +M@3IUDUO6`2?)*%%+?/O,UMT>W5BN,.W/GG,[AM9(@F@J"9T9].,Q"DFR<]9@ +M92W"'/#:^-+UQ"?*$_"#JPHYSF@2``6*U]<S!"&O.\><IG%<[EDMXE/%6R#" +MK>$Q-Q]C6N6L[)FX.`XNHLNV1=-A-SZD)#]7>3W?RW7]_M3C;Y^LJ8]+R4)' +M31G1'H>.Q]7^5LH4VUJS@'3@59+OTY__UOD4/V;*>?`5(T!WMRYO6,D9NT5, +M`J">$7SEJ>3IW7LV=S-X(_69N793OF^:^XW95J;E7.*PE0#6_L<HFDSP@N_0 +MAU@CIY<R?TLH:#L+_'ETH^I)ECL_L<L?K4NT`7*&9%=M)MT*\IB"])T5E8@% +MJ%+CB^C5QMPAS+&OY+2VJYW:2@M5CL_G'6=0*[\SSHY[CT)YN$:;?E::'73= +M)EEY;TUN"0`^/X58&&]S7R$34K6[/?W_/\;%Y'>*75\'!G\Q\F4OOAUS.L+E +M((<^0+Y(_-QT`_#4\=#=USM7NJ[-0[%Z3`$*-L4T:CY"O(X&RB;XY^@3".3T +M\0]&_;!UH&1&"U=CRBOH@QF'>+JK\M:2SJI:AQW!EEC4RPX2D'5/E-%<^#GV +M]5??G#K59Q>[(IQ&<,5B:UN%4F$:N(_&Q?*)XHUF$H21W%X1=Y7L4JL(O1". +M?&*[ZJ/GG()(WS:$PO/3?>=[DU?'/;R3NB`8ON]!II>U22.38\8%Y^]5UM`> +M'Y:OJK[Z)2<)`O,VLHL<N82T3ASG#O`J-`+8@D%G.VD1\?FX"^>?*ARE1YJH +M;VUMD_O8P_02P_)J/V!I4@XR=&@%XJ3FPQ%F8[Q2BHK@8$)`(YL?7Y.PBX1, +MV%FD"1'V]:5L$1A=./+"2J<)XCC[@=5G>P1&4*+]]7)+"=-D.'LE"N#+D^;@ +ML\F)U2)W6T`RJBRB0?M[ZJ_7#F,C1]W?__**`^%RBFFV-!1XJCN)@8,4-,`; +MC&T6Y`^C;65%CH-2C9GL<',[ZX2!P2F4*(Q+^<!V(QC9/6%VA92Z879\K`F0 +M+P@R"!KYX:>&,AOI_-Z."M/9\D>6".$3SUM,C<TY@__HI:R-9S!*W3,Z)+6E +MT6K-9C0T,][,_`S0T9%^S:^S+^RPNK]K%\7&20>P"&5D,$)QUBX=+I^*5-A@ +ML@H+H81JYM0E6*]3@RC^LN05Q,Z4.-<N$1C6>/+@@9K.<39?]_@(^N/B8V'W +M?M%V=;P61E9T8HF^!6/S)P^@G+#=H#:[%+6#5/IQ!58TY=NN%7VX_JMIS[IE +MH$6S+&=CO_UUO\/W^=/*KI2%#8C!`=1OJO/[S6S91>57!'6",4/Z0X*[5+\B +M+_""BXS.*`7>,5$]A,;$BCJOJ,>@XZ^L,$G4/WG)K3RR)&T[/")$25BYY6]L +M%_B\K&\H+06TPQ%G^^4+X#6(I%H4PW=Z#O@%;FT;>)[.$F,@QG##8H\=#Y'O +M:0L'7(T3*P%36#)8V/A4.R"SP.'*>/V\K?0DJ9Q__7V[V\F3`JH;90_^N:&W +MEM2TQV^5^ZLC.4^BK="J>%*X#@+Z@ZA^A'W;.ZP3(4GSY;P"@-,1_[BG&J=K +M>>.M$S5,E/3!R\;.^,SCBA"S7YA!4,T0/LF.!`)/5#)6:1;&Q]ELP4X_:LUU +M4WR3<6;Z.,]Y=JSP@K8I:8-?'$SQ3.[=W>^[K>9B2`^OBFO0)K9?]53;DU$W +MNA:"JJ`8DB^9`,J><9?6<A4M3[8L-OKRVMCVI;7GVU*BW$82]I1RHI];:PX< +M&"[3MAK;#>`2`8PW]U\>WM:#E46)7I0#R+7WKJ"Q\["'(>L)J6B_@+Q2R<R: +MF9X!W%6OO\#'X?9.#PL>#@-9;M,9L.Y::+X:N<$AY_['@F'HHEY8RPWBY%0F +M1PO)1F'</*IUAN\/1=WD-Y1JQL%S%BTK__[EAO)W\:@3=-P`U.?K1*XSCC#N +MLG6FQ?N>P5<JA<)LS,YH%]$6&U3%G),T"`F-9$#+C9`<N07TOL*4*59\0OKO +M7,F*)^,00)1"S#UHXH91E6$D5#.?`3?`$^-4?F&TG=L/!95Q;H=!$)#EKWKD +MDE2;Y%K0`C=1A@;%RO*QUC+?Z1R&UJ;Q`U'9_W8.9']:]+++CHYM%2[G[O)S +M<37&AK[B0US+[".I?:Z-O*F\M!O9,_<DY7>#5D&8EQ2VTN$5EG43_XCZC8J^ +MZ@--.2)P,=+`K!FM!X0#T_WCN7=X8GMFRXK[3_RYN#H'<<T8EG=\9C%<%"\_ +M$`53<,^##/ZL$C+\AH%7%!N**!YEBTLK-OXI-*.>/CP6R!K5F(MW%B#9Y;7K +M4HC?/F0:K&YTHW6?L&KE%5#1O,X:>WW!;8/`[GV&%%M#5@^T$R^DD88#G+\D +M$!!I^8]E"[8HW0/9$*56^9%RGBJ#-/QSY<D7A2PY`'BY]^6)AUA-:=#6`"*I +MF50A8E\&$]0?NKII([]N;>S/L6SC!"(7Z6`6V32W?Y`M,;1(5T*X[4(1E4[Q +M.Q0;\#!2W>"\O\G]4B%!!.>.GFG!798B.S<.[.),E8.:1_\@4+):S^*28H@& +MD*T)AK+[M.6J,J3<04*D#Q?][2[L1&YP:$3?A\+(,RO5Y9TO:"8!=L?]1CR- +M/JQ5B1W,'NGGK$EBW+,OJ(%J^AV;5ADJ-NLT=Z;![EC#I0S[QZ1W%@-[N3,X +M^[=1E1P>[?SD8=@*/[O#?>J)^./@QG?3?]SZR&!3UN?[$+9@_ZTU3.[FA?.' +M?O?`0".F2'.2UA3\<%\$*Y7*;JCN./A=2K6)3RT^7;,DS"+/7*5Q\K-9$6;V +M/?G0SWV0CF:\X8F9NG-5U'&;T@DUW=[?7N=8*^!(F^P\=''CB?B,EJ$=*CSQ +M-^A1X\9W!KGQQ?;YGHFQ.63Z#DW038C,+_*).?VJ=4-%AIQ#70@3\FZ39D", +MNJS+1V7@=LF.<.!>H^[#OVSEK#$5GR^Y9S`R.+IXP`/E=;HOEQ^N9N"3MZ"_ +M893-C6;)#]#,@J/]DO9V:"$='4[S.H@7"+<S!V:S0V(C9WX91*AZ.+O!G&"O +M=*O5');]GPA/7RJ_]@#\XKF"6(C:!EF$6UFJ<X3;,VOI1=Z1!;EAB^3(XED( +MYM_9)<4`>!-,Q7<YP3F7S%*G`4IQ?R/$7*?=^OW4*6DW(P8S+'N/>>UEQE+& +M\>G@$TG*<5GH9,<X-E!%@2_M^K#=D0:>A)Z4U>^)VL3Q4)FS@->1?9QV%*R\ +MQ(C[E[8GY_K)"YCOI3'\F:<6I-88GYR#G\4MX&O/K^A*S1&;)U1'62[`V=U< +M/N%QD30XC_SZ816^/_KTG!9F4A-<Y1OE>O.?H<\!`T;RX:Y#=[HN$6"YWBPC +MGS#8%`U&'3Z<N>*_[_9#"@;]\$3-(=PMEWD8T6:S]WFJT-!U$BF;41L2FO=* +M$_:Q'97)D4/DNYWWK/86CEKR"F:T1*1FY%``*P?6Q&]XGEIAI\4E*\38G5^` +M1RG`Y[AN&+>P>!PJ](D882>BPW[T^=YFAG0@YMUKZ7?KG.4(/L(TR?-6P(P] +M"`ZYQO9Y:MPBK$6*+WZM$HU5.(PN_0`I9`L;#$(A2GCKEJ;*JN$K)#IS\>&< +M2R2S&&?S7RGH;K"=U.D^UWI-7"GXAX5J2K@G$\^J*=7Y`==V(]P/>5'?2!R" +MD2#+CO/\@M2GQ#[-$ED?EGS5QTW".L/JON`#X:N^U;GEW3.BZ0W]4)"1698) +M!(\D.P?N2GZ31(;I/6Z.P99;%_R]%L8N'Y+Q*!45#4#".*C\O&D;''ADPURW +M4/2Q<PT7N`^K/0W)6#I(S?$MY<$8Z4@5CF%4C<TVTY\I)=FH3!/I)]#>SF*L +MX`HZC;6C(9;WV0_7!'3U+(=H0;MTOM+X##[!M6(5>Q]8,JO._9G!JX@OI<!Y +M)&:F@(=A:@RE,Q'"\^=)(6%L%#+-K@KV0JGL64K$`('EVF</6Q+W\S#^W=#( +M&XE/EDOTN04)/H9TDFKOI(,/!D>U#&_13'&[O7X8,':OK)=4=_L2BDEQS1]M +M_*WRI7\9MZ7<1Q"!&5#LZ'UP39]@0%M2-#3=JLG`^<Y_R13?]84#K/I/_1'M +MS,6R<W9FE4L222NYP&I+$3D8KT]N%U4*HAOQ_>:Z?0AJ,1APPJN>#DAT=7>^ +M/DM".DCD?"^E[-2,:\)O[X2+(:Y484_0K7MP/BL/EO.[RYUC5T:5'`75/5I, +MKLV0T53+Y_H%(_U5L4"-'?]+#^-+N7\AB39&T#\U0@8?UVQ#O;_IG``G8:9. +M`<MY+\7Q@3R*$>NKXB1-\*S!_CC)T[9TK/`"61B$MKAB?,FA>`2YYVS(T/!E +M>YP`WXRQ;Q8DS1FGYZ>RKI[!<+H7PYM)IW]?SUH-48?>&U]+8!?N2J<6+E2; +M&Y2(V/LAEXM&6"?QXGE?E27EJEG?U2C^O38-?RUAX7H"<95<%H9%W/&>,W]K +M24\[9`2?95[G"J&UW.9_\OH!/W4I4I&AZ][4QX3`R0_SG4)+;]%JC+,X):.S +MEW*2<KUD#(.IYSBY)F:4#]=6?+C%B1`#N%%@`DJ[&@I*\K%VZ"D`>%,IV&X+ +M'SJJR26Y<+/?70W]?;`EOL^D_]9MHS!J1IQ1*]U#T.H2+3#?K-AE%!L+PLL& +M:=M&'T>>&_1<[Q6`RH/*6VAS6FZG8YHT?Z'^X/PB>7H#YI$-;07Q.E)Y'M[+ +MVYV/"U,SOG9;*L#86>U>`1O(RT^#+(!>P=CMFO7W1RNN$!<N")U)@G10>\!\ +M\G>N)8:X2>C57,V@B]4VX7%0RN!5.G;13T&2G(5[UGVW]@P,6SOS1DPW,RBT +MD8D.)<-@)L9;@QC3$GA)K%L<5&UOXRBX]U)LBN5W,5-*\D:WH8DK[N1R`FSO +MH;:>-=)$\K:E!/:Z?^=CV#[)O&M$M=9Y_C'+YL!>C<!9_Q_%[*A8S"\:4>9_ +M_1PQ7\_7C>V3&$$!QZ=@Z_*,$RA.A)6WY#[=3W9`L8?BN*#+A'.NE!H'U!F4 +MK66XD[.(Z8VC`$\T^BQW,F:7RU!_E);\!.]Z=ZY@D=WM6[]UY2M4/L%YK$WW +M_HV8PQ:\,0Q]QH:2O&L'5[G$E#4X7R.(W3K!'-W=UZ*#S[F*Q)F']&,(OJ"H +M[ST;GDFUADK`Q&!^4X9HE79AH.'AN%:GG4MX.O"3%SS%`L">;I`(+_:]CA0; +M#V8""B+1MOKGR$M$O%=-Z].Z=#2MET`9OSCI'U'9;,,>.H;DO^Z(OS5S?'$- +M&/=[&X=)AXL?1K.`X;&Y$<P9";FY__#:K5]EDA9O'VW]7!&3*GOJ!*W:"]DC +M!KTB34E51]XD6EG64'9!U3.R]^.VP;U%GCOW^H<]U7"-5OFF-:6)@O6'9:;% +M&Q4(V3%FNJ+.P(Q2/;052^-N7%]Y-TSMU9,H_![%0]+,E*ZL4QA]Q,CN/3^T +M5O[_=:-6:1LR>7-FM[VN6&ETA'8:PAA&R=9DE>IKTXT6NH;RV98>O/"0`@QA +M=3JC(D@I?!S,9J,.[-Z>R^)U+IHM=R7HK`0E/Y1IK-=&,%2KWFP4J+[>=@\4 +MU];.VJALJ&2^*0E@6_`=T@'_T.(,4V-Z-@C58S_)&83:VFQ]B;#P,(HU<)-I +M"E1W3GLX^%T8>EXR2X>3#0=3SI@_6:;6/@5]%U0I[J]OW*FW"^CO,5`<P`4) +MN9!=]APQ1Q24'KG5J`_A+@#0%7&^2VO;*7]>V78TH&#-$OZ+Y0VFG"Q</4^P +MX:Z)AJJ$+=GX6:D?DFM86=HNL^&*$T<2J!60$7.0++K(P-N353@-#[%MDA:M +MV5O>WFLC?3$L+]XU70C?"AKP>CG2C>%4T_`R6Z\!^/36L#[[B`^_;M=NX$<? +M.^<DW7B?E8GZVHY=0N=U>I[`%X"4;0M-%C-HGO!^:9I]2=X.Z3E$[N&">0LZ +M:PJ-@NF2*,!O5:+E.JI(SN[`TX*_,WE.CW9X;2Y\@_6(QM'B84SG07Y=?E/, +M[T)=">*-\<I)EV[$XYY2N_+^(9CNL#G_9"Q;:=<>1+C-=`'KJKP_2QHPT'>% +MV+B3`\M(0Z<\9`<I'FH#%3NU_9[Z(%G'AG&%^(NE*X`%Z=6!KB-^I3CPMC>L +M8;C%<]@+(=_^`\?6HL)N:"BSH'L:).0<K(TX6L7WFV^*;-<^6LN]1-J+M+/" +MI,XS@"":?TOI2V=$8'\9_-?MOF&U>^&KI%KA!#<D_(0;H:)/54%&(AJ-LV$Y +M;'=5<B[EQLW]:]3AL]`K4E%-MWF"\>@$FP[^F$AH(U%^_2JB>H1^V`</><Q3 +MJ-I/8<(ZU"30](CUC3F%]IL3M?;5R06F2'6NA)6KR,%_4ESK'B_M._YD(%E[ +MF^;6RK:'3/*VS3CGL<C**K*&R7@X;F(-ASQ`?6@9LMAD@5(((Y<6[.X3IC1< +MUW,W,B3^AOOU<W1INXW9+?F/+-8!2K"HM+,X+;I3E]FTDO@5@WP>7$]X$9CA +M"^?/K2R[EZ:;('!0O/]/)<D6&"MAQRJ[U;90B.5&Z@$)N2(6'BJ!!`^0B'5[ +MF^CIX7NAVAS)?<D4KAS\OU<8,S#S?;923`G4#C)9GA5F7X%\J`6^@S$3/N6# +MG/>L93Z3<!OL),X>PL!W(#EB9#\-&5=$])<$MMTTI%]Z"$/H<139'L=E]C_S +MXE6/VSYLV"#)0RJL>H>VGR2['WH*P",JC6D("PI(^>T27@D"*B`GYB(R"\OY +M.HOV^ZMR_@CQ_X"6TJG@5*!0U;&6^#"=]/UIU((6@N.\2OZ0_Q0(Q1!6@&7S +MZHLE^T_09?%6?1]>N%*C"#,".:L,5HG%T<]'/!_EB[("7"=]:Q*C'<+SV1,I +MVTB7,('?_R+2VNNMF"AYH"8R(-]I-:-N!O%3QO$%!^9/%H-Y*-H_SYJ1>PC' +M:+ZRM^PM70J5OS#W<BU??_CO@1R#FB#/^;**U;:+R`-`0+0RK^HOQ9G:*01X +M]KK4$1^ZD@5!U"`_)BMI99FA!#39Z^AC&U#B""D_3BU=<5-J*P7&U^S\.78Y +MS,S-6SXJ0\I,)SYWU[-8<KO?BJ^L)28(W'1[H_!WOLF@*>T=,!HN6?@.%J!` +M(:%3AM6G"J6K<G\QB7H466Z@1"*_?Y'-0T)XJ.`;24#R[SN=EF['311+2;^[ +M".I,C5D54UZ(5ZYC"TYM@:.2MTQUM&M8TE]MV5%)5HK*`=/"O%88J@=,6*@^ +MKR2E_01#,1FJ]ZO'$4SM(O!V;]TWD;%8##DL"N^Z3=V?$>-2S1Q@&8U;.I)% +M)_>%IK/T2_JR-1WKW3\YO?.;?""'8MZ%&*EX0OO)K6WW62:X\GQ$CS$E.S-I +M/"<W'`\-S>CBT(_\(E8J<8;=M3W`T=OT1^@X(I`(PW`=1;4'+021KOOV4P[# +MNEGT0$?E+E)V>^:U6"6#0E(XBRG^K#2?P(LRJA[XGGMNIJ)63Q`P5`UF](D` +M)%9</$\[:0^*W2W-#2%$G_8_C8W!K1_(AFT]/>L=`->.G,PT*G(?&?^)4_): +MY$=)7`!0H5R?PA?+N'<Y]@AM(4TFYU/<1S7&K68V0@OW6_Z,&!L)\+T!'LU< +MU'.K_#]0^7GK^+0M8^PQWP$"#)!=!"EO2D.G3/WM?<:[^<E\O)^1#25QWC`9 +M";RRA=^5&FR%-JG63O:A]Y7HJBK_L3-1WY_Z.\+..[FX.G15!B%7)2C"M^'_ +M7RWY=Z&%MX)/DB`>35G5^RL,]B\1@TMT]+9HSK2S=Q45[P,AB:\E.=,=<E]( +MPO`"*PS<C#MJKD3JABE6P:SZ*6&\Y]8>N"@&#_"1)+'(S_Q4OHT8ANDO+-]V +M,U!++H*9T,?JQ;*JZ"HJ-8^TWNE_#6*9],U[H&HP<?80F2NDO)NT!/C]Y<1" +M(DOR_]"/DE;0W)\DY+F$/2,PP.S<<18P#P&UHY-U&&WO`0M;)0*X939F5[!N +M0_SF86GXQ@\D##8:=_J\Z(&K-_QM0"&N`/!&KX:-V`!PSXJ\=V*CX,9FXQ0^ +M`2_5MHUB#LE5/(VR>E72LFBB-9K0H[M--$/M)*='92<`Z_BHUSFW8H&F6:.* +M;-K#"Y6KP$2^XGO\PW"#F`^!_<F3'`JT.Y/Z;RZ`VZC;TU(YK,6UM0L?IIIB +M)8-UL=EX7VB\]7+\'S38P4F_[)"D83C])!DUXA!@^_KA^Y73#H5V-7X;W[ZP +M)5^J9`^A`3T%J+1JZ[B"/3//2JYIFUB[V:D&N[2>QGBO]T>QL9WJ[08IOI@= +M&8#."@-ML?M[G''RZDS$RT"H5ZBO#/]O](Q?&/-83H!H0J?=UZ7HQ+6'0554 +MWUN5B>UUWMEH0/%;;F:V0IPI'"U`G);R.QN\I')G>;(R=0,GKEZ^-@,"/8%P +M+9J$3I#]?[@@[A'X/:94/!9M#"!/2JF4;@=44I4/`Z\\JQ'J5&RMD*]%%!R8 +M4V-(*8.COF$[[V&\UY#9`Y>E$PU/,ME*,=,*QZ35E#$&9JPZF>BF,,723&0$ +M;"$?^W;M>44=#;#`8'-N,/%!BS!=<D,>T4Z-Y_1>7-)'W+%V@37('\FS0]/\ +MA[FH"'#B%H92>-'LR=V11WJ$.:7;)\4"UW*TK2-`QY$=!<E)`7=.%#;(5'NA +M/M;@W['VP^2E,25'V+J"R9DXXW/40KE7A'.2H!N^AX1,TYO!6&*M?%<QB',_ +M]Z).*1Y1PO.I`?ZX:'-._ZSN*'\R0P7_=&2-=@G`[$/8Z*0G=9S@(Z=^8;Z@ +M:_`%H2(_E%9#_#$'8OUOU:L?6'8<*^^8^_4_X-R2#\-Q!"5Q1YM]473+<-`` +M%].;Q<G<$3=`'"H"^)Q3M_X4$367$FV7)/6EDHWM"*6LS:F$C-QI4&EY+6L[ +MW7_T0E)N!A+61XSN._.FTDD!#A.P;C!\)EM:PS;SINDE!]FEF]L3@W)%FQ-P +M@&I]6M^]MB(DWOR;U;H(%.E7%\".H(;E%O`\]A]J91VF[QATZ]G-5!)PX<7U +MG$3!E90!&%#Z5A*3.B-/UDOV+PIOSL>)M6(1UN_C`\'PZU^D[UN_VE6[[4Z# +M:X88KUR`6;`7>Q4<+-UP/Z6J'NBC"FP.+@F7#/^U^HC^/N]]'1PM+TZP#4:X +M//W"+SC`[F&'LZ/$Z7HJA2.8*+XR':0%Z/"[GFQ2,P<P5[.?EH)A%9`\)PL3 +M?M_/L;0.S((;T%#-L-OMRM\V;%/Q=R00/):A@N?2TP2-E'V38MN,82`UDZKG +MXM>_WTD7KHR,,#C<^\QK*J)<%]2]CP$.(X]V]UP2BK7"ANC\B$$@_"R/,S-! +M]VYQ9*,-O.C%\W'8:ABY)-TH$^.RH`)JU)S?3N6%U/`([:BP(./FU&Q;&IY/ +M[NENEJM8:M#$5IKD27+!+2\L@5A8'+)&#L1`_+$%VV[,EEN\P$_`K@"36+_H +MU:*O<>HG,.N&[C+AMTU'H\<GS8J^0I5N("(*A#?9^08D[/N`=54-U^5YMHZU +MEC!YLV]V_"!:+'M18"H7/D&$G!AI:W>W0Y?B]A"?8B,R7T^5<\R:-\66F^MJ +M*&H!Y8$"G>3"4-,:L;02)!-S2D9=CX5Q[RM,)N?CN3^BU.H3.+2JR)].YO+, +M+(/'NJMU1-?I9JE=B8`*?&IXNM,72PNT)>#/Z,;E:#3WT$Z6:=Z`J!_I?/(0 +M]9V@XLM<.E^8+3=4('ACEK!U'M%F^0GYS-6*'9W5F:$N#H=NW`$2]DA04LQI +M;8,8K4)L<.0ZG^H-*TH,5<G^5:>##\=]&P+!.B8X0Z-_XQ7.#?UI47(9C,%[ +MA+LF\K7_>B*<10HTQFCWDKN_BF3]RG%`AB[#(;#P;\'T/D.&M]3*,GI<0K*' +MB$]L6836;+`<1JZ$3A904*`#QN\7HZ>>"ZQJ2<&J"14&1?V\0&Y1/<Q`XP@4 +MP/@U.3^&F?_;1MWZ!>?*+H)C2:=HS/]=VBI)6G',<A!;OS-1%[)[E3X"W+UJ +M?`^CB*<<Z!BKH5?0/Y\8H>62&9/J96J^7D"0_J)^V%G7HR?9Z5Q$WO0%@<#- +M#E&^L2^`K+C8<,*3=(0,:/4?)&>\^:ZG1H)=5UT?LR.K(XW>`Q"9S<!A=7@% +M%)(6$FT`]EL4>O3<QI>:3A;_#IRLW0D[*VQNIHF,K@8S)_$0%!0)3$XQ2Y>B +M-E6(F1288-F3U#`&4=V\,30$&N0?35Y$'7XMFR*V%$Z<^;ES=.](2SN<X[8^ +M#E&I5A?C2OL1(8ID*Y+ZP];=HQWGSR7<+`3]Z/&GF_L5E^D>P@:($AQXCO.& +M!/_TW>2K.([#,<7]+E!`@T2*EL>ZJQ>A!8I4:5_:24IT+82Z32-9RD)+<H31 +M/%J!DK:M`ZX$@:Y4+B`6D$93(#&F.JJ[[1/DFO8=5S5(HLF3[B+0K92'92)* +MD9H^LH/ZH`KZ.1"Q*^P1I9RZQ5]K2#-%:24WTI3^^\NE;Y;F^-3SEWQ20GR; +MGUNPR%]1BX\PVG-N<0Z4<;/2CC[./$!YET_V_:&L9"P"&3>V_*7J4>.JMV*S +ME/)LA7JD,L=.`F:FGZKDM<^H.&Z1'1;(S3616<G9GKW/M&Z8'`)X85`=S/J+ +M:Q_3E+&8*]#<JH)ZX%^+:?V='59S&LHTS\@;>7MA!/L1J&#;<QM4OKSOMAXR +M^E9)9`MI=JDCT>PK$Y<J@?MU*%"3WK>=(J9K;5<B[.$U?$.Q+^#SW-XW,LLV +MFF2GD*N,JST,?4LC@6?DVO7\>P>9<%X>5)3%^&<J*9$:AN5"1J0C)G=6U5=3 +M8Z"<=2BVM9W:,OZF8G#8)LC\UBI[$V>+*,J"QDQ[!M'.K:PGF(/BPCA6D&@5 +M.0X;[[W)LU4GR#E:NW),0V`,7+\('H0I+Q:1BKI+0M8R,V';Y$C@B'?O;8Y: +M4UB%1821K].,>&+RUGQ9_8`"U4=OU)DJ@!Y,T,M[%1NDF30=6]I6[.PD/CDK +M^WD%9VB&&SLGV;J""W<OW>@"Y\L``:;^+]FS!<H!NGE9%_)X=IM+1%U:]NF. +MPWM[U4=N&QYPTU@5,`0B@J[O;?`72V3-Y.D34P2(S;>0ZD'H%S>2H>T%5CV4 +M!]XT@6VRLT)4^L`PP(-T(ZL.K(CB^7*@ZD[PXK#^-OP$R?G?S8@)`WGOFU11 +M^7$8M$?JI73Z(5R`H]AKKY[#C,%'M$1([I_5,;,A2<2S]P5^-<-(HY2OBQ)X +MN!IXN-\2:;:UT\,@.?-N)QP$-(Y9AUNQMCA\^:29>;:!W=><J19^*,@Y49[L +M5\_">$]NH3!)>TT/##T3_JZ"+E$1/P_6_O0=HX-630/XY='P%"(&`14J6AF% +MGK:%PSOT^QT7?-$)8I88]]3V6&IU3TS(VGL6X]>+=+\)'JH6#_0/RR&G#HW* +M:1-/(ERM'C_V0YME76ID,2@>_$>U\7]!V(#Z*21E_!JIM5Y0!3_,<\BK@**" +M*Q'"KZ:=FQ_O596<>8Q_QO0ZBBH5AU#9XT%34^)NC=2(]Y["AL_5._XH!I(7 +M4P)$)4KMHMCXTR;^.\21,"3A``=H(`>SNQOJV\S)_:G+LV/5E?B1T7^4BE;% +M>C7)_2'K]7)&P^S(9A+#IQ.$'!S_>B*#QJZM+CK"'*GISW:B"NCIA2.^Q38> +M?B=P29WVJA[8:/Q1PV\5++3[O3EY`&[J8F484]9A_%0<:BN^AD``Y/BOZ)TN +M:FD7UH?]7(D1"7*'3O-9T3R4YU*C_TGR"474I!25GUBCWFG-H<2C*4#_LBWD +MS+%M$YV,GK<??F^B/.?:QQXDE91GT8`PU4SCT!KI6>&N/_"-G-0]J1U:"PC^ +M#;O:VTO1FV;_I`FCD[[Y)OS.I&]_=^!VZ?REC3[<?8M`*F"K*$!L#3O6T]'? +MH&STD6WMZO\SV.Y8ZT_/]XM,PCW<BTX3(L,A^P[1N0'19G\H#(I8?O?)>V:! +MS(?3=VBJJ.#VA]ZZM&W-@-&M],EK-!/Q<<,O>;]+JCQJM?XM`,#AAEKN/U=B +M?P)M"YM,-/)*_J\J`-#9</*9]8T>*(2@3^ENI\>4&GGD;M=6K<Y3?W/@./77 +M[2&2R=24XE39`MPA!W;\UXC<E[CN+J\6TT0OVDX3,"0^8+G`WO55=O?W"ZZ1 +MK'+=NR1DE=I*;1@S%0)5^O6SVRO5$&.F:01]'D_T)!:RK_"_*D2LX`<D='C. +M,18WY7<N"S7@B)ZEY)+>T>?%CS6F^QRO[H>%@P\+4&46&0+GV#:\$.5Y]-M] +M1NPI!Y=_J0IE(IFOR2R5F%N]-(L.O4:I.[A[XBI$?ROV(2(2<Z)V-!?IQIZ; +MOSNN3,?+;.>A@U=[V"W>,<I%_&42J2%E1H#;6J6TA7X'J=VFKM$QAY)&)9QO +MMMD(X.$Q<`5,:>JS&^DG,$>\1.;>5!O.7-[5>J.W%!MW,MLVVW!Q-W4?;%3! +MFKEDZ^Z/-7M3U92D?Q,6R#,7&?):7@U.$\?L?N'D95*#>9;5Z>?3\S3M[IP< +M[CIW>H#J>R1THZ"#DZ4BD[RXRZ&`'=)>I''3H'&>)J/V38ZO@![E`#Y\Q3`/ +M8?&""YQ-W\_WVA\/2,N;"EWZ%@+M.E="/^4@MA-A-]:S[^\51_=W(RIF$U'` +MP:;_IEF!'9@DD,I=DQ:12)\IW+'DEQVS-U^<L?(_(.JT7Z$UZ"S\K.7W=T3R +MM)P=P]Z]J,,+0!RE[[P"N]V]L1^@^W6=<WHDX:;2$U[E]1P^:\_8?6'+X3@A +M;RG9C%<!C.=[;4"+CD20^8#:@R#9R&XBH*P!3\V-_J;Z38):7%XJ7R]\-DY" +M"&>I2,^S(9_&?,#<'!AX/1:MHTZ4-A[!BQ#'[ZJ!#:^FN68I0W$'?6%7;4-M +M#70$[1>M(GH1H#@5!7(T0K9:YR+!;YXB1L7U@`]#_FJ#VSQ4V(B;P<:;_B6S +M;IFS`IDW["P<L.Z`R6(R$+(Y3]LY6]YIEFNA#0U?L<2LD1AW=@H4_PZ.(.#) +MOAP$S=?G.(YTU:\>$/!,NT=.O::E"FD5FDR#1M!COT:P<+$*+++QTB'G7GD6 +M'U/%Y(GDVS!W$UR?SNNW1;IU>(5Q4A/$4Y9+D%]R&1"%>SI^BUVQ'#&BH$OV +M@!6C/V%_4Y2%8'Z?8"Q^V[''!73%ZYP8!!#A%KX:FC3=U,N=0OCW6*3N2;QQ +M4)#N;%C(S]$H;FH;,HC2/G]@5#D9\7->!N7:A_))IT=0L?Z@0XC"HK!\G$A\ +M[FC637[>>58'-D._P'<9L[GJ5Y34J8(:97FOU4KBO=CT;[R<_)N_WMBIUP'D +MGRSZ-T5J1G,452*$1S@NN-&"E'P2@DU-07L]^4;&QQTXT$<'D:`92N*,A+Q: +MB-P_[$4?_4M1Z[<BC,^/?J:$OOKN?Y0C3JK;AS7"R9M:P/)8DX!M6KM2/HQ3 +MW\M.!-U?P@<"P4?B^B@/>6=V:B@4BTZ(-7$GJYB/N%ODV!]A(DH0N-?Z^Q`' +M^:BWL!F5^%+,5.F]UYF,4#>SC:AVZBS>:>^1*.(PL-ET61GNOW<N67>R`H-^ +M`Q/,0R,.J;;QWY>DE`G#L+X_6>7:@1RGWF]W>X7H4`MM03?Z`,R*D7;`Z?]+ +M0K-:&@0",>!&%J@6`K1*:FGIL6ND?W9(DD81DFJ$4,^Y^$]G]!-@``.68[C2 +M3JR_J\46;T@HESTBCMI2'V7=D(=,RQN&M?.VF'<!`S$M3N3,-@2_;M5#?<E\ +MF!ZSMU^`L-_]`[$[C;50"/.$=L1!ELKN:+U9ROTC1IU3/[S9/ZCO,+.-/KQQ +M.?"\P;E$*?M+16>!SZNJIQ+\+IYNB>KU+RXC,EM0&+MH-,[7AN!\QRY[F3`& +M5SGHPE_\Q^HI%"8<DKO?H\C>$/O`Z?UY=VA*<;&S=4BW!/HN1=%\D]!A-:,< +M9=\G85>,1)XZD)A!;?2U-PJA"KHOXJM_5$]!NA+5_LM1TL`OXQ,4=\^)PZNS +M^4?X*D9;9.UK8FE*Y538!$LA#;36>4*/U1;YI.WOF84XM5_IC,7/[_[X)QN% +MA%*EQB(9?&..T$_@NU@@4K+/\,?2-(IQ[OKO]UQA#8(6B(D/C$<.DC\5.J/F +M4!O<Q9,MP+4V1^$#(HL.SI>\=XH3;GOM7Q].;JU<F9^X)*R%V[VN^UFBL*!( +MWUGU>D+$(2-43PHUAXP]+&`)HZMW=QG]_7[ZS]/-\S=QF_>9F:1EFN3L')0J +M;>_0;P(\\#,T0_,]/=A$DHAJ=GISK1OW(^73E1=S'5:0*\[C/\N%.4".?4,( +MI^!<2\5=U;P$;[;$6B#".KFP9G]$+X[7O[7#Z[4PCLB!5'U[-^\'E:5\U_5^ +M0632ALPGQ5PVSM+WZ3[_69-452)P_K7#<_/MC6S`Q<?@CG;YY'RD^`+7_WO> +M,4NS_9DGRY=WD."2JJM4GEG.*8-?NRW3M).P9M(2I)"M&$BP9T+M"-BZF>A. +MQ!'4;:'6T?R^PA'V#<3TRP,_*\7XII^\7+Z/-;#]M$%Y^(L%LE`Q-\).1?RV +MIHX7U7ZFM])29'!CM:(IL'%-AO9/5FQ`H:<+QAE]MDP*Z4$5<RM@KR8HU#/- +ME_UM1>^#E\QB5G)J@E$A@>L<8N+7>]<#MH"?2S5F.PB?BT8GR]1E;5"B1^1' +MJA7,R!^!FK$J>5L[V4.6`9X_E^-/WAK%`/H4[G][)W'J%ZZ7.LLI7$=W2GQ9 +MX5A!&HGISC'`W`9'WQ86ZMJN#-5?H(XKC\MCBY_9?_P`3RXXXU*6NK@N)38S +M_SRV1QI.YU(J59V?R^P\^.$Y?'G_NM),AT\EUD(X-)86&GW/=%5YO=-=_<\P +M_RQP:HEQ:UY\%+A4(41(ZTB5@/H3K#99;T;HKK^'SXA<%"\^N;")W`>>1*1L +M,YB")RF]XW-H2^%@_A"&V_870#:R(=R'TOG!W.U3=/T/>VR94)_54B-X0_., +MTH.*9)_J`<-E#CJC2B8_&!.MQNI)\H,S5!A9=,J'E:U2QI@*JF_!8&FB@YPJ +M6"OPH*2/(IH.8E:*XA80SO?5O\1-('`/DWI2U<44P+#[BDXJ5=YIZOZ#**KE +M^T6'OX!%/:7VXX.N\VY&'44$-I[[935J-C4E=ZEW[^@*D2^J(Q)?M!`]WB)( +MDL^/8QUH%6T)ILON24OFL?X)EGZ'.E67.L.99_;,-:#'`\K4$RF:#HPJ0F*` +MV6#N]TV\\3QS@FQP'.#<JSWN`]T3GQ_A]]PWM+UC_JE.FU]-)6V/OIWLKX)_ +MT5]J!AXB05T$0+#%HY288\//6TLFNY*XS.9X:=9#FPYUDV&J%6R:"WN:0824 +M<R>^9GHI7FVKQ!%%Z.,KUH%R*I_B8/ML5IP7$QNZBJ%V@>>VS=5`&G#XO1O$ +MYF0%:^'F!L-]RZ#&"9HP=B3-P*^=9HWZLYB9#JJ]Q>=G/Y4=F0OGRLR4;!#4 +M?;K)X!W1`9--EJJ=#EV)_B$[5^L<'L61A1(E!.Y`++_)]8"=\*869A-1ML/" +MQ)-^[0=:FDM/1@:DS/<+V@B0$W:C^E!H(*-<^'X,:K9T>O/[YE6AM`\SZ1'- +M4.M62VC$#$Y%<4\ET'%AXWJ[;240FOPP$4QH4QB*^S:MXREMB.+YON8CHTTA +M(EU&A0^UE%QN9@B[[D<]$Z@$0*Y]F<.&X^XI`?@CJV*S168U%")+W&GC+.M3 +MG9AYO:@5>XC\]0F[`F[".ZBH`CLDGF3W1P,T.$!^QR57F_LS\`%QC6HN1^9A +M*5R/CRVR..!L7,(WPB;233<4KG=IY+N=4^Y1;M*V@!H&V_XD%74A*R"<.+;5 +M;1-J'$R5I7F0'9!#CSAW5ON,3)@!(GX`+H\W%9N0(O2$IE0U9<T/QQJB&:Y0 +M_J+[="?VY.'/1E#'557K<AE1*9*\*`S(`/R(<?+K:UN?IGDY-4FIV&E\#%=! +M3S^[M,'[Y$2WJKTYTWW,R_VM?YAHDYPL_A1^D@`[>]FOL(9'$3)?ZQE(`'0A +M,3T6(OW"-'Y8/6VF+7DXF4W9>]Q8E;*KV/0+J=`DCM"JB@+JW*-)WC1-8OJK +MXIVM4,&>R@+Y`?069AN+?_T69_/:9"7/>7H?"[Z+25%&3OBP%8@=EM##Q0JE +MH_&=/[%'W?QF!^!U3!;GD58G7=GG+/1<`JUTF-*;WXUV0/KE3_F*(OA>K@[N +MZ[CC4?5\!9\8TNV&P2+[S8A802E.>TNNKXL"6H\AH$3H(L^H;<I0(2-QV-J\ +MYZ\:]\.IHZ-2'J_!R_6I/F?_L`C)P-&N/#FHV1V&L@)&_MJ0QF%_2#2=EJ<" +M5%3`'F,4.-HS]1NC3P7UCB`8MG9#E<=/)KR\HUYT:C/K>>6)HKJW`I>>H(OF +M[0:]\40#L*Q.HN>?";;@?=G?RRR^1=A$60A%3/T7M\K\B!S&>PJQ5^`<^G.H +MANZSE?6,?!V_B"9R)ET^.2V&ZH\&'QVR):-K]+_U&'4/OR^$MOW[C$>KO@G, +M5D*HT%&677]^1>$ECH1]K0T"-(^V5I6BBX(S[DF\8J'JUL\HI?BX@/-1LL0" +M.`ZZIK(FI-CDU7;E2]]>H%A)K[G'+84=I)-%YO^=O/)G/XF`-K-P;_$`^6#R +M$7'T"FCN9LL?)^V)./L(FL>+5^1`'X6`7=J-1*>R$XICS\0=:@8Z_@KU6DS@ +M627U5HANIF*2F(QY".P2<_V*B3HD=.5H->K3GP/;=?TDX*%RL;F_9B^:`3A/ +M"SL9^&X_RN=80=U=;]!=\&ZM@?Z>J@0%'[JV%+(+P>Q2_&F3.;O4JG^5BZ!: +M[?B,/"G%>;HKU+QLFTC>;-!)*F217Q&A1#4OO'QI1M2N#">1!\H7D"=80._. +M%R*<;,L^XEK*7[)#@H)*'SP90H54V-J5C0^&:GF[X+AZXNB#\U[`%X;C;E=; +MNLN;,)BY#$-[#JV8C1!XM,_:VV%D,UZIVP+KW&R0):_YV5#K4%>RHT80:!CV +MIO5Z!@4VHL>^BVG5BPAE+OU.\<1U@+3'8=P#US)2S87L.#2P/.G^S1@U&76$ +M9>O6$H2WQW&9F>&(UL&-@">&F`V.R^AO;\CDS?IT\ZI(.9MI.+K@NZ.H)T74 +M98=UYTS0UE&S@7J7HKCJQ-]90C9>&?9<$\$''+-OSG9U9&25-QROY<ZSBE9< +MS`!58-O?`"5#@8T%EL>H40@9)HQC2)VF]/%G:I_V1D,!"`+R2D4_Y%HNVE:K +M2>Q_C)5(N%'*G_+HRI77W^B'M@G31EH3!TA#\NTYO7SS&W4<]04'.F<*X4OH +ML/,Y?SH7N!&6/%\*ORC3'3N6Q"U<LHE?Y^,9+PR0Y)NR`:"#]3Z_D%.>PGMW +MXSYX?1@R=JO(-WZX##N&8#G$U@MS,!/^/]<6!E*.A8B7_,FR48"S%8=@#_VX +ML^;$>9R>5NOI+EP_OY"<1[/29#P]"#U[\94U>\)L_'LZB"NUQ60#%L;%T^AZ +MA"A-%+J?X+3GBF/T2---^/-T+,`%Z:L3<EQ'NLG9&&)O<KIF`6/$A*'L8"0( +M\<+\8$6!9B06L*4"NTU1%Y#(V/QEQ]_'PT&AM4+>931@P)C5Z/!W+T;@-B*O +MF12%@J."HQ(]_+D/&KN:/\2`>CEN/0^T`^9O"DG(8+D9%9K&.M_7L$[GUX6: +M='$[].JP85;R:(@G/Q(P6W#A(FH"4QQ+'TRBE-2O(0$P5M-JO@>)OE7?F\PH +M%B(TB!&BDL.;<$6O<P<A.13Z4N5V%%KOZP%AW]$^>/EY,($Y)OW=?ZF(R+2; +M+:GY_.9`@!TB4/"8&*5;XH8Z4<E$H;F!=N$,^WPE/-/+N;/,#*9+-GJRGL4( +M-&V&UNQ9\I0X)[!;WW#<RN/I#R;S\^!<\WL3<&&5J''E#^A.H8HMN%>V78"V +MR,L9RF.?_DW"9+PS4V/U(%?0>`#X,HI\52VDP14S<22$7K'_2AB%WH6J>*/( +M*J(NZ+V?V\GTLBG>H8R,NN0^_P>;!6/:_Y.:+;#[$>WY9QMON.*<7O!_2C>W +ML+*D`,H4EF,19RMH?O4'NH&G)#0+[&J-RQEKDJ<F/<;LO>]QFQ:&;CMVZ6I! +M`V5()ZF%)64-MT6J-,)TA=](MCCCAO"DM43[(HVQG;::ZH)L4=877E]#"81S +M8U/9?9I`70"(?"R\G!+W#2\AM'`\R2&W:^!%>4_:?4\%3XUW\YPKQ1O3!-1Y +M/>(0?M=.S+^197Z(X&A;)3H(2%KDL>)AG]SA;V<F(Z!&4`YA/(E0O:6T;"_' +MD4@YU)B)O$X5/6GI!V[6T3FMHXEJ%Q7UHX>Z@QI9G8OP*K_.\L.0V@P$!_>\ +M0XF2G1DA-3F:^&PA8;MROQ+CK^$+RBKNL`ED/M)B/A]"Y#\,Q"B0SAM%ML'0 +M\+16"SHUL/6</IBLC^2WIL21CN<GC3X?\A0]]8;5U!C]]T3:#4OZD@[X)J+8 +M;(`<=1#XGORBXGXS[JBB]+Y1GKJV1YIV^I[VOAE[?Z3?'?%:!4",XX_HT_VS +MG\P3QZ>>E$3@EQ,RXD?3YZ((33_3,MA_=5><QD#L%.DYK`.PPW(T&F5;9W6= +MN+\F%OF*)9O-61^"-C@IT]>X^Z.XHCS-W[!^&ZKKT[C<A>O30W>ZR`=EJK7Z +MKAGS>$(M*2ZH.,IE6WU5,R&?18]J/^SY1<(V;E[-,FOON9`@9K=!L(C^XD5S +M!`@Q=MI3YY@A1WY,-DUTIEU0T(,P<]@!_/<N9^_F@@I<K;UR6D:C#%JVN*I6 +MO_-:/)S>;.)`#?-?.Z;?>76!T"ZSWTEM0L!>R,XEZ]FQ;E-N?HXMR:,9<@3_ +MJ;OIO4:3V=]D2@)AK`84\:Q@+C[/"X*T%=<_&L^9#@?3\-#2,.Q6'`2T_$RE +M!.+KM6@2+B>N5RNT77I76>Q#WA>&.8F]FO]W00*]UM#2E6GVP%RT:;IJ^Z,P +M"=3N16=16]%?'!L[6_XBO0O\5:SZEL5[A,_6'TX,&MM'S\6?R5D`DGTWP*J7 +MWITR_K8G3$;19+-3][^&[P!^L`YPJ&IU/93NS<A7JVB4A8C^96]UCG*_-K). +M(\Q?A44M8:_ZX`X>FH0:V^J@H`@DU\F^@C&)LD">SX4$(.`3W9S3FDRRD6LY +MHS^^E'"MY'?5Z^GV-FBQ(EKG78CD$%/(="T@'!`#TYK_V@96&ME%=(PC/.^A +M4]A1Q<*786?MV=#2##KF#_#?M0JF=01H$<>B0O;IN`I%BKN"!S&GQNT35S5+ +M(E.C8+1;:P]9CLQ]]!11QM[MR8IH+64P/4;EX$U9G7CVY3;-7%(3<:F=OO_J +M2?#H=#9YN@2+.)^:3!*;.&<'BE;LB9[QE3]Y;\U78")WJH"L5YRSE2]X4P=S +M^`_@'#A98%;9#JWQL&)Y<?)N<5W=S"D"%$/#[(?0EI?6L"P4?"<W96E5.S*R +MT%BK:H38QJF')U"-$QS*@):.NYK"2*!7NA<BJ_OT!;PP@;0EC%UE:B7CU_W( +MU9YB%_#V9<4[M.`Z@B3>^:`N'O&;/U#1XALUYJAT#IANWL.2=[+-C?<`GU6@ +M)]`)QK_G8GT&`DVR8]CT2#O`&`2[[>H,:2@4YUT?[BB.3(B/%4".FW'>I:Z0 +M-29S,@H(36V0M\GT^/QP/BV#%:V3V_C1T62MWZ]45IVE/4GT/H..9%Z@5QXY +M7N+*.ZAV@<>D\FCA0;!E',%"T:STJDC,J=!3NU`@AW0LP6J\X2G>QW!!CY]! +MJ/WK"H%9:0,DXTC2*T"C-<(0HX/2E2,O*/0V,^FF?'%M#V9]3O"*3KRLQVK- +M4!F#T(-";'M\_DQ8_/CRG(/"*G@!K*5DZ?:UJVM4;4EF%U$@CA@'W4TM?T9C +MJWY.M`TK4X/\%%QX<"G$;:!+7<**<G;.=J-5*D8&S(Z$L<67;N%EU[_Y/0;B +M\+J!FJ/?\"JKLJ/HGL,$VP#MS^N4.(7^9:5S&B12[+3GPO)/V]MYNF#6=OV_ +MV7MYR'%[I+0<`;4(<-#/D4)P[REG,5>LP^$;DU67M[3BZAGQZ,)907'B<JO> +M5(6'`_8GL;=N&X'3?KM+N+H[K7&R<3/Z!,W5LM2+'6*$72P,%>ZWXF-]=34N +M!7^Q,[8D]$_LCBR.M:$NFY;7V;BF#=W7=V/LO):XETK;#7W)=HK%1<7F&2:: +M]49@I<.,I65Q$$(I>;AE5C$T0^+G<N4[`X_`X<\KZC21%^E(SZ;8%6'8++Q3 +M1D)I)0AQ&1GXU=W0H]AZ]0#O,#M>DKGR%>/W<8/O%D$6SQ^>B3BC)>DA@&8G +M!40]F%X0O.8F+MJ<U8=W0BJ3O`V'4,[=8QEANZP<BN43O>RQYCWW>\@Y<#WR +MB.<4?U,UBM'J;I[6-_5_3(0/ZB`9%)SZ3'[IG0/+#$E/W&4MNKK2'-.>U57L +M68B%KFF_AC]\FLP^CXS/RX%8A<CA/E-EZ$VZ`/.HS"KE!-IQ-./,-OHAID84 +M7K-6PWM?'=G3ANCQN)5]DUH.>!5LE@NYDTY$W_/EK78!A#IHO)*1+:U*"G1C +M9KS-4:;_%7=<QWOGE/Q-G,^8TS=^Y^.FKVH1Z\21-M?<!FO^3Z53]UJM`U/- +M=R4KX'PET7+5FM7U2P<B!HIJ^W&3#H]W.#/9`QXX>5YG)"PP[.U8O1+.A06/ +M@DW+(8?>3ON3H-#+`2L)3"0YIGE8_\`O28II_R)."QMMWOTU+[A:>V)`/__- +MK5$60W]A0KH^A?O^1;3R+0*('_*K2'8K&0YN8=%&&+)UVE=Q3!M3;2G5ZF2+ +M3=D-1^3_AP?OOV0BRE#:CM\+I)6DUCEO@_,;PF@CWUVCZ`AX@"Q)Z3$4^>P` +M@B-^9?_@3Z<\C>`H,`BU-R(I01BJ-YM=C2VWA-A`]IEG=@9]K>>QMOQU7"U( +MY%X+_AH,`-64[R7>BY'CK&RYZT)[2`$Y6C23)^>\[^^56+N+-[+L1VI&["V\ +M$),@R?#EA(>2W?)5S0M4-<B*Q:W36<C"S?AQDH3S\A``P<P^LN)<9*TJ-NYK +M<K<'MZC7Z\`]Z#8XH(A/;O,F6-D*UX@028P)C<%!6?QE0@G#9;X_(!(6UX&0 +MP\,J3,2BE0U041JPR#["U9#G@6&,2MSQ$;QHXL"0LJJ;@!6/YU_\2E#9*KN7 +MO8EW[43W3GQ;K#:.)X47`WY0P0@L0GS_$1-K%+!GE00L.&;31OSXHJ(\>)M! +M?!0SPMB1.;"'DU=*5[BF3SZ"%(*")/S(9X?8F4^YP;7-`]U$'.6.W*I'A?AP +M8T:):]1#7S4V14S/:(HDC?%=38I_*XBG^`/_A8[@!4Q@&&<__Z98LH%@J^F! +M</A14`Q#X\Q<2Z+7CXX"605C\X@(P\PD[I01[9&`>.3E+`FQ+\UOR9BSJQB= +MSAU^#[TBF#9+?9G_,KY"BC1`;X6&S;M'>6:GV1NUY"HPBL)W87`YDL[GOHJZ +M:V1&,W%+^EM7-3[D8`>;50T+;H'G_-G\@(1T#KX0L_['4J"KU9_"^H;K/B&) +M2/_[*&!L@M_^0UW%</%XA^9^Q]J8,$<_H-<KR41]Z"U36I?-05%5$;C99$UR +M6;4=[!7]$1:K1&A-2$Q%WSH1>`FJ`ZI-YWQ"\B&!D+O7*XK!P\V66C$LLK@8 +M45\3(F&^')XSG>%\3NTF[&6;5`/,]5,]_O%:A9<`^JEM:38I^GJ+RL<@EK8Q +M)^P9?^.J9CV7SJV@=S)"T+^7`F%V^OC?(03Q=5YYD'H:8/5M$.FQ)($]XLC+ +M46D'?\#)FM1*6`Y)NSFR;*L/72=TFT(\X45/<%$B7V2-GX%7$#*JOYN0]?4- +MUM&&FA^B5Y#I$?92;7SVP`W<;[X.FV';'&=4$Z,^!@":442X"10L)1_333Z; +MWI"DJ5AR!DLIUQ\JY)6@26IZXAE)JK_U'OR[`-Z;[NAM%H!4"V>?-+#!CKX8 +M$`)"O#*";=E3%'?^/8KK\S6Z0]57'(3&6BY!6)E@[^M.5PGX1K2O7A@Z.1@O +MBGL+6^Y0L*$5>!$^<IL8I9QHT,:/5$D-B@)1S0%N>-*>`$DL^92K7N!*S8;+ +M*#"E#HR?@APHF6@6:XK#)RDMC!,U%2?S\BQV4*+-],_*K/':0:DANDE;\6,2 +M+Q8%&+$9@:!KDBW%,W=2RPLPU%3M/O?R7"ZYDD`CGGKL^NO+%+#R@&>OF3-Z +M#]!J!AWF[SN1<4/!>&_Y/.)[".%ZGDO0X81NZ8$U1D/,?:M?OKXKQ,;P@#0A +M1)SIYA_WW.AEY=N1W54O0S0DWI?3Y$-*:HZT`,=22`:F6Y@&8J;6;'!]E34J +MR[)4-E$0:3ZS5=L6G';-R7QG@#OA2%WS+B:#,`<?&RPRRTDJ2N)O5ND'*_5T +M'Z0E3F6OK@C+^U:42T(OPN1"0@$_NFCF*+O@4YVZ_,&5=)N3PBT>JB*C,2V^ +MX,J*@NSE7A*>[H,X*<X,TFN30"53KK9_E5$(BM@5GH'#;@($Q/5)A[)^I;2% +M&T8FTY?U'JC&Z1E)$7*/]D/3WG(U'UC'U:V61-JL)MS9'";K7@0N\VMXGP#5 +M&M3Y:M")0BJ=\>01AQ19)J"D#Z[/4V!1.["(Y"N,BQESY:YAF:19V9[?<[JL +MYLAN^K0*45LM_K\-\Y2[N+*?`BQWUZNO3%S<.F7Q7[Z;8#2B26EE*$%W=%UN +MG+2)-:XR7?MJU.$Y/78);.[%C6;MBP?/D%6)FX#19;N)$`,NS3HX08]:6^[E +M5AHZ`</,*`IPHZQ442ZV6[Q&^[.RJ9MRP\B'_IP<"FN-)51R']=D6O/:=]SB +M=AEU\/U+;C9T4L6-.'LTK=_$-I3G&RR@QFX-@2!N^*$4>UOENI,/&CW2F3WR +MP=;43CEDU93=X=Z(#[TL@KTGF1Z:PN1@\*30S,";XRVY)HT:;B4?U^O8UM84 +M'$B:9"F2'A,&K)_F(RKUQ"LL#)RW3U!%NK0OV:4@SWAAM?BAAY8^J>),1T^W +M\@FYQ5BPRC$(%J,L:091[E'%(E<@DV*IKX8V*Q;/@8CGO7"BDR.A/5W=K)KF +MW@&43HU9!SN&O^PN7SQ"!GS>>N1-!)Y/3/0Y9*D*@-$#]=F,8HVLXWH';TFF +M;7=ZOSEC]ZD@JQUU#&=%HRQIXT"'%8<;OQB<!*O;Y*`@KS]UGMHMTWL/!J04 +M;_>P0#2>NX?ZU4';$MS!N:>SY%6I1N_L$)6MTN!?"HVU&*R:`E_)+<UYC`1C +M@[,27<>E%.L!*L,R'&NSW-*LED'6]OBVG4]0?(E+9+AV8"PJWBT"7G@0:Z)W +MY0%<G)666\BG0U>P7CZFS:#!!,,L*9GF:7E-[TC2'$FATP50:S*Q"8FEU.K: +MN?^/QFO2=SP24;_>#K\5TB$:2'P?`+..7%OSV(97*RO;<$33CZ7G>5XI?>!< +M/)E\ME'=.8+9EJ&@NPY^K5(>L_,FL$GKYJA&]:$VD+<$TX9^5B7R_P+\PK\K +M.3"V-$GD5'#:T;44[\/#Z<')+R1+',]_YQ8*/5_<PVC0VCZ1:N('*>`Q?YVB +M,93%@3(;B/O^K&9?]L'"O'?]A7#=]4QVQ*NC=/ZU$Z5Z*W>15!*?6K;WY1:L +MB$;][N'Q3W([>\ZI)?5`7.>C@`DQ\;MC:7>K4AVCQ,/2E7U>5\J0_EMTX.OE +M-`'I.US0\-7&@G`28;Y8-&UO+)D:ABA`%33-L.DRG28YN<`>=RZX$1-SA:9K +M:H%4V7JI8_^?D5:AG;/>/#7\_!H-'B&//C;`?+LQ3KW`>QU\6HF2PLX5UO15 +M*U5-A;*),38(:FEYY5V+L=@\RJ_0O\\#]ZK]-(3JT<'?P,`3GYG)US\2>B/( +MI6>NE`M^D<WP1@H$-%O](E:B&A2^I1VUN;)'"A?XH(-@*(VHI+#3<]O&)U%I +MGV8PELMMG[%9_1P.$I^_3':BD$6VN<$BQA"9NK'>0V+P4Y-E%UVE]52U9W*? +M#JJ_YHP8\H<O$'W7TPMMP`+6P.0\`D)/).&#%?379.M_X_IT@VK,8@4E#E4? +M3;%44I(A=S,LTLR'FY\MG,05PIQXV!"^@U7YWP(X57V"#>PPU<IGG-\HVTN3 +MFPS'G[`VACK4$<63G-UH=#@CN`Q"Q^/NBYLIH+Q%]#P[(-]L`-MG*<C"K(;< +M9&&/L%C^["4X<C6`P4\207&56Y+U*BILLN::H@IYM[-?!2D"DC$/OBA7ZZXQ +MR"5DSC%'W4&7CZ3?%<2XOGE+H\&-G@=QXC<0C#XO)P2!L`Z.(%?15J1VQSXU +M%%TQJ2^C3ZZ7/A&@0G(<OV!($"I['5"IZS.?\/'/80,]*SO%GO@BV[FV/"_) +M2DI1YG9:^2(P,X/8?D0C/!@FMH@?"X1W+#4M(_//$"K+Y?Y*09HAE#=C(=5V +M*+NZ^M<1!J5/'P-!+:'$/8(__F&S>MI+:<V.OQ#5(;<C^)^`T)):;!*XT!S- +ML=N2/=)$X[:[J,;A;><$+,\(C&Y-*UJ"Y5M0B:)^)_17$P9GSAN2GHSU"WW- +MX4N?@RN<$78R2G7^FZZBAJJ^,>>1$R_J_!"UM?,V,EV,:8!,C(X^^YOR)[^\ +MLS0S@?WM'[VYK%<>PV?#8T!&"!_;&1TXB#H#T;Q+@F@-FM\_`N>K#_1YP0EU +M^:)U7S854`T1U.O9.XV^PR_2[@CGJ:_OB\>=C$PO?<IN.?R_,CMWMF4)D`$M +MWQ<@*=HD[6#>Y9I(8:4,R$EE.R_'?W@E_T+Y`#8+28@"$1@/<X<H%/YY2)W& +MRK*1FT3_96X]Q424L]Y:I35;%IH^GYR,N&(;K.FMAXZ@-EU5)/@P;,Q*=,NC +MFNM1(C&`.?G=H^$Z"%PSO,QS-]/S?TA23=N^DR&`!C6[*)E(^5,<JD9%_K=I +M;*:LD?14+%DE`WA>OFWTIU#Q_KXF$$EU9]3GT^+-C\@UL^(J3=?':"5195;> +M\ZMG?,/RBL+L,86UGAORQS`EIHY.#]F==@&Q+E>8"QW92T((@"!)+&00.-*D +M&1"P4#+TKF&(TJO$/`;]?9,JO:JWOB/Q@T;X'7JNQVSF0@4\VY__UV_:'N6K +M]Z`"/(E?NF,U0?HMMC4B9*].2;@QF%_X!_U7599\$3;`T%O=H2%.?:4^N,A. +M,=L/:D=RU/+N\<R/(-7\X"*+YLZ<08A"QF:+BK]?>"`_YB2.5.:1/WFL[W,9 +M_X;S/WH5I?&YO*]=X&F(>A44+FOL+B#RC4C4,XLXY\!_<M#;>@@^YH<9<PSR +M8"2U/`Y2!<0*(C*97X_)EJ!Z'MSF.5%)";`8&SDZW%%,XF@KY0N:M>,@PKJF +M^?;V9(!2[`463E3/-H%#_$1NG[__?/!CXK,9:K;ON80;<*4*)"[3J=PLEY7" +MHD5*S\ML'[F)D08R)SI]EM8$+I_QVK7%O'\._B$6E11F#\YRN9U:,HR*1,&$ +MP6?RX,S;8Y+7SK&_(7&24^QRG'X2%+(=2AX;Q<!C8WO2IN"<"L[O)*M27'K? +MIL4=82E%L/</$1RTX5CZD+GTUJCJ18LT;!<QK?G$LBQ5RKEXIRWZJRDN[^'G +M.^K"P)JWW_.J)A5XZ+/!L\6N$8QU9$$T4X@;SR,OQ8-CXM,;<\[IMLA$[4GE +M$5,'IW;$AP9P0D21XC4,<,8/&^%%`U3FF@9@3DI@>HWU_G4]5<!KF8H[Q@#[ +MLL7+DK-@3)JS(I_8+!9U0TBV;/VC?V>>`'$G!7@5+H]6O%ML;*NI!G=,;10Y +M8QQ&R-B,5Y*M+1(:7.IF9.V"Z5-C2,`JV_RV"MX6"<648CW(D^D)6T5RV,Z3 +MA1O5I(T<JX!F&[Z$]#<N%&QC[Y_[BZL<L1//)#>;B"@8E!"[U79LI?#Z>=4] +MMK1MMH<7\7*1LK/4\LTGM*,&O_BX:6<+\Y3!^RS:4-__XST>BH+^T[<>([3B +MWW#7#4O3TME1FZ=>(;8TIFR:\ML#JKAEH<.+S=2Q"%=YOUAU!;PDKY8:J3A^ +MVT4&R#=B-L8T,Y(3,?7Q;IFZ6*=IP\VZ,/)]'F^F5:F"!IFL9?O,TYUBWDS( +M-DST0:&#H-NNA`S`>)2X_'TR;D%^A:&@#CUZ!K@9F+N&$,,T5!05G)213O5! +MA:W']F#4^0FW1<>9WQ.!2G$'&L4IGEW9["W7.[)M-&,"^`4,RCI4$&:B1;N: +M_CT8@$7K]9D'5)1Z>9_X$CN6<OO\*#O;%U!OR(U3O6J?VJ1Y,5.27F2I1H,\ +MQP?WBO=8[TE6%E*-$<UAX&.B'4(0+7@6M8<!Z>^)QH@TO`[4?(P4;F?6ML'N +M%"__6A5]BSC'9:U=*FMZ?`O%8A.54VLLBF2\'/%+ACA./)27KTX^@GXY\;>6 +M3L`1*/Q$F1/=J(1?"E\94P#H'K]=H.Q4MPA/Z[MM_J'U]YO+[Q,T:DQ3XX;M +M_;7(;&%^Y=-1PB#L/H@P<?]=B$1F[-8BX`7::'UI4M(KKTGR6WRMV*<@Y<3, +M\N23S,X"C?\+`T4U,R"?*\A_PGVO7EH^VJ*-O-&W!D8IZF6ZWA(<L:X;/$#H +MDI8)%[GW5P'_<SBNQOFWR]NATG!WZQ&>>RG)HYR*YE];'OY0VA1K95OY3OJD +MTBR/<XR>CDT(R,#S0%N8SD+$B'HB#F"NY^_]P]9.,^RK!Y*:3YR2KGRW8D99 +M;96\,%FCGNPC?R!.C4W_1?(-4XZ%(F+Q[:QHZYP@N8-@''M;KQM&+^$86^19 +M0+PQKJ14$14P>$I09N6`XNEO1)%B$<=FYMDI/7(K_BC*CB<.V2M6#E<%)K6O +M.^S[J1J^\#])"5VU=]O3L[6Z#5^ZPN@H]*TO=*H!$J@@U-+V*V^K?4*:^IY? +MXT>'0=3(WO:;+$"WC)0$/6NFGL&T5UH?IYREZ;><SKF>"1(#C9^VAQ.%+P6^ +M*__732YEV]8,4J83<"*%]CMV%='[C5J*FZ*C+-,L""V/F0:R76E/1:'B:[AD +M.2``C(B#&%^CK9(M/,+CVO(`@=K%:8RFG7=F*0M4:12>T#>*7H,O<P?1UG>A +M?`QQ`%W[;.L\B&Z)H)E!K^]0]G1E'K6+P'X/,>,Z*U3,`.21F-$22SB&W((0 +M-;L4`F+0<FIZL@4\@S4I18M=J5B@/K2^%R!UQVW_'XH@3:O[IDG(@QO"HT,T +M";Q/<[KBR&"IT%12^KS\Y",4=(U-6K63NJ/"WIDV\-,0JYNK]R4!"H[;U!8< +MF@54ST96!(&^F]#UK5+GD](S!L8R0`KZ6;&L>Y68KTF;_8Y#?+=/_@I5,0+3 +M$.9J?Q;X\]X>51*?DYQK<"PLKDF6!8ABVZ4%UH"O76B7!^95P@HHAC>#7B:Y +M)8N')LX*#J8@1#U790"B81-A09F#MFV1[!:!-5Y=&;5^>0G6^T/IU+JMTCIN +M&519.M&<$#,W1C#"RF23]-*UR%Z\C;9-=DBP5&6H'*A?H]A@Z;X_O:./_?@8 +M=65H+BR+%1`5C48FB*,+"K6'WQNF^4A;)I7"<I0"FL[[:OK0T>29&:JRCB5[ +MW>IX7:3EWE?$M#ZM14*1NK`/?9#F<*&ZT\"!A]N"$J#%;]'^X8]R(0+MN$O' +MVWBE8@HLI!Y"CXV7<=+H`4BG)TZ7!28H"X?\(D%C,'1[+H%OMZVZ_U%$LS1I +MAC'G%KC(*U?H#,Z(?P_5X0A&UN%V%`"*6N_!R="0R=@!2($CU&YV142TV4%% +M'=-T)2TF?@!*;#\Q8&]^]?.3"O>NBJ09.$%$8@KY6=VN@5;2RY3CUUM(7OF# +MS9.G6JEAPA%!"9"#[N".Z)33R=Q>!7!Q*Q7V)2\:-,!/C!S?L`W;3NOJR,6; +M),^%'6N_%U,;P\F`LZ;'<OM$(G:.X[Z$KR\*YNG>R\Q\$828E#S5UV'F>;VX +MYH$\$52,_&XW^?6`G@.=E!+Q';<2T:VQ;'C:,_W&"[)+_W!]DV6Q-G<'87I" +MQI/A9F&/K&]=L'[\16+'L,\24%"(SXQRGNODAZ-D6FZZ7BVC:$C#R)TO5`R_ +MWAD0"QT^ZN2N%XP!FW"&"'G\C2&0U"THR-2/RG)*#T/J&<-;8G/&]TUE@M_Y +M*CXQ?^-N$`P/F66\4S_BM^Q+1H/5>9UQT5^ON3C4S9@L+Z\&&N/QP]5[!#LS +MC]6NEJ*2X-S=:"A5Z5)GO3ZO]F;*?OX)I7U<#^(97*5#WT6RE?.AWZF@5>GE +MXW9=N]WK!D2T?.<>*_EKKH(,"EN5H1GI:?C@\H.9)S9(WC:PP^$W:DP#7VV4 +M'I"L/)&&V&9VV)R8>K#>!Z`0PLTLKBL_<\S"&88TFZL(_/`1>%."\B&NZ0TW +MN.2>`I.V5QS1BR7I`4$MNV,[:D7L*C4`+@B!<FT8-BY3,9^O6VAG1?QH2]+9 +M$OLDZ)@AD5A?7![+_QL_,RB`V)IQ.KNE:&8B^,C=$1,I*=/BP)K)EUX*.O#_ +MDO(D%AL@9F^8RWZ!\,*HBTJIE4IKP2%M8;4D-8Z$ZG60BQ:;^'V>T)]L_D1G +M1^\)-E1J0U@&`UH06W-G4@ZS#[S<AY=4W)#*=K=L31<;*"+5496":E;-&2)6 +ML;R'A*E2?:B@J?L<!^D'+C`WQI<IYJQT"53PVU.S.?!\7SPXTI?/O$28CP,R +M#O`;U7OE0;\`RK!)G'YP"@7.Z/"3$EW(?\]%HG:%PFDQC^FZE56.]^E+VKZG +M-/0!(XBK[L156Z*5&[WF=FTJ3R""&1\=_)16&+UCWMG([YJ_"_9^7*S?%O<M +MUH;L\Y0),]'R3JYJJ5;?B)HZ8];QJ8DR]FE_2UDPX%+BHIM8X%`9JAAPP5`, +M98I(3W;:NXI[R[B-!]HX`AE@O&S7GC`0THLB0G:ZQ?G2D?_CRO:.\.0.;],W +M$:@](V+W`W`?^Z"LD:Q=.E<\PV9I;JFF<XJ4K=9U(1*1L6&^G$:Z/[S\T'T+ +M>2HLZE6C$C9,`+L/"IM>>=Q#4TD7SZ@%%S<.KIWPD*&$UDE3A#-F[+*2$_2; +M)42>:R;5UP+%9*=/@)QGOMZJE*-=/[OQD0S47",^%Z@A!FU75FUD1^0;>C^% +M0JK<D*%_6)K;!$)&$^B6Q#!T.FA/7C3;.>9(@QYA'D'S5&G&[]]B-*F7A/\! +M1!'58,]V!3EA]]DZ2#VIVY?JEA=_#YIR=Z+[`F1EL;M)W0L*A/(YN9+EE)ED +MXC3:-S:0&(-_0`N^=F%MD_28@<YYQ'X-O>^'/,<KDPWD!)M(<Q1/3)5#&Z9V +ML/Z4$$_H//#DPS.@4$]'<KM<B\J"'\"AE<PUAN2M-LE+0^YU+7#^Y<:5JA:D +MS1/C0)KM>7I\3L=\3OC1)ZR:Z17DA>$-$K1!%0']E]1**"#B&49Z\5.)VL;7 +M%IOQCGJBQ#1V,F=^".0RYO`.7WR>N6@:HCA9;"\_72"!!+2`>5*YXRYY%>?P +M?+YAI"1*ZA6O*!4+]:W-,)NI:M&"_@`R!(_PD&T2N)\QHSRBI'M@EKEQZRJI +MCZ4II.(.C/2]U8(A)P!6@N%^`D(G])ZB/1AORKD-O6?OMIB#G8>`I?,P*-*= +MT+<?S[4U@Q,C.PE\:B?---+=Y>-]OE72`[_6DK?>YCI2#83SS_*+->^\@@). +M8H/?:*SD+WH&UP6?9M7+=JKZ3ZKB3/UDWN(_,T?>'4$%XQE<L5'M/9'W]MYZ +MI-/<CM"*I6?Y\BESL=;H.*%HIM8,F)*^O#@G>7]^*EHORRA",XMO1C4CR\-[ +M/P"O!U-AABK@:(>;4C[9YS9^F<-:>X^ZHR_1*]'AR:(D:;)^?W20Z,1Z#BHQ +M$]H#I%S+5/BB)KA6O,-U#P\R)%LD/Z,!*XJ_62@&PI\6=ZX<2<7C0DA'-L./ +MC0FE*Z%\%"8:9"T+9$[J6+WK3>DWQL^R$#MG?`@'I"?^:B\;7&0-GY%Y'H<^ +M*(46K6^>_-F>\,GO%M@Z$6)<7KZ5&*.G!_`=@9<"@>\^A$62"$`%FK%#1RMM +MF>4K3?:#124VKLN,G@H0*_C)*4:#9808B4AT`;!KO5`@+"G>P@:.<MC&W*9= +M$]]06BOA8O?3,*0C9F9,MZ*!@SJL8UE#Q0Q@+1#[0]"`28`^1@IL#[@RO'!( +M+Y1"78?,8J]4*#_B,UR[`RVDJ0Y09.O:T!K/3@7^\"H?9D._W+I+6YE*PT=! +MRV)I+PEZ?JFJDUA^!_JHQ^P0UQ<AC=QV<HL"G-<["`&IQ`V1.M[.?HT80'Y' +M?4VH(M0*$8G<8\EUA5F(.<^8Y2"D-V,F\TF=N2C/$</JUO*ZJQ',R$:DE32? +MAH\#B>$Y\LMY&L^<2J09>WS56-\IPFCJ$*]"P@HI!''E5DOI(<6&[&T%DTD7 +M.M9`'?SKAKRZ4Q2G2)S<>1V0XFT;:-)-.&="FT9&Y.62N<6=W^@F[!PUE9&Z +MC#ZBR(AOMAN@SU"0&$CO_T;-$D+.O$LZ)YDWC+QH,@#F8R34:@FWZ:"8VX9Q +M(TIZ;7_0P&6$X">456IW24Z4FQ-*`%.;L4!UEX74R.:O?KCN?D+\0XM628Y: +MDTD`U<PWCLFJI=N]R+'RKYH;7WJ,PR],888'.XN6ZO@4MUN"7.UF-]AM@`OG +MLS-'YZ=3(P3R]@=B9>)RW89I3X^PL\,LZ7>B=UO:,,'-J5H56N`)H@O?5E/I +ME?>$J35&N;1$S\!@(,#*6_LNP`^N4*082TS3G\!"0L*3EEE-`,_72V$.TCH: +M$O>5]/TF*I-6A_1ZK_B.]\26AN\]4>F".8Q04+*QGF92S1#!4)_$C#TX)J!) +MYGG]*!M0J9,)K3XJA/YJ]H?G6!>/\$_ST?TZ;%\6;-CPS0_N;Z.F"N^7*H(, +MUK6%T(Y',/=ONZ9KJ5SFJ0HPSBH>>]28:T:PET`5?Y?<:_+#/?10I1Z;.-BM +MR')Y>@425M/U56/`Z7Y&[/K'O0`E#*>Y*/X":6ZY5Y-1%?"JL%HYDWX'?`D_ +M2+`S?AX&7L0T63)U/\9P%&10Y;^-9KZ/KU"N[-2:EPMIO(+:WQNB<V)A$7H3 +MT,YA0^F?XRT<AK[\NX06A[*`IB-^EBYP[*GT&8F^9O3FZIE,)@'^#K;P485W +MW&0(TWEXJI6.*WTW`QO+0>PLF2N,3(PYQ6<"D;6!Z(CBZC>H>I$5`0ZK^>#? +M.E<T*^TC@/[.^2T+#7EXF3F)MG!+=Y]KZ%49:=%5IB8#'V)D$]7\616.?$EW +M".D=FR9P/P755^&)GOKS(/2X;9?*<@E+[B@>PR/RKH^2_6\:[6!13EGEFY2[ +M:-_C]$NZ253#^#G)/T^)[HS1GR`5M%JKKN0?$WZ4E.53PC\L'.LXU2RB")F% +MCG.B$PM[,*M7S6-`[:=O.NU5^WGKP#F5Y)'VVL/3K7]F_D&<DRBJ/I$MGLK[ +M0A%]Z(E8O.VOT\E',"L^Z(6-Z5YG(DU7CG%`3'C+\OZS%#"AU;B@6#]@'O<0 +M@L=W`CAY14>X2;QKP%.42-T2PT5T&-"I?MDL_8T-66HU!0*_)HY#K6=DJ2:= +MWK&A+S_T33_OR<5\<B3:0D/$VC#@05S\[*/>K\[VI9Q++7W9N]+'Y)'&)K#M +M9:"TDI66Q^SGQK@0$0BZ(_ZO-X>K1C1=%VDCGU)\:(ZK5\;6<(!IT[D8BA%F +MDB_:8U8`,3EBD.&-PNRO/[W+>.)H`6$N$.L\JD6!X7/*0@!LJ5PJ`K6=7ND] +M[H.GW.C%,`-`<Z3Q>3H?&+F=.;R[JTQN]?/1`89SY/^9;2H/CO]U\@YS"GY6 +M(CG`*3@S2AL0K+5&:V=%+5>2*!Q'+A!`K/8T*L%TK$)I$_?\:AT0/8TJD&_5 +M65.:O3?XY=.42Z8`/@WS\`]9I;K1B*LX?2Y)P#??A%S04OX@%0H>K1=H%!"Z +MN42EPOM:74KG@C7+C6HX'?PU;(A/5&I5T]:H13_'FM6?&F;_WFEP`9$1)1FL +MR<'6BRV5T%Q4R!$INA=!OS<"RL.8_&V@H/%#I`<!&?8?#`@GAZE"\"XD6X.I +M$WL[H$;+BL)__\MA.PDEAJ3*@_7%I4F3A?RR?I$3`WN"74"-$OR$!G.<RLFY +M.=Y_^OC?$`UAJ+EI51".($,HJ(>A1<=>*^OCAUJY'*.D0I[^B@^.UT:CC0"[ +M@<9`D<@W!F./AH1MQI3M<(HF2!$[<_Y<ZQN'2NL:A:W)M=S@"'""S0I803?( +M[?SV<(Q?W_=!EHT=&6J\J,@\H2%S'Y5:8=8TP1FS)MC86V:;Y,WN9EE>!"6W +MNFNG:8:N;2=(%ZMASVGQPV%`!SJA'/6UH-#J$SR=N)$/J$8FN_G6J$FV[2@L +M5V0#C:8\6^=+Z0_PR"/']]S*;:M)S[W3U7[!E__V#UO\V3?\:$[]"?\Y4(\; +M(21)2&/_Q#E\5Y'(!(:>YY*%R0MXF"P5Y8LF.HZ=D;0(`S43;!@RA\L@U,V- +M+Y;HL!;47!4GCTQH5[VN!9ZXB_<SMAY+Q5N&$G[AM-2*<6;29]DA0<4B&J9( +M`A?7J3`/79LL!#P<J<3EUK_]Z#&TP<OR?@\:&M0!72AHFWO7CHGS?[-&)(%- +MV:S-IVU5F,$\Q#%"Y!+''50*0+;/5A=9AEEF:_PV@/*5/KH;]'844<HV@Q39 +M?R8G`_-,8DG50XF8$H=5Q;!9,7ZK62G8*/RW+ZQW1<P%YFR^%P"G)N+098J; +MS8F]01II'H-2UZWN`VV1WT#@=>1ISP@D6L2V\(<^-LSK9\&D'_T9HK-5C&MZ +M:0"6WR0-A-&-IZ"WA!36]KS`M9P+4_*Y2$=H;&2.H+_9L*/ERLZ'Y.5V_I\( +MXX,'_W?M?"KK/D2I4(9#&V$\F%MIXU-[VF!\%?-8J&FE_KQ4F'_+%"1D@!$@ +M\\R:7^\EFLQT6=L9H&J1GPB%YM#8.CQNDT<8*W[T37%)FQ;R;O,/<7(VP09& +MOP*9-%#:)4JTE#R-OU['`C#STU85H>LDRP-46A11$DBBN-60"/JJJET!*4E^ +M]KGW<W8;]=<C*D2&?.&-/M*%`!%QFEQJ]4<WY^M)?DR26V8)"[*JR-3Y/"T^ +MCTG<J8\;@T%4$D)&9$<F4E3_,IQ,N=L78-PGS@Q]-JJUMTU#-S8\D<^;6L`U +M</FI_3V/J1A$@R"??/[&CU3R#J&C+4@HV)1I<M^TA,\)U^RN))6;WUB:<S%8 +M=LP"74D)5CP7JCV1/9M&QIP@)<2<FE3?D&*3V`7!AXQB96;6^*`]_#4U*K=M +MP`3'6-E*:*S.#6Q=PX&L)FB^_:6XH&$;3FMX0?3^SHG82F=FRY<G(A7PNA^T +M*[R%=_FU]FDE@M=9W*E:>#O8XBF=`<4`76@.JQOZ"JL=E48+4@97=!_XLRTO +M:B<$<60X^^,8\#\1]=J&5HJ34N29L%6:#@>035V/,]YJ5<*;L-M+.5'JZI,* +M5!G<B\9P"R)\#C9V+&D@]ZU/*[QW"DI__#J\W>9NBJ7T,(N.LI8U>ET7RGL, +M15HZ>'2+/SN<>D26(,W3YZ\+3\KH:&!FV0N#868U(WSOB23/;[FZB#?H!9V$ +MK;TA%=S"RI@@]9K,;=G8F%DH:5N8,`TF>$ZCTKKBXU=[!>A;UZPCK<J!:A]T +M(*]RD%SQ'=GA9NWV'?ZN]2=2UV&CLWX>;PV=7MJS"56\A6B19+!G`C;2Y6B\ +M*IYRNIU;Q2)EO\'V5/(QRWW?;D0*[Q5?AZN<AA+E+WY\BA?`$A9ML/,G%<[U +MJ@(XV9?#LEK<[((Y>X?!M9+SWC(TSE%V5TW[K#SW+DQV'4;.&$/A3M[3&$RE +M(M="'OBZQO@<4N6-ZU4U.V4V@<%4H#7J#?1[E+LZH2"L!T\;4!=P.[UO_63\ +MZ,;H7Y4O((<;D+)H_\@'))].R("9\N@,^G63YGYG7/(WU]R*DI"ZU?ZYVNX& +M76@U)/^/9NB7A"9W?!RW!QZ^D8=1U/!8#/HH159WS8?88'YLS;%>00;LO8DX +M,'S1\;.+;-2^%0)Q`4UO:;\]&K,D(E+9"".H(X7]_V?4+LD_@MTP?P<QDBB7 +M9N1ZYC&]+FW7JY:CZ->LL<T&[AR9>,A72B+$+0BP>:0A;;XT/_D'P-?D)\=L +M7Z)L@;<%`PA7QS)!R^B'1"(\/L%L:%JR20Y+!^)VXMSVB'*=(8IE%1Z[&]4' +M>3R,0M]%QFR^=<<[\^4>WQW>.R3`+$4"JKB`5+Q4/R,>2`4;<T3(C1%LN&$8 +M^6G+*>U.N'C<PL']#B+=A69*_PUGX2VH'NVBA2+CM:%6Q[B3>CDD+A;!YHL- +M,;WP!.Z!H0M^^<I4""ECE@T>?4Q,KV3%%WZB$34B:LL05"X8G2&`<$Y[<X[/ +MGS0+U-,?'#<A%0VD6S?&6:C:GU$2T/M13"&H-48T!4'9]-"A'[TY*>NS!DS# +M$`HDR0[1&*;-N3.$Z8B/02HRVES+5*GI)@F\>KV0U-F8]6@X;4NH(1[=?.>J +MR@M5]S_ST@^JK0J4R)#\\Q*?B+CLMP3G-7S/F,,S&'&T`(D`E=M6\C/^]_I< +MT/YLT._K'932#OZI0W>^3AL.B3V05X8U[@!3+-HO-LJ>JX^4+A]$[T7<HH!Z +M_J-CW9B0&.!&L7]FW@2>J@UK!\PN<%A_I-G:5)=]YOOJZGXT5A&V:&/<!D5J +MH;<M'9>=UWF_`Y&`C[^[1&:`466X[5<CI?N0&@7)2"=G-)<O%X+L/?C8@IT^ +M+7ULC=^F!>3OWN1"?[MU0S]3$LS#Q?\`(V[V(V\XCK;K;>+E5]N:-3'&WDI5 +MUG^(%"`0S9_UYLL"KZY[=P/[N^]S0]#);$*SD/1R#''HH]=D9;2,K0P%(^OX +M\A52.Z)0</<<#P(RH9O%]5]ILI;#JWK9V+:QA=NJ\W.$$NV$;3I"J/3\<QXK +M%MH?09[P&6R\J>#_1/M)FDPT:';4@F%+4-PUZU(-8&L^?WOPHS2THT*$8X1[ +M$^;.@F>A"`YYS?'WL&J2>8KJ3^"B`6CGULOPA'+Z;$Q:;^W*4R=UI8[W,!P) +M?D@G[>'.?6:?-22+3]S:<WZ=7XM*^(4CU@DR&LC.DUZ3-B64+<B_+R-%TL<U +M7L@1^"A0[,Z[T83A]'V"_U/BE^R`K+.`6W+OA[%ON/!N/@0^0UH.4:S#@P>X +M5NZ3G5;ZZ2KAXG0_(]^)10%;TP$XBD;L30[--QOT+63L9G9J7).HC3M_]S7R +M1)@3$.OBL<J3_R.,J1?6_^,WE)<0Q]4C1M)V#J`M,JP.G(?8+G4;6SI/<NA& +MW6<T)U^AAY^2DE5;A7_4M0L;]HR6K<W]UJSF0'7]GZ?!^ECQ5"=%<4XP#P+] +MF*HMBDIPW-D!G"(I(H:AIT[V^!NOUE(-P\*%M)7HRCUE+J"I4?7<#%8?D,AZ +M(ZF-\?^$KL["#0/.7EQ08DYRMR:B,MKU)I*)UN03':M]>'_Y58<"0O=0M121 +M8)=!7#<%ULN%@IG#>)5V4`J93,M:GC12R]."ZON9$BL<4DB0'CA9L[P8N3`L +MR`2!*=-'``E$T:QD&:CAW]2T<\X')^F7CJJ&P:D7PP9P$Z5T13-;=GU8L_6U +M^+T4)@+A`L*_:H,TBP/66W/#1WU0>MY_U679HTVX$R;:3H]8L*EA*P(9)C*. +MB_V3&?<_;+V-@'37J_O.J]?A&TM^/15Y.R+\IG):BJC)["PXTYC#9A>0G=-' +M.)07C_?`A>\6%\GV$FN[:'!#E^,<BG:=A(`!!,"[>RTY2J`&?3(!A3D4(,1] +ME:&07(M)B'5_(#XV*$?*H]EC421LX`:5KL-,`:(,%2ASM>L]K-Y5';RQL;Y1 +MD7*FO.)U`?`8_BH*Q52,Z?A:LH9D*1%">L)1,M4S=2"MKM$=W6@,5*)W,``S +MCI,#9\/>:T)"T(BG>?O0KFYS;0VD,@L-';6?J#2\",Y\A?$@3:(Z!N2#<,AA +M/@9\N9IUG#MM/V)O)B@A\"MLJZHFU6^2N_2X\=TB?Y@8?2=%[J"6.YL23<$F +M:Q'5)-I,DV53?H&M(*^43(-^Z`97TH%C%+(0A@H!X?3%+D8V"(60%+GR-S4I +M6^-5PZI*LX<B%[SM01S1@79O`1&V&RH*0ET(VK=59+=)31/U,_>,'E/UZ'26 +MP\/^N(*>%H7A/T]2'=T'#CAZ.*FJ^_$M`3%^A51(B75,,\$M!'7WISF8L4E7 +MWA.^?\87*T=OWX=;HM;69I^B,!V/TUETXLPM**F\*V#0F$&6Y@-/<Y6`V6M3 +M3!A:B=,#V)=_2NY+94Y"95_&1PHKG7T<+S):?I:+=96B584_>4ITI$V$$)8) +M;!$W+;M42NG<K_6.)H#%BOV5=_)V:JJ&\.FS+`.^T&]G%LIYX3TG(J1@UKT3 +M9LA%^WL:-!)9,9IDJ)>UPQ^`>^[/6[WD+[%I_2P1>NMB&U:<CDN)H,K`=_>, +MLD-V/)KESF@7A=S?/\W`>0O;K,Z)>V_U>':><#1\348VB^H>&=HCV,QZ$=?O +MW4=O]6=4L+]^?/9AO@G#4[4L3@NHMT'-$9+ZXF6FX[Z'K<5O!>_*,P\#IJ<P +M.@RF/!,RB-@65$!P1TS/[S?]8'^:#^Q8Y2F89.PK8-8-SZ%Q_4(E/B[S5&V0 +M%P0_>^PWS>SUX4&YE((-U<32M@N)UZZOP(*Q3[]["2_(&.'UC0)DCN1>-9*= +MNC<2(N?`&V?]6\!V:42G-ECE6^.-S%;1UU&BST/N9PGO"%IK`\E$[#8/8-"" +M"U1.Y,1#\9ZT-WLA+5S^3CKK'.1XL)!F9FF9.89"`ZR"+2-[+%K9/P*7]=EO +MHK3="C%Y*_0+Q94PC\;^0ZLR_,*?YB]QITD75:U_87QA.E=$CU\Y[E=+A[I# +MU:Q1?X]GXX^G;F(-\9/CQ%Q`5+$-8$>JV53#JJZ1TRJ)\\\%-P)086P%FS&D +MB8,,44A80IF(H;*,91K1GV//N/^OFZ:M$D]2]POV83JMF)F+[F65^#S+E\?I +MWGP5TT1,5_F>G!*&_/]/GZ:7$*N=@?#LYR?2WCE6:%-U&;,?ICF3G%#/W@O+ +M"<^!)K5A7DKBT=!DQSFPN@MLO/RD?"]K]Q,RS7F$34V+]IF:H-%P$U2%4IH& +M7D0\V43)\A>;\<OR_QLR7>=Q:.*Q=G2U9D5/K=L%:%1>J:Q%(?6"KR0&7C#L +M![P$",-2!,G;.5'6?<:KNDMEVI.S3[:\0@Y.4ACP/R)T<*RXK^#RI(7'F4L+ +M[GX+<`J.H;T8\]RKU"48CJ2D\).A^+"ED=L[X8-_9782R-2`5KP>$P7-%]&! +M\T;T'#`8&\A]DG8=<I,L[FJ]C"-W4MEH#$V";!&_(["Q5+G2'V`O1SK(/=M9 +MB6]BI,F%C_=]W8@^7989R83'H5M,IXUD9)[M,%0AID["^EDW8H,?0PMYMNKF +M9?]D76D@_6RAZM*$TK+=K;3&ZR61U3"WPG\Z9\DQ.&8NTL!IT9%$`__RT#`& +ML'+'2"_B(2M1"M?'+.AJ/V\B<"%4&DZ7D\[AY_(B;WL,V,+YU?C8AD=LFV&T +M9X2?D4PF(HWR*KX1IKJZXYEU>SY`NUKL\J]U7Q!-,<*F//-R_SM2;_<@.<7_ +M*FZ2&SKH-,[%!,4[N=7P=K^52YT^>YGIN%.*6;P`RE%KC$_O<I2A8RIOO2(] +M^7FZ40@^QYVF'U>AMB_]"D%0M[%?,0\3#+S?4JT=(GZ&4(]R;`"43.#FA(SO +M'RB`=$M;(SA-E;=NX:"$=Z'?@$=K6+R;P]?3C;E!F"CG>;QE.F.CTX`^A\8U +M!N<892+U)>;VCB^>V[X)<%+9.`'$F?L!&C7-HY'1`"A;B3C:K<TCL^/:&><4 +MPKZ2\_X5#6R8Z$CLO,>JWM0?D?BUZ]<=#S>K_7+R.VL$`]ZQ]$[',(U4&+&0 +M!.68,6XN`Z=;JB6+/IF<7MID]XB^VK`,4MZ$W);[(1\[KG0_`\9;5@*503J5 +M+,\J&+=Y+U^""QX$R'@Q<$-N:3_QT4@QT-6/5H[[N;/N_M/#D<+!XWC1`_A9 +M^&V.9,:T>J]K+7AD=MG\)+.I9Y5ZTL9,F+IF_2'>&PBEAJF\]O>H8?.VR(N5 +MM$DR?]_YYOK-<E<^VH>7W+,EA<UV*\6#G;P(*20!??Q/?5AM^WE%5*#_/80R +M%1-PA_H9A,_J5(]%3/=`_7SC(`'(43/%O;N[<SQ+%OT>(\TMS^!%/N*^''5^ +M4SA8N2BNZ)M"54;X[]%!,7RLF&/SPA[`:OMWY,.D23X7Y%`X-M+1(G52W)8P +MNS_@,5_5STS:Q&3H>UMFO?B%*$-RV/:,&79<YK#;-B\ABA@YWH9!<%1V$*Z@ +M]^P!]]/8D-B<XIA:FA[VB3(,/+_E:_/5$8]T^.13\L80CLLAB@<+AG>=W]HZ +MS)C\.NR\..&=QQ/*B,1WOGG$(N%`9+EF:?I'C>3H9?X.(T=*A`74C0&@PTG. +MK7=0)YH25LLT0$)W+/,4!'5'BR>C'14X-CBA[;V6&GPC-77L.$@YP@ANBXY: +MQI'*Y8]X"'`V1:_CW?$,NES!6P]Y8;DIH`HACX`H/ZHB@*>Q+;T48L54@/)) +M)_,_A>UI7B%I2N3M;`!6;Y/+"6'O\[%]UWCNI[R,%PP.@44Z5.FCM$(R)$GK +M2(#S`P%45GG1?8=A*Q=_*R]GGEY,,=AN`PX'Q18NRC+_N];('.T3>896HEKJ +MAVA_1[5_6I`17.2*9#UY<8H1<1.1448WL$<75,^<ADTD&X[\W;R.Q2W%BLC0 +MJM8R]W58J%-<K^?Z5,@Q?K(`\8&A#RC5&&!DD0,'@S66L-E&%9YKTV[&EQ9: +M4?YOJ][]Z+8S+)'V;!*QRYRRIL@56,QV$GH/@LN=?.>3A,&^\[YHN'2!;7]) +M$4:ZE5[08MJG/+,7K54?XZ*Z_HOW3ZV?6#4_E1B!$[S+/JR,R@-ZJ`5SW8#` +M@RKR3@(#M7()*D[>(<>*VCK(MB.XF>HA_@T9<_+NA$?1J\=:E:G:O$XT;S[& +M2=E)+`7*1J7BF0C3I;KM_>$C/F(CG6N=5+"1->FG&DPX!.Y-[)/M>M^8[J4S +MYMOU>L^6GKEQ<C,W//3CA>I?@M>6$XATT320RWZJTH5:(_'&/`@)FLTV&K^Z +M]MG[-YR\C<TU7$<8H1=8.[8Y$._BTXNQRX#;45QQA97Y;LDDV72)G2@A<DM- +M,G6S73=-!:\]K*Q4[X+6_(@VR#2%.A_VF.OE>_E-^J+=5TR;D*>;_KM9Y()] +M\5QXO;W(/ED88M=-40YA+2Y_P)#^]G1X#7A90H?`ERN?ZDEX,=%\N90"3<C0 +M0PHL`C,LL>N&.7+F#FC;D1:1&Z9$I`?31WOD3GAZJ"V\P!9T4.=^0!J1?6/A +M)W+T1,_9M=Y8Q;>WNF\XK*+Z!)QBX;82./SR;HU!3OY;J0*.GC')<\U""(`Y +M0QUIZ5D,`X71Z6WDN-Z-37"V2"1][WO-69SDE(@_,FV)GD;TDQDKJHJJ-I0* +MO-%3K8J"E]E]7X0K7V02:^G6XJ<Y..K())CX9PISC0Y/&L_SE(C,__M:7<H! +MW_Z#A7*Y)BP"3"8&V(+N>P%3"S>)S[3PZER7`*R+<%;J*0^\1^,Q*MW2F.,+ +MLI2*\`EU4-"NDJ3HD:<EF6C$Q.NIR-<+K'U1+1Y$MT?[M9.\9L,&5+MEE=*% +M[F6"U<I@8:E8R^1+0O@3M8R_27BO`Y-'L\I>;=I'8A`9@QM_6$_=F4B]=(6P +MKL*K203L?2'MT;,R.1.\'J-;O[W^"<EEM^.5!UV[SK+.*_`KA<7SR_?/BV?Z +M^K;R"N*9+_2#%CR^C08DT7P]*;("0,LT7%WJJIO*R3F1;$6<7O5I[DFO(E-L +MWJ:OTBWP*B`@>$B2"GT?'4_%L>M)^+,SS8Q7)W9$%)L?PY\1$6S&]&2"D>LY +M#TB7<WR`K&2_]*J]_G)QR&WZC\&OW[JHB_*`L8?Y>S3UFN*]&F/)@U(:O9HC +M]E,$H37.^2]>]@SN=7SG0>83N(Q=ZO==I.",RJ-&42R82!EO&#A-$)NQ#%). +M:R;UM(.RCZ*@*S;/L\^">:+ML\)<BT$G_S+N2IAE=`:QD^5",\Z&/AY.QA[_ +MY8"$@^/5=?GS.+U?+COWY[].F^3Q\<W^"SU+__!.ZQR54,0(FC!?NLJ\X2/V +M6K$!%$7+8TIM^+:%OH&7=]V>\C&3+MS*NR0R?"+G`,;GCM<R:#&\*^,&$4.@ +MZFIAV]69HBI#)#-:FPL@MJGRTJ/._)F)Q<#,OG`PE/,A`_;A(SE[@I7G^VS[ +M&SFTW]:C(_)Y#3/*7%:&DYRHC77B1<X$JTJNC#M';H=6(SP?`T0]YI@QO;N` +M[]5]D8A]?Y\'\!$+`$]+ZTR.>>+:8CT0@7N'H)(A<G$-(6C!57%ZPQKMH#9* +M@85<]44]L!T=:T5S1\RRVC[US76@=$$C91Z@0C#H5=-_A<LWDI.V@F$%&:XM +M>8J9?XUQ1W2APUN+FV4),2RJ5LJBW#I=SCNU)N!RO=N%U@G[I`ZS)O8<D;CX +M=S[&3*,;L]X]YNU;>_=ZM<E%&XE%A)^"M^HRC>7)2KX;TNRE1C[>%^WO7'3F +MRR]/Y=`4HK.2+%K'EKA#FX&,SM>&E8^1#1]$&96G$2DV%FJ5/ER4'Z+9>_EY +MU#'..66*7B7-M6TE!J[5.S=%$TIBU-#/,:,YQ:-F#5Q26Y&8NC?60"`A2P9X +M<0<CRNL%0W`0[I2$/C/@>;M.(FSH?\Z5N#`)M39VG8:6FW0OBRQ\(Q/O7"QK +M/)[0)K1-2O+NX8>S]NM\3&<P-?P^:];;F+DP$NBB"3RCK>RFZ4%D8S!!K,I) +MC'Q!M-VPT:XZ94*GZ,V#6>?)2L"T=(=GQW//0@C4_NL[EI,C$/:*M+S%8YP& +M"G"=N`ENU[B**.:B8=XE0I;J;304Y4!3BB09Y[\6U>8*EZ@,KA4:0RX"%1P" +M`D\$]U5E+;P'??@K#NJ<(0_?4[U;18NJT4:5&GF2Q/HTO_").`YC6]]4I76^ +M`*U]%&&PCFVP5J]`5=R;3,I[*E.W&0!C*ZFD8KDU<[*'$CEI)D2%^IB1U=4G +M6=([`QLK8]TU)9A3F!G1N6O]L4/V[*)&"V:#$5,DA!!(3+!O/`N8BY#H4*M7 +MOG6?7$7:V9<UW<=%+OPP2UP%\FEZN"]2!G+PV@0VJ7#Z?/&_V,8J.-+=YZ.+ +MF,,#R[VASLKVWD;R)=L&E3`!"[Y^S>LYG.7QQ`_>)-RGJ]7H&)N!%D6"R.@7 +MC(Q[08B%#<&[_SK+%EWTVHI#R9TX#>]"A9VW*1^_HB^N#L-G1G;F]8^U)A<@ +MYXKJKB0!(<ZT*'_5KETJY8%K@-:.=!A7@H^PTYJ^GH^AP<PA$%*(O(K&YMHZ +M@'*I"DE%B/]/96NCQAO7@!F'L#$,U`#E3/''$/6<>03J,1@CMJ&Y&CNE^>+S +MHB]YV2?.U8KVL5SBINRH6GI7O1KQ;4QV(/(U5.[28[%E1$,&%8#I9[C@:W^5 +MM]JB/^+@G7Y)6Q!+A=-"1WMU!?LJ!WU,C7"FN;<I7+Y_&ZG00Q3.0(182_;@ +MGP"'3?0S6]^\`RSB2P-JU(YFPFM>Y/'6^=XL^R7&?@V(O'W@IE\?,6>?"PW> +M:J66J/G]B*MHR:DU&SK4@KI-4]<:.UFL=^]*QLA<>IE1K4XSZN'Q`##$8=[1 +MQ,RKL;(F^!7WB`6B(+*9T$A>9L0RV)/R#MW89?Y6%JH2L;Z[J:QV+V@5\5XO +MF;;2+=`P"OLP5L)-9^_IQ!J%_:`0[F#YJ=16Z(6[]H1D<XCEX3[.9"X&(Z<E +MQBEH<BE^09H/)&B7<KJ:_WD2/M;WPSD</FU'ZFKN^0+C,;.YI,3;',$%VGO& +M2%-JXV?;M,\GVD>N"=W2_EF9U_I?F.@?]F!$)G4?4'S+1-DO8V!U)5C1J<)@ +M4*8S'\R?=%R!7\<IZ]0ZLR*<O0+S+M*N:#*]]QSFU,9PA]2^J(S=3!"7P`JC +M&3/#F96'Z#/]Y^]3I+.]YLTX`Z(^)Y[E&5J.K8*P9[#=SA$,$HB@(O,L62`[ +M.2N/V-W[<Q2"*GFE('9BB]`<-\8_BPL6M&VD?#-?H&U-.<=+LXE5*?51<S^" +MGG?&\D##HB)I;;S$%?)EI\$6"[H1LRXR+VV&,T9]+H$?M_UJTPNKPDJ152V( +M,&]V5R'9XR?IF*SYE43-JJ7C8>=O_7G^X:6U@T;LW55UE'JUQ=[BRGNZ+7AH +MVN,+>R=M-,,5G75@+GNAO`I+9B$?Y#A1EF16N;JD-@7^65G`FI`J%6XU>D9S +M]O%H?`357S">`^WC\\Z@/\S!-1)`7L72TN[6^ZE/N!00<FA],T\6ST#AYRPX +MJTI+*>T]>ZGHF<U"]K#MM[<[EN&4#25SCD101T';)4Y._R6W\3*R$,9VF?,7 +M-F0<&&C,B\?JHQ&"%A!K_(ZGOMZ><OA<Y$/1T!-TZ%N<4M(1YQ/TDW%%UU;5 +M^^]PBM/M!R";<3?Z,Z?U:>;!JC3XH%0XPN!G5Z,"+D8/4<I,VK3E7WMBV\3> +MSTQ82E>CD2NW'3+NQ$YW&_)2X>NLYL*"V->WP80LE`D-C90LUA:[7QN^/`++ +MG$&0[[>MY-Q]'P$4ZXJG@//>2_)4<3@5E=PX$4Z,-SX=^Q+^7*'?*(GI;ELU +MH@7]YR0ZSSS__P%HL"1?MJ,7D)\3A.!91+0B)UQH[^Z\JFCWL`TZEJA8>#.P +MF8*N6LX[25,4WC&"8/08L#\)8?<N5P*XX47U,V0+<@NEKLQ[0KZTXT"O3C\^ +M::HVDX=Y%R0U-#D;?:-D\,.E3=]'OYZV+IXNO-:+Z-43.A/="AYN@>*HX%@' +MG4!KX+]H@^`O\?S7+C=*OWA&03J;XM0:F]9P'$'8:/D#)B><^](SJ4;H[`Q= +ME'.'(9;7Z.69;KA%Q[Y+R,*H,W`Q/->O?1@DVU86T.%T27_LN-^0/OF_.5J7 +M^QPNXA_0FP"R72O</&1]-G*[-7+:?+:K#GG)K&,"4091RQ'8\K]M+RS,W':Z +MWI@]3*-N'&1;U$,&_)#A4:%GQ16CK?K8:*Q9I@%(,$DC80K$$SGC%FH`^9T5 +M+OC:^N$EE`?+*U?"OXZ`\4.A1=7SN%,J6$L-%]G<%Z3/PP4@0]S1N+].#KZ, +M>]-\8(6+XQ.8\_$)%&54I=PK`3G!KG/.HX@BROF50?$_\6>['F.Y\Z<0HJ;M +MO8FOP!AQ>Y"UFJN`LG\U.*"Y]MB-!0$3Q$Z*B]5Y(5..5''G9WF+>"?U++CI +M>UP4DL3`,2$2Z(X-ZUFSMTOVAU7PC=[?\T(^!JT;XPU](E'?`>TD%8ONG6ZM +M/J9J\%]%CVKBH(M<;A(Q?$S+&AN7J6@DS_8!X)RB=4CS8`\T^Q(OY&H@?K,G +MW&\%R0L"G+#YD:T8MI9@AS*=%H,\P1AY5P%]X6.3>O^/D?'3VCPB[,=K.4HD +M0%D&>XWX:2).9XBUH/"?-20F":9O.`>]YO$$-#KLL6L>K&H[=,LL->I4@/9C +MGQEEJYS1$(CC,P3ULY%S*$#H:N`FL^J=L[.C7T8B3X@8U$N3)VQ)3AV3],(Y +M<<<EOOT!5Z.GU*',97";M7DH+.E1X;VS#70@'PXL++5M,-I\;?-*\TD:KCZZ +M6>*+U>O"KS^DSZ957'#R,BY6/FRSF072M<,,2:'>4.?8+2ESL%M1GBD0CC-- +MY:\>5ZWQ&3N5-5R"*DTG$ZGTK?,>)0XVPU`E5+/420K'A/C0<=V:U<8$<![R +M`9R,-HH1M3,`+:QMW,T\@(#X+=W`7WJES;J8OW@W`*1FHB;0KSKZ,8FEK\W` +M]+^L02=P>/FO+H4R5FB.6(#%NJ]MM=UI[&V*LG<R)+QPZVNKPZX1>J,Z[8DH +M^!4ON`#]0K!=8J=4]C!]CDD0%>2B?BPYKX72DA\3FN[K4OM@9LL99'Q+18^W +M?`U`Y%CX,D4<K862L7%WJKB:>D92FB<"-=5SF_:+%V%,Z'W;%/.SKH*PJZ+9 +MT:C`><$D9PIG%]E173QD6S%YRFQW[\QGPM57TCB&LU)EKWXZBZ$^65$3O#TY +M\U97F#!X)=!([&;/'(?F=T>NY,6O9D$9V:DJ=WLD6^ZJT?]F.D+=S#!@?$D- +M-S<(";-\&K>#B%H2H.$%%2G7?:SMEJ-?W#YYV#WG`Z2S$?`#N\P?1ENOW[BA +MV:K`++'P!;.&)XY3Q^9\13*@,YI,N1BW>9Q3HT`L(Y;X_O8!#J&?22JOKC*_ +MWC@^`,MU,P8KI<0.:RP)\7C"SY?,K&-A?SCES5D)]">*6V!!1T_`OE9%60&> +M`G5"9K(KBL]LTCMIK_)@!!T#1B"LYF]?CX>::K5J@S^\*JC<[%;B89>#X\^[ +M?N%P`D'L"<]`TR2E8.5D9CT%`<0VI:OF=;-3)M&SJLMX7/P]+]-,K<^@U&GJ +M'8ZM#&/S<UTS(FTZOPRGJ8#U'C`^2I"5!H>0NO@/A68%FIK$)7E2[GLXRPT+ +M>;Z+Z7?A@,WVNRD9'<_9S;MD*C;],L,_F7:#&B84RP%&5C.<K?J&@=DFY\S8 +M964\/]1/I<"C>_NW`CK7\.X)%E;H-1S^(I,F8,+,7'O;=G/@^+YW=[I8\Y-8 +M^<7QB[W\.T$MUFA=\T\<O!Q/J#]QR[F:F/Z3A,Q;R9%][NSTT?<H_$1C0F:C +MIB^@-K;HMYGNRE**=W@_@XD9&#-R0Z&>RP@[U0WB`;E5$D;?%&J2K(1#D8T8 +M0WA@9>'#1`;WV;BTT^59.P?`F?.85V=40(M!Y_*'NCM&LPWSOS5[A9^@4>`! +M168.+I4O^4`0H[T2*&5J5GCLK:V<4FX+\0!9)_SUH_<FEER2YUX+13XI$7=+ +MQ2L*<9:!'E['OA!2S7KT9RT^[R);"GKO(2?F[DY1`)9A"F:POT.F[T_%2O@; +MHWS5BDW%L%>%3#X!8Q.R\AR56D0;U^0"6-FW05,A<<8:LQ1U2FF-Q<8RI+X! +MT\03>EB/ZM'G(&(H:.GN9]0J9Y:*XUIK<\S%+*!H#KIM0^D$1RYL.TFR`_PQ +MZ-4:AON"D;)P3PE[S&RG]EA#QXP(KTHBN-/L9/WJ;L:$.\BA>NB2Y::WD^3H +M=5274?BBO$@XX.E&?GU6T-`C\%:7$Y3IK_U5"W<Q)14>(GB1P`S%6V]:'N*[ +M+48^RH13>ONN+N>5VN6!C#_&EI.2<U<?'8X6Y<F/,S$/D@W^ETFTE!EJ3\'' +MZD)3D7H70RFI=\()JN+LQJ3&ZHV^_1CVI@##!G?V1Y.)CB(D.X;]%A-QLEW6 +M&'E:X_95&#S52MVC&X(`]+#)28?ME]#_H`(@EN`CEOD69S6E[)G!I[TWT((H +MB"G^%,V!8J`L:[*J;XK'271CA-H<8/L3O'"+G7@XAFSZ745I*N7V?Y>OQ5'` +MB"3KFE<_FB(@K`'=U=BEI.+RJ"`Y`S/XCI3N()&4OIL,=R\%SY8,MIQ3@CDR +M$6';""@_"3`/6'H6E4AE*.8$E2A3=_T[^V3.RUW5,+K8?3*AUY7)13V\%;XW +MUFJ,S@-FHG<UJ')PNK*=4^&^*$8-DG2[A\PM04W-S(A`IH@N_@.1FT409<$8 +M/_TB'B-:BAP;]"(.VX@9Y\&@A^*">[51X(4`-F[I_Y.5)M]?3$9KB+44:\K6 +MQX*OAFBL;_\6M<YC?QH;H:WTRBA`*%3_L%+%773&_;@3NEHU(JH02V*G[C1X +MO8HV65K@TD"#U:OL20&A\\;[O+:6USM.FR=5$3_LU8XS?NIY-WQSD6UAO70` +MC.AIS^XEX>E#EB),W2X7TE?R-=X\SC'2"O^8DWY5%<K-0'SS@&66Z5SY73!] +MR0BK>C"UH@'P!3!@T8H'3F=?8)877J!'N33P'<<U!(76[=&EMS<-I.7HWAZ[ +M652\65IXO@]'(W$$,AX9`I&N5%:YSV]-2,CJV-X8I'Y4!!2HI5&"T99D[.V> +M.*E!,R8"_1M_L4Q$$P(^\!IN!1RW-/X+6HTZ=2N&S,OQ?K)?R1PQ:=A2_Z&\ +MD8[^KW-T]E$\(`.QNO]+HU6Q>#+U:2IZ,E4]F#_$3ZHY23E:4#;W^KS>ZFN$ +MG1!L;*>=%;JR=,MLT^)")7L275PQ7U9AK^?QEMB?[S]NF7E5]N%178'BEZQ, +M<5MY^^<?_H?T84S;FX:_`$5=5<ASVB5+9UFK4W`HC9$E^17I/E9Y9/6HXPG9 +M_-G[ND\Q`1EJ*"=^"QTK##V?G%>/G,V@G)]11.*S[K]3T:7I"6^GK?(2X-/X +M'QI!!2-:Z?6/;"F-D?P8?G502XJ6J]]I6R?N_\WD7,M*T=;X&P%N3U7I7$B= +M*0RG@[G_K!1Y(.*-4'6[RYALT%[HHC=^E[14S^M%X^HO@E!OP*VQNMH!D=]W +M#C;#^E1AFM4G1\."^A'D,&W26\NN'Q#$DFM,G_1JJ,IB+OF)_VL&0W9F'V2P +M,]]L7\S;9SLOCT"QNTM;&+,E>D$;13SYXN(AV)60TI9_'KJL3$(2KQ5![N58 +M'WA[)X,D]OB@"_&0KU^EE(FS>GB%&W%Z-I?YKP)NXV2ZMN]V4[V*?W(C7@!# +M8,$O_BVZ)9"YMZ@8@PU::R3RFRPH584MZ)'HE_?Y?G(RU_0Z`<.KDP?]E&H( +MSZM)]PX/`D7YFD8&;YH5IG$<U;)=3\UQ*=AP"-=[EU&:RL:C-S7^GZ97@]:3 +M\'V<5"Z(LZ?^9'`'W&#GDTP20[7=>9T`TH5^X81Z?9ADM(]RAB`?D&ZF>,P@ +M9-HNFEMP$>8Q=+KE]*MC('[?=37E6$Z'C-;7Y<M=3;"P)"K,[+UO]^X/&*,D +M#!GP,`B%=\8BGR-.P#X2XA@5^5O0O]18K?=;Q;[P^#9L/957F\OP7D*HH%LG +MNY;U233E.DYES/V,X31-D\NTU?M(@-RPFM_S,C!.GJ7.ZB:0%IA`(1I.96N) +M9NV7V6,@S_?K.T#W+"/"[$$^+_/U,_>;0K>YC9PA&A3+`8$%$^"*Z<O'=RV, +M'G?#9$S?P3PLJ9UY'E@;3%I+_1P'V<UZD[X'&[B*YG,L3WW2GF0`,#>2Y)<O +MB0_\[DON/(-I(ZS%I)'N/Z5B+_((%@LRJRE"7$Q-5*18OU(B>%D$R>TWA)*6 +M:1>F>H:Y8"?,,?D&5)@!E]`3&<^<>'Y+]@)O<W=^RMM>TZ-Q+%"4H5(*F/JJ +MJNJ&05Y5[G#Y3BE#S]#Q4#:/(,Y#"[@*-+(][KH^9B$2*'QRJBX/FLD.SI35 +MFKF#&Y33Q>Y())J;-<;%E_X<M_DUKS;=$OOWFPLR\B-UW4S*XP&:HBJ2GT^Q +M,-9@<TK5*WU!&***S*W#"+(_U5]9`Y=57NE(MS<\;F9[*H.#-X_LF=J`NMW! +MKI*O!%7N`QP?PTTX-WEL-4@M;+438FG#)BOJIK0/_?/*8)=J!T6G&W\XF%L0 +M84HAW,"VL%ZLBN;V"M:)P>[V)#\Q]&XU8O#A*`T0H.2)OXN76#!OF6/6@F]7 +MW*,\3CX=;"'!*"P;W<:1ZOOI@3]?([YO,T^@QV2>\`YH+0?QU#.<0U%Z"H8; +M*^'EC4[,9%;ZLGF0A:QA=W-'*)LE$&H1-A<@Y"-:-GI2#/_*>F%='B%"ZB>9 +M?YS)[948MS-`.4!81\Q7![(6T,3`J+F5+7GV0QAY)4/&5G>*``Z3#;.37)O> +MC.97U3@X*-"1$SW`MKP$4Y"NU4,FA%WK6#8_Y5^]?HD[L<@7&\4CVHK]$OT2 +MT!@B=%5H/53P7*N"AC4]KX1T(-+"$03\Z#B,:VZ&1DDE$OS_<[]$QCPP]J9K +M>NTGRBZ!*TLXA%]?T5IK;;+@1]/J2V$#\!0KNRL78R-@YD2-:!^U-RF5(*S; +M6QAV)84I&4!$=02+&Z!5-241B$8]$'D<=D%7)X`77N+($NZ)P!0$3$G]XQR: +MUBIU&/ITB.D&QD8_#!BN91P@AS>MJBF#VI53N_42=<6S,]^<D512F<H^N;[) +M5H/G[J@>TRHBDKM27\5#L+^('";+`WO&3MZGSWQ%J;*%97;O85S;3-ZRZ#8; +MDW*0.2#,\(($>$62U^W<P7"DE-1Y`#>98?QPI$!\Q#I]1[YJZ_ES,1<6.L$$ +ML82XLI69F#5('(4Q_@R9!,0M7X2>KR0//LEXQ?8L7%B1%W>CYQY'8[)UW-/4 +M[TFDYQ!`GQ-50FC/>@32\WE$HEK*Q&"NFWR\O`;1N<G`_FTHD@PK=C:`7>L[ +M`(?I\45$C0Y50%^_[Q#Z"G%Z(CM_&=*U!\B6?\,HQ>CV*(8PE.7E=.&;DMRV +M'%#TK5,GV9X?6.Z;P'#.*1G%C9VHI*L-L71HR<%YQ0_C*]G5P4WZ634JNWN# +M@1H6BVWP3]B)?H@FW9J66+UP#5+959JHONG@_3=($`A!B*;&"P=H;IDGT8-@ +M7\C_8\"FT$7@U;C%NOYD=&/E,5%,B/#'>_[XUI28"0\JN_(OZ8OZAM-,@4*> +MWA.C;;F+[=6?V_-P:CBW\H/<:JO\X,%$;"E+0<CW0QBFB!;'9-P--QI[)KX1 +M==NX6O:C`I0\A<83G0@K7BIWLN`_U)0FFG`>TE'EK89MK6>^C[9;=18S>8IP +M]9VA=>`;TT\9U*(4%]M`PRO)>7L66CIVR[@U/!FL#-9\O'M3.J`SZ5)=@\X$ +MAE83<$K:ZI4:Z%]_XD[?7/CM(R_&N.DJZ;P0=.<W7-+6*2V<PDFHHBV"M^8F +M<K)X'A.$V5X7<V*)SHNX\J5]?<<,\:O4B8]OQ0"YV%5L7Y^`FV7<R$C1!6:O +M):P1F..M/FX6@A`-U;23VE`,)/96XLH7X\-!]-*>`P$JV)0L3BWV;3\0^DA@ +MW<12/__-/=LLS^HCZ5E><;RQN^^=SJ-SNT%?91$>Q1]!+*#RX30AIN#]L1NE +M4TMF*MW874]046/XI=Y__/^&(?_.5B251)6L$^7D=A85\8'%^442Y,;6@O?< +M)N[*8P'O8\/0GDORO:XY:=Z^P.7"W3';"/^BK1Y5N;Y"4$*S0+GP:Q:M%KI4 +M3U\Y*"726E811R/EMI8`V%,%?-O\/'#UK*0=5#?(R^5U7.GH?YJ6TV;EP.9G +ML@XY\<OC>*DU[FU4X+@!5,//6<:*3A:[YI-YFJ9PF%!4;\K:=Z*^WDH\]&C5 +M4L#"7(X866A%@D]95;+8A9SMYV`O'/UATL`W<][GB!E+FC=YD^*D%,F)N8T5 +M6E:MA+;%0LYFIJ("95F)CK=63E3"\"FV%PZ`/0H9.WQ?DY&*QUMX(RZOJBP] +M*P<&1;KUOP@UXU]H2C`W>^84I^-XXT$/]@5/PDP"QH=M]FZ(_W$$02-+-[H` +M$5CB([_UO4$N>"F][XI:0O=*>AS+_NE@`?W*R6B`51'#:"8>\"C-6NXXRR\] +MR5<&QNJ`:I:<1D=J]#1`>5M<>USVSQGRFA&MZ_)3DPZ-I558K.9+IA$B:;IB +M-HK\^NI:Z]"HJB'J>@EW)&MLKFF_%H6LPNV^F$?AI;TH%+Z-N.RWV11[WC&: +M:BCS'HL+DJE<2J2^%,"(_X-\O\`RHBJY4O2XDIST=9'"Q?"XWU-C;@1H73_8 +MX+1!(D:M+=G!R"%!VXBA,Z4"$F6JIRD6';&NF(^G@,T_)2_=IG#$";1(=UV( +MH$1LO7?BN;\ZI6LI^R?,/U:M_CV..6M_?YAMHJ?=.JZ&BY`GH8$IV@56BCC) +M[&WU/A#>(Y$*W-"+"%YFX>[+3$5>31FXR0Y8)DM$IISZ^I5(ZLL0R!/XO>N7 +MN8'TQL2VE#N^*M?BX>M`<4&KD44&$2?*^7S"U7XC#`&L$ZA/P\B81\_ZT4// +MS`[#P476`N.D'X4N&X,\M-TU#6(K*3SXA/:!T:D!NARGY%B#6)5KE>2^1Y<0 +M_,6"N*G31C]7TR^P-OIPW),9^UI\DZ._G`KYL`P;4Q&^?YX%[^%4)3.\2=Q8 +M)0$88G#QIV<_`._E'ZL!.4/5!<K&EOJ1G0USSNKN!_UC:;P$`JT_+KC*F(VQ +MBYLJ4G=<^/;$AW2JG6H(.G3C'!P>\&7DJU:,/)2;P54GBQVV`#0.^0WL<<(# +MI9[]AZ2L'6XP':P+NJXWNNN^%0J^"77.N3HQ"O([L%43QAKOD%)X,_!?M2?` +MKXG$'=N`K(J>[L`J%W?V=]K7957!][IOA(8?"H/#P$KL&B[67I!74<E33)$5 +M)0_BZ,P-OOT]>W2C$12YR?R(N*T3.Q?5QISK+[4005!MAP^%(QC5%A)IID4` +MAM=3S8!/,#;Q`\%F]-KX5&J0W&T/[;7!7CC*WYM6"'*N;:JN,JH7QUE\PSP) +MS=[1R"JTM-I]#OV[M2?!Q[3CT(RCK*Y>J1+&M`T0E4Y2^-.C&!%PD(/NP2HR +M8\[^Q8XY;UPNW^T'+T0".N^)`"XSRJ_5SILV_-\<Q?-Y[?_I:PO;;8GI+\/5 +MAN^?1`[EY#-G+VL,!BJ2SX6$U;LHW?&9VVQZ/#0;B:LN4LT[(ZH71@,0/!HH +M!WG5$$\XX/:$8X'UVG4750B9=P3:V3*W&)\X]\R]X,X(L!,W-V>@"8+8+]'V +MK<H_./,W!*.L4E[:L81NRMY$C>(T\T5V0R.^V((&%V'$><#@N!Y1.H9<4:ZF +MX>6#ZW6S&`B?%HM\N[Y.QNJ*&0U5)<GEKV'72-;7M<P*'KU\+SC<NGE9KMPF +MRK2AM\+_=5D1N\GEJ7<^1J>9"=&=G)*P4<.",+2C;AD-H-/Y^@5=A.`YHIQ, +M%8@S$;L`,-M#DA<%C`)0(CS74?2)B+FFSN2`Q^4@TI>0;5)?7UQX`,,BU:TN +M*M]GEDFF$`U3#Q4W4NYWX8!`9$RXZ(3P9GKF#-R=`B8R5X6_R&7A92B?I&,U +MUJYY_+H!)S75Y8%!\*]EE):+/X6Q[#3A@A]>.B0ZD/8*'9DG?^(C8^)O"E^G +M^6;J2RZ?JL90W\;$8"=?Q+O9;R;+`)XAI[VIN!G"SD_BQ4'A_NQ:SE#8<9F3 +M*(@?H^&!^6]F-YH.O*-TWCL9/GV'0&:\`N]04`2?3-]-V@J5CEZKA*08H@&1 +MD<XGU>S6992Z?MFJ(/?:57.1LSGZGHQP'B*C#F9X+*8F1S&YAL@[?F+68G06 +M.;:]TACHBAS*4'[]2-HG#*1O;)P5SJ71:_HP1!Y-"6!/VU!'F<_SU%Z;\BSJ +M0@J1=R<I0BJ!8%'D"8-:>"ZFU+)IS_G1_`2BPVGQ:\LJ[@\)]?Q4^TN^E]!H +M%0WZ;EBXZ`A%I3S&I1?Z?H5=]@RU`RLUJ@[[#B9+N.\._(!.@8>P3M.((2A0 +MZT9#R[(_+C1?)KM24CD;L$O(!/:<+;*NX?]0JY2XD[`"'(3U&R$Q8:/_,P@- +MZ%^%G;'TD4Y6]QNNV4.%Q>U+&;GW!X-1P2/P#A;,)SG^/(I&[K?->4(4/*>\ +M"LMD@*3)#66=-9^.AY2+WA>4&;NW:"O`O6+7$T)3J5($(ZP3;O-#+W-A^$_9 +M&13\>L7>BZNB5Q.4?UQQ\G\)L&;[XEDV^WH8L$DKYR(P%;,#WX@XHO4PG-#4 +M:#ZS,+*+L_N=SR487I,$.J,.1S<<!2XCI'104WUZ!DK[5IN"BU*8$!4A;/E> +M7T1*3/\7+<.]GB50FD_")12(R+^LDQ9I"X'$K"BG=FBC\+A_0"PEF2#)A/_9 +MRDW:%/:N31?H[F!W*^O7(!5(%K\;Y>K6G<,<;Z2#:IP8Y"SAF3:LG5U7OY9L +M^XE/^2YV."6=Y!YPKM@G1ST!/1R=EW+)4RCZ:'-&%'W^S/W4C6_>$ECX#H_C +MD"8E&58^TZVDM*4RT'DMQ(\"G%DKW&XA>CR()Y-JO>2X"G>CTNG1U25:0%R- +M7RCVR!?AB_"^5L[%W4I_F@#FL!AV6^KE>B8A2Z#SS5<081O=C%&W6WP!VTSD +M6K!(2EC;&<Q,5D121?)W?IDC0I-?7^#'Q4BO`DR3YQHU>A`X#-](S@''3AM) +M-$?R@"?.S#!/Z&PP\Q+$]ETS2"3S)['?"83ZR)I.XX$TF;$M1MZZB(FLFF4# +MX`/*@_'U?R_?-5T@"^6'<5%<AFVU`^0$E-L1*@\.8#XVHP$#*,HS0O*`J1O3 +MM*2-*-E'P\(1CHF"7HBMII&1X3R0FKDUF?O=F-=>E<P[J)JD>W<W3BN1$ +MH?'/6,<SS;IC-Z((#\BLLF/]DT<!/\#XF6.S*(<47(52@&=$*L1D;<4+B@)M +M.LDG@6X:IK*``@9!M./VW]L+/U#6ZF-"`\RQ[(QF;+<9%`H![`!8C;#9*0Z1 +M>&QSQ%.%)&1VQ_N+`J12\\*6W-_!CU"NK:1!)Z1FB"/<R2(B8;VG6F<27=FG +MDE?_K#V%-4=YM0/0E,$]HH_(L0N+;\KQ5ZC_=&'MQ_])Y3EE%S.I:F=GTJ5C +M5W,;/"]J50.T;$FR\@BK?(=@.*&!#J&:OC<6^Z=C,ZM-P&>AAU)WA6WG1?Z` +M*R3>VOR)GRP,<)$S8UR&#'JD]%5B^X]0B!\I(/LQNE^0GMQ>H%+B]P'"I)+( +M6T"67Y1CZ#^^'IDSJOPHA+)6,]V:,%O<\@E,,UJY_;??E3)RQ#I_8K0#\T6M +M:\O1GEDML+)@\$&`M41F3T*^#F^W>*9?9"3L)QM$Q[-)^CB1N(5J_$8OO$@^ +MG.X;8)OS^#I#^74ZKO.+Y!0HEGDE88DOQ1_&>J?JG5#UUVY2^JA'I9<0!"^X +MT/Y?&H3Y[3\=PW<SV";A\(^?3,>;7<H!;DK[_`Z@0TP2<`:+8OA$913O[V?+ +M?\=TRL"?6,ZN=X/2>P]&`3)F`<QEF0"G16JYWX=`N]_K>`9Y+`.`=7GLHA/` +MC*N]";A!]9JS\BNKW"?1*]*9=AU-MQ#/5*,#QL\TUB+=,8R&<BPUV9LXLHF% +M2"F!WOMZ^(,6$U7WIOO34M8H_J*/FR[PQT,:0(^39>^S<*[7E^ITGT30?)9, +ML&$MN>4Q:IF4^H/<0!N^&)-2>P76:XXW.>_Y>Q="V4@\-M&W7\%"!?M(2`:. +M/Z:B.(3W`"Y.I/!6KOR=5$3&&?47ED3WNB,1IXBU@PR)\.&K9':'SYNPTDP3 +MS8AR'ZVIX,.@`I#R?'FF/R^BPOYA7MA9($+3LO&PXIMGRUO=H@60+A"K+=(@ +M#PUR+FF<2=534=H!2X%%A6F@(1*5O?M1^"[K^$R;4&F^Y8<AL=/E<0-0U"QG +M6U`]Y]I=FR]T:S4(4)R)M)H+K:M+(011SQ-Z4YQT66##CWBG,EW^&!J3(_]; +M&TX9-@@9!=V;U%XQKSM+7%87@/$WK2(@T9%&M5?J=:E45X9\UK=K26(-WX:: +MN0#I3<!IB&K>3Q-VEIVC0.297Z@E+'W':*LM0IWMW5L!!T![#!!0S%G9&-NQ +M@/W\NC]>;8POM;Z61H%49+JF)KG9`#`JE/303-_>WUAWFL26$VMI2!YEX@\( +MI":85W[*,X?#Y8/,YAQ/40L\P]=H\S4)R.K+B$)VR'8SE/X&=X#T.8M3WFN% +M_J?IXO>LF)=XQ(YAYO\^0PI,R'T@S[4A!MJ58]O9YK,HQT[[36CD%G5MF?"6 +MT;1W8&GN&9#!VNR05ME<FBTVY&@$Y!'M:%V273(G;`[K&_M7:C1;,.AQL-7A +M1,V'XC\34E$^:FBNQU![M.!KE=K>Q.E4*_FW:'0=+H:=-K:ZHOTZ8J&"5:;- +M4R,P`L6EQ^1F>[P\CAZ2.13\'/T5W+;_T5\"`EIOJ8X"6I!`U(66AE``>@6] +M+J0"7D8H@S_2MN5-0`_)R-O5!F(W?&8F<^44U+RQ)K$A`KH_(?TCO)%9E-KS +M+B6'#+_@Z2-:.^'J6(9EX"K=7)TU?9Y7+$7WS@$V]KU?@4?F0QG/UO[;BI]1 +MKRSX]DP!QY4")LD=DMK!E4-%,86SXQ,WJDMMS75LX?"5(MD/"-*W;T*A-+HA +M"I_O_VZ)0K?J&&!MYO,#"3C?)OS6Q/RDB;V'^^`L)!?9IGMD3^^$&53GKPFJ +M84YZ'-Z,J(:>(?*^+83V#+R>CY:\X`G/F,2]76%+@SAK>3;++K%>],O/YWU5 +M`@;9_>39<_[E7Y'*:C4X`V$N66SEONK2&Y'\2/;_$?ETG3QV9T"$\B(67%B4 +M$V6<,[#VA7N(S'UEH</]:B"*F!X_37:([7ZF(#=`EV`X5D'9E%2"3@Z4YF$" +MJE9="SX*O)7^]?,X9`LV1@()(PG'+5!8)1ERYD!Q:\M([V<I'0+4G)$R.0)6 +MUCG*?Z'``;Q4'Z>NTS-!Q1Q/CMG^"9;P%Q>DR+EX-PH#NP*]'V=;Z+WMP$.Y +MG_"V&,%3O.4LXO#:3L3$0',7M$/&$.56L_C9CD[C7@Q0MNXL\"052\Y:--X0 +M:[1%6#8`C[YAD4I@IT8COD-!#].=<L$DD-:G]52?U9=)50F]RS6KE[`VE9:V +MT7GT5I.A7C(XYJ9F[V*Y9A#V#:#BAU)V:Y;!.B[9OIZ@V2YKI@'`9D#OJEY" +MW6.'M/Z@^%@TK_9@0&@'<MU<4U'65&9[&075VO*<0+EHJ;NR8?4`P53HY^"1 +M&=*>VH$Z4@EUA&R7?H#)8S4BP.TW;EU3-U%USDSV'AX](K#UHRC''`K6C<LH +MA7"LY7EV8>ZC+,8G_B&&0U7G_.&W!\A;V4?PSUV,I8`C(X9:82ZUEC[/3`@U +M-NX<=/>R`N@?M#>@P(6W7-!\:@Q7Z,+/"2]&^`B6[\Y4M?+[F4"CO^*R)221 +M8XGX:^GN.D2A\SMW&4J79:'/+[5U`'T`NVC26]C?UC`]#K$KUVL,7*],.I-` +M/W>;+J=`%+[.'K\G(SBY;+):I5NO?Y]_W]CI=37#3&!^GD'+`B$(`K1\[$!1 +MZXY2%RO[U.O$>(QZ!W]EI;;O)JR#9@<6"MBCN'G/_V_&%3`<(]H[4`S_FXI7 +M9<:OB3357K_&W:?JMWVH&!J?^(DBK\34]/N-,0!*I&T`V7^A:1IHD$VQYR?K +MT1^&6\I.J-R[H+)2NE_`NDVG2WE)-A6R[\A.CR@=`=]M3H!\!Y)UET(8I9,V +ME*K5,1P(YV_T7J5Q#%Y41UV_>MWOAUJ/*B=WT6"#J,G%I[,@!/[_Z'[56[]1 +MP*Q$GLNEPNVZY-(=L:<"X9/[IOM.LHVXQ$\B6_KC/N)9Z@R[L17-W2K7M+0R +MPI$6)AT,CE<>0U2"2<5W105<P%MQZ#"2KAQU)X>@/<^B&.--4MAHP<H63._" +MSK^S]@1_(HY!ILS$8&3UX*V:!&>.1=-IBK[&/!*:)JFKF;T]<B-X2/ND3W%( +M849C74."O/!5L$3/K['Z#&/.`+$6W[R$#(]/I"2XJ'26POZS&Q2T6]A^(R;; +M8%LJ"27K8H`7B4(%W'6\*M!4.?JG738]0TS%;8W(I$]IX<LM[A+<-Q[[!KN0 +MVS'8SR==UOD"AG>CYA.'+?])HFZ$=A`W)CR\4:?R[.?;X0GF`%WKL!V:Y;E[ +M-OTXB=9]8$S/ES@2(QY8H6XHT'PP80PJ%G^7+;:6G#DO&2/Y[OGCNKI0A)3" +M*+OYH>/@]U)!1$4@!5+G`YK4,_`%YWY!*VI-]!K^44):8ND?.-@G%E=?&.\G +MCB3G#)SV:/)H@$]<?4DL(5"^WZUN1-X:Q.M'`],$'G7OUBN;:1IIQ;POJ6B- +M>=VXME"Z\]`YH:'TYU]]J<P=,F5<5E4J3H_+M+^,Q(E(%+?1=PEOVO-W)Z<A +M90$GG[J<\(9ENTT?"S&H,V-@\[])TE-UT/CY"92MS.SS61T)&:CUE\S(7:QQ +M")V^XE9`?EZ'TOU<495MQL;**N2RW(D!^WFM%37+ZL:^`L_\50WVAZX<U\'? +M\Y=RMGX?"_Q("BHQA+ZR1B[0S4&K!80[U:_`LQ'`GE][D.G?F];2/[S_J7/X +M$>U??JV($.RL*&32)O,B5HFI9BA?&)<<^&W4!??@$:MK844Z3%;#`C+X$2:5 +M176N#/W2&/LVYB5?^4]/WP3%U2<=8L9_"DE`7W2A`[\6[*,WNT=:+I0#!C6L +M;VP?F($*'D<L[!WI;0X_QX?L]-2%2&]OI.^M*]DP<N'B9V_MM.35\,J_@$YW +MU";Z?M,)C0M2Y`_IK7PM8?$0"1%8493K*D>\7'\#*K/B_LH."2?F0T#IX@G> +M%S>"2H&>'0D#JUY!)7K+#*WLN!7[_BEAMS):B^F^5(](O?UZHT[;"8<9P)_W +M"N1_LD>T33CL:!AHC9?/7DIPZLF%;2FCW;BY0E2)R_QQ,C.L)V+0B(2*M1`U +M9`S%9+]#WK(^@OA?;B&6X_-QF&YR1D@"&EJ'-H7M'IKO:\3C9QE%_6OZ,K\A +MW61IFJ5[</5J":.?90%W#4U5$]K>V\/G5=CS,:W_?6:0725QW;/X"*@/J,J@ +MATS@8_VSR_B_J,\7,Q4OL<((NJ\B:T$_<[P4>R'Y'&<E^0"Z,SN"2^;,_1Z7 +MLBC;%"ULK/GIL8QV-?Q9/4T.MVNF=GE4!'2@+A;4.["E:>0QR]3UW/@T1:G, +M*AE8RMF@AEUL0?'PRY1*)#\7[=(0Q>"=R<*@3;R?OM^90%CH-Y_+%-O*@XM7 +M&5VZ/`)#7YJA:JGP5ER$$H`W@VPER@.R2[6Z;.>AJIJM6W""MLC$D5.$8%SD +MB2-9O-IPM]`UV?Z/K6!><)S02;<*SL^)'0Z[='PF_<(V/Z:`OQ'\;01!>VYV +M:`V5C"2HM-I;H\JD6TO9$9>LK2;%2S@C@5_*?EF.B>/SAQN,6L$RIW;UEF.4 +M-$9GDB*E(M`-@H[,T0\:YAE$FZ`6R*T_+QZ,.YB%#$=HFP/B4F(<$>0P`4UG +M9B.$;M4"SKOO-,BYO;,(\#==^(M]GKV#Q]C*0**5+A7#_MD>(Q8^$X!107P1 +MV9L[M>7*40--%_%`Q4!^Z'A3>57+3M-'KMV'[E`?M:2"'YRAWX55S55THU]Y +MX1`!DXMPV\<>%CWM#'D_657/#KAXP?65A)AV^Q\5N:KZ!=Y+,7LOJ1,G&5K1 +M7<EC&W31E"Q>B*ECY%2T-T#Y:;N5@)]DM:2P/QVM0G:R!QP[H_'PE2':J-;" +M\#>`(V@X0E_3$;XEF$]`3Z\_,IQ1&3.@>?]^#%?^0K$26).3"$@X(Y.`$$31 +M7A(ZFMH$,Y28VE1W>N.),6UVF$Q`)`=J'.:07A<,X"-4W^[5CE5``,8GQM$& +M!K=DO%#D%E&D";^@HU6)ZM#_0J*<?T?.6[3`X4K)^3)]U,FT]1]_N0UFZ_'< +MX3AZCM6+Y$X5H&(GRA7PLP6%3(AF7[G'P'017N\=_CS<^$5=Z<!:,2/:[^8K +MJ?S;4?-K+2I0C*/IFV3;Z_3EVY'<GE0]:+F/:27."B@V4Y#.G\5[ZHY6AN6B +M4#JNC&SC]M]6VHZ#0@J"8,R\*9]?W20B7,8QW('QL*]7VC>$YFQW&UH]^3=I +M-KY;J8HMF<!1!-XE"/6^.;:P5WQ)$QCAH(E:RGIWP">Z:"N00N1^`&3+8,9H +MLGW[.W0?=NS1;R"@*;&(U@8TJXOL\+>._))=Z5MD$6;C[0J2J+/E>;)2++QX +M',Z)CDUXCGQ.TX<I2V0#LDY$^G6/>_<:#R6<?D':)IB5UY)$4M075A*D>!"; +MUV-42_0XJW\.U3&.TQ-_L<,NRU;>KA_?EJ9_BF!&S%N?48'O^'U)7?\V?C86 +M;$$9M9?=S[^X[9G(@6VDJ9@"18308_M`(N!XDE+$;*B]"#@0K_9G)0]5>^`X +M#I!_-;S!8BBCQ.%A#W90L%_6'<^71:="8*+M-&(*H]M9`S!?PY,G';L*TOE0 +M7/P(6*IXB(R,LU84;T'Y8'S`"I+@&N8S](B4=X%=VD=EPDX--UT3DHJL:&JT +M';VD%QW0B-]6;X=93Q+-V/L6*@G+`=^5F2!%*.JHO)*A32O,6<)._+M![?PR +M8?<1;HABO=.NKP83.3).\C2%EZ7%56F_%8QD&(7_KP\<N+!AJ(P!YJG.6Z!< +MTK7"*4X:9QJV.NXKS#U&\O[I40<?-:,\M]R1CG)/%N-L(RE@T1&XGB8UO)\< +M]Z6\KN5-TT*T^$&-WF^G@Q.$TM]HOB.H`7L_`X37!$8V\9LMN[4*NWN=EN&, +M/<9JO$MBV4EJ`LF=KIWQ,#K1EV?X0';!7=1;JEH@]%99RCQ165F)`;!*-NM5 +M@5XS9'%(5+$9L>83`-\<#(D&8/]D*6ZZP<!W4UHY.C"T1Q[;J/-2$F9)&`NC +M]L]N4A'T1-?BX<:QY2C#ID1?9761S.LVR1D4G]E](+%M!&,[VHFK<V56=C/@ +M:\`#U>\F+$B$#!T)!)9(-P``0Q3O2S\S1S-/O3&LQ-<%LON;CVLCG;%=Y^@0 +M.1G2*'0;8M"3_-_P4ZNME"0+[Z.9<VJ3@^;^3=*,9BU./X%LX!>2%FH9+*F: +M*")C;*"HO9&>^"S:Z)39+.3?ME9XD"<BI/05\PECSO$A=M@(#DKX_!$.0]3C +M),[4Z$3HRH8"3)A8B@DF8UI+,;4!^\#57U9O=K/>?<;N@YVQM$^?GTU]E&EG +MEP2Y+H<?=('N?D]3=='<-J_?:@/X9T0S^ST<CZ1K?=+<@Z*D^"[`'?-F34;H +M;-9QI2O0@[<DS?5^^#>)B'L$PE4TGIIVF=+R1YA(OKDHOF75ML5N*&=JX,S3 +ML'UAYSPMZAAJER!\*^0:[_5!=QN9N$!4DCFR]<%?^,Q_E\Y/(-A4_;"<;?B1 +M5>W8:+35*=7F;R(:%P#NR?UO0ZT\&(N1OSP8KQ'"AU.4E#<NU(HN7>>.#P[` +MV'<-QL7:^AX<5`HGB'_OOR9RQ@=D-.^)BD\H'Y/?I(0#6&&L6$D[0\<9Y>;> +M(\Z6ZO3WN=6CR.9Q%(4%_7Y^Y"I:J=&1XC/+(#L$JB_(G?R\:O+3"!T8\RFO +MB5[X@TOPK.(*T(>5??Q<Y8*!YHLD'[?S"B@<21(6'9R4SD1;MD#:J!CLS09< +MF/==41*EF]NL7SK4Q9F6;9$=BD5[G;A.`ZQ=ERO@9R)&7W_:#HB:RX&8X1Q[ +MZ+15RDJ&/YH5.&(#T&NK_\Q1M+-I[=UGK'X!GR87D@CG/U6*X0Y1I"0$<9L> +M6<#?4P6W+3^':#3(=KC,&>3M2?/P8@*<T=-?(?3I_9C]?HL]!@@T'0#UL13R +M$[BF/`38O=XSBKM?48M+[ZMK<EC2$[%IZB]B4,"?C1QW13&H!_QAT-W#]7+( +M;D\(AG!2BMH9@0L5K_]#R_6'JU15[OI<(<%\""0F]N)^Q2Y68Y]2B/F1SWQ( +MT%,.K_&BB?1V)IVJ`-<H!;1,[!26N(`6](@0^5!`!AQL465SOM^YDC3.R69, +M,,Z5,\'0&8D]PE)[8AN:FN*[!.FY/I*ICC1S,RA6?2\'."DHZ.>G:DM4!),8 +M%WTZ;+WJ'`<73NB,!SVOP;M3G9(29]^ZOB^Z6*=@UZ(EKLE1)%L9UR/X',B[ +M!2,U\N;W*@(6>.VK/#8Z=).`6%K09Z7KNWHUTD\T4BAA0`8VT4$0K@OXK#:K +M;<8"8'_5QN4WI*-<""F0D%J-5868;M7\F#CG)^:]WUV@^+)1%:IZ.E(M<RQ! +M@EG04@"_"6X=3<$%Q/<6D[.\$^SE'C8)!"\UKRGWO,N^Z)!P0.T<-5\OB*TB +M@=V9P"H(R_3OG^W,]3S35VG@`@\T+<]QIZ?RQ4#ZWJC1]M`T='S1^/W!MVIR +M'YA-_\)@]S6#$-YQ6F=`Y;^ONO6?***9\!7N%^<);CZ1H:H)ETZ_7OG]Q5-^ +M@1;':A$G7>1,_B2*>I9EYU\>Y10K!ND&<LG.HEIH?TH1A1K:,M-XX-Z2`=TE +MX."2][%"2GR!,V0^W5(.785UHIG@CJ4UV4]-->UNG5"RHQ(3\+P3JY+NW4NA +M39JLJ'@)!-`(^+7N$*,62O)4R_(M>7&23^?DGKW&"/AKU=+WC.FCBG;F;#=W +M)+X8@#U7>`G-IJ_?YM?4?:P3&8D-HLU^+_&?YWPONC4]7`C8$%YH2ZA?A;0A +M1&&!OQ#`+VH[KJ;*LT5^H;?A1JF;`;,^PPC"NF1O-$TE;?VKYG`ARY[G,'YH +M%8K?-X.9'&C)15)2SDT.3F[]'UFS[B$34!P^:X%'%1(E]7(I%5\;M115L0&/ +M64DIODCFHZRM2_9*:^RQTITZIPV_.AUDPGVFG3_YDJYXTA0<\['7!I14[G]@ +M6"[`8A2$"DN^;&,/?)#^4#5*3P*\E1.:],Q5)$ZV&3M9U4.I%\V"EGJ,@OC6 +M5_:MX><2!ZR<7=M2KOHL2F$A6J]I6E\C_<0&E4NQ?7V;E)QQ8D2DUE1R3>\C +M#$V9Z90'4N92-,1*$D=*G/9?7S,-\?/S4LF=^PM_)<FG*(H,UJY,TE1M''%0 +MEX()?OMYXC6$ZY_4D>`Q*O"O$7#D6IA+#%8LGCX#HG/!D?HX'AR=2-QR11\Y +MWAWK$L^HXENX<6"V=OW]_91'J+BH'.B$S93#/FEA%9^SUN7Z`"XR#?V93=_P +M2Q?!KF2:9>\NZ@#+IQ&8U[018*Z._Z^%:K^:'3;(Z>*_*Q/D^17203^,MNOL +M>>0/C7>IJX>A+Y/V#<6^F,IKW\!!IG.-DFL4V6=B94'Y%B5T[3D4L@)91EZ, +MJ(W+-F#1U/<>N2L(DLOTT[N__MH=(-%CLO@```$``````!H``0``````3%I) +M4`&-`%P8!Z>2U-["^)5].:K-BO[_0:QY`;G+*KG)^"B=_8>[3?I.H=7"Y%,> +M2>,<N4RG=7;'J2;>*FBXDW:@+"'N"6Z97U*LPCB[;T"#;PV8:VD4_Q-ED*N7 +M?VXGQLO#_V#X&$GUK<=+U+5&CCX[NL'1CWC,M3^/PUC^L8//T$^;TD=07Z+I +MK&J?QMLOX#EV1B5CB2+>=7BYO/@#?PTA(DI8VM#'X7J*:I@L3F/_W1,9Y(U? +M+P6@U#5+?22WR*X$2HM68)@0_QOR%Y>.D_"BND'^Z2$TN$9M,\GZ`N*5#I.I +M._$ADQ8@O7F<S<&4]-@.X^AKKD*SHRTI_(\GU\%3*Y7EA88`TE[H?&.P+PE0 +MSLI]0GKUNYUM:Y2?A%^\M_^57[O'(8%Q$K.;K4DA[+/0".IT:CL;I[AU;O4` +M9`7B``SM-FC^>(SWL@UIJVV,VR-%11O+71%6,.Y(*(2<6\H;;MT@]D]2+0D] +MS`B3PE8Y`T%JA@I+<NF-S`W&6N42.\`*-IQ5#B2'X1+>8FZP^@5B$/V;K6G& +M)_D71^K31&O5]R83WVR6V2/1<C\2$O6N4K)54LAY*3--[:1V-1JW6D$FQ+L> +MX23XQ9TS)M)Q2KL&(NP15;E^Y^GOYH#R&`+'\-16VD8%$;^?7*\U,#O)-^X! +M:K\,_#9G>M!CT$%PUE5HPCTC:<9_E!_%@,J>%T;8_`5:]U`]58>6>;.A%N-] +M52?*B11FEJ;*^3RWD+6R_,#95S,V>ON/___,%P``X)_<F@`8````````40(` +%```````` +` +end diff --git a/libarchive/test/test_compat_lzma.c b/libarchive/test/test_compat_lzma.c index 7e6e3a89f9c1..b9cad55514a1 100644 --- a/libarchive/test/test_compat_lzma.c +++ b/libarchive/test/test_compat_lzma.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_compat_lzma.c 201247 2009-12-30 05:59:21Z kientzle $"); /* Execute the following to rebuild the data for this program: diff --git a/libarchive/test/test_compat_lzma_1.tlz.uu b/libarchive/test/test_compat_lzma_1.tlz.uu index 57fa501f00df..ceee3b979069 100644 --- a/libarchive/test/test_compat_lzma_1.tlz.uu +++ b/libarchive/test/test_compat_lzma_1.tlz.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_compat_lzma_1.tlz.uu 201247 2009-12-30 05:59:21Z kientzle $ - begin 644 test_compat_lzma_1.tlz M70``@`#__________P`S##P;IXPT!HUK`DO\DC[V2OB%Z^'=ZT59ANYMTD(/ M^W;\8!%O7<+P&=#(9W<_!$Z.7/Y<&\(8+E0^,_-\Z"D^P'N0J^4-UH"WMJ<& diff --git a/libarchive/test/test_compat_lzma_2.tlz.uu b/libarchive/test/test_compat_lzma_2.tlz.uu index ff91d2a608fe..b57d990fe333 100644 --- a/libarchive/test/test_compat_lzma_2.tlz.uu +++ b/libarchive/test/test_compat_lzma_2.tlz.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_compat_lzma_2.tlz.uu 201247 2009-12-30 05:59:21Z kientzle $ - begin 644 test_compat_lzma_2.tlz M7@``@`#__________P`S##P;IXPT!HUK`DO\DC[V2OB%Z^'<FN`(!=!,)@8W M9R(6\QIOTA6SGM20X;2'6#3B&HC%2XOX2?D['5WD"`>`W2"/3R1F1:P:&Q9A diff --git a/libarchive/test/test_compat_lzma_3.tlz.uu b/libarchive/test/test_compat_lzma_3.tlz.uu index bee82897beb1..1976f364d211 100644 --- a/libarchive/test/test_compat_lzma_3.tlz.uu +++ b/libarchive/test/test_compat_lzma_3.tlz.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_compat_lzma_3.tlz.uu 201247 2009-12-30 05:59:21Z kientzle $ - begin 644 test_compat_lzma_3.tlz M70`0````'``````````S##P;IXPT!HUK`DO\DC[V2OB%Z^'=ZT59ANYMTD(1 M$Y^=;\4%U_CXKQ*F$OFZKEQUG)1U8="](V<2K"U1\Z6%H(UNQ[Y3.=D'>_G- diff --git a/libarchive/test/test_compat_lzop.c b/libarchive/test/test_compat_lzop.c index cd43afcf3e99..2da4e8eb6dc2 100644 --- a/libarchive/test/test_compat_lzop.c +++ b/libarchive/test/test_compat_lzop.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Verify our ability to read sample files compatibly with lzop. diff --git a/libarchive/test/test_compat_mac.c b/libarchive/test/test_compat_mac.c index 5caa17f83e63..976f04a473f6 100644 --- a/libarchive/test/test_compat_mac.c +++ b/libarchive/test/test_compat_mac.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* The sample has some files in a directory with a very long name. */ #define TESTPATH "abcdefghijklmnopqrstuvwxyz/" \ diff --git a/libarchive/test/test_compat_perl_archive_tar.c b/libarchive/test/test_compat_perl_archive_tar.c index 165a519a3432..94abe3f056a3 100644 --- a/libarchive/test/test_compat_perl_archive_tar.c +++ b/libarchive/test/test_compat_perl_archive_tar.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); /* * Verify our ability to read sample files created by Perl module Archive::Tar diff --git a/libarchive/test/test_compat_plexus_archiver_tar.c b/libarchive/test/test_compat_plexus_archiver_tar.c index 0f8bedc2df5f..419e84b1c4c9 100644 --- a/libarchive/test/test_compat_plexus_archiver_tar.c +++ b/libarchive/test/test_compat_plexus_archiver_tar.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); /* * Verify our ability to read sample files created by plexus-archiver version diff --git a/libarchive/test/test_compat_solaris_pax_sparse.c b/libarchive/test/test_compat_solaris_pax_sparse.c index 0ab333bb180b..c25c4eb8f51e 100644 --- a/libarchive/test/test_compat_solaris_pax_sparse.c +++ b/libarchive/test/test_compat_solaris_pax_sparse.c @@ -23,8 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); - /* * Verify our ability to read sample files created by Solaris pax for * a sparse file. diff --git a/libarchive/test/test_compat_solaris_tar_acl.c b/libarchive/test/test_compat_solaris_tar_acl.c index 815977290670..df7435c7cbec 100644 --- a/libarchive/test/test_compat_solaris_tar_acl.c +++ b/libarchive/test/test_compat_solaris_tar_acl.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Verify reading entries with POSIX.1e and NFSv4 ACLs from archives created diff --git a/libarchive/test/test_compat_star_acl.c b/libarchive/test/test_compat_star_acl.c index 824710194c18..749f5ce34294 100644 --- a/libarchive/test/test_compat_star_acl.c +++ b/libarchive/test/test_compat_star_acl.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Verify reading entries with POSIX.1e and NFSv4 ACLs from archives created diff --git a/libarchive/test/test_compat_tar_directory.c b/libarchive/test/test_compat_tar_directory.c index 5750db3628e3..3d086f1da7bc 100644 --- a/libarchive/test/test_compat_tar_directory.c +++ b/libarchive/test/test_compat_tar_directory.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Background: Original tar file format did not use its linkflag to diff --git a/libarchive/test/test_compat_tar_directory_1.tar.uu b/libarchive/test/test_compat_tar_directory_1.tar.uu index 3e1ead9b5172..513d55ffcb78 100644 --- a/libarchive/test/test_compat_tar_directory_1.tar.uu +++ b/libarchive/test/test_compat_tar_directory_1.tar.uu @@ -1,4 +1,3 @@ -$FreeBSD$ begin 644 test_compat_tar_directory_1.tar M9&ER96-T;W)Y,2\````````````````````````````````````````````` M```````````````````````````````````````````````````````````` diff --git a/libarchive/test/test_compat_tar_hardlink.c b/libarchive/test/test_compat_tar_hardlink.c index 73a4d54f97fa..b8517440aea5 100644 --- a/libarchive/test/test_compat_tar_hardlink.c +++ b/libarchive/test/test_compat_tar_hardlink.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_compat_tar_hardlink.c,v 1.3 2008/08/11 01:19:36 kientzle Exp $"); /* * Background: There are two written standards for the tar file format. diff --git a/libarchive/test/test_compat_tar_hardlink_1.tar.uu b/libarchive/test/test_compat_tar_hardlink_1.tar.uu index 95dba54c256e..eeb31786da7e 100644 --- a/libarchive/test/test_compat_tar_hardlink_1.tar.uu +++ b/libarchive/test/test_compat_tar_hardlink_1.tar.uu @@ -1,4 +1,3 @@ -$FreeBSD: src/lib/libarchive/test/test_compat_tar_hardlink_1.tar.uu,v 1.1 2008/01/31 07:47:38 kientzle Exp $ begin 644 test_compat_tar_hardlink_1.tar M>&UC9"TS+C,N,B]D;V-S7V0O4D5!1$UF```````````````````````````` M```````````````````````````````````````````````````````````` diff --git a/libarchive/test/test_compat_uudecode.c b/libarchive/test/test_compat_uudecode.c index cfb17c85788d..d6936d9dcd5d 100644 --- a/libarchive/test/test_compat_uudecode.c +++ b/libarchive/test/test_compat_uudecode.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static char archive_data[] = { "begin 644 test_read_uu.Z\n" diff --git a/libarchive/test/test_compat_uudecode_large.c b/libarchive/test/test_compat_uudecode_large.c index a2ffd22663a5..c4ab0ec3fd0d 100644 --- a/libarchive/test/test_compat_uudecode_large.c +++ b/libarchive/test/test_compat_uudecode_large.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_compat_uudecode_large) { diff --git a/libarchive/test/test_compat_xz.c b/libarchive/test/test_compat_xz.c index 572729c48542..f904583782d2 100644 --- a/libarchive/test/test_compat_xz.c +++ b/libarchive/test/test_compat_xz.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_compat_xz.c 191183 2009-04-17 01:06:31Z kientzle $"); /* * Verify our ability to read sample files compatibly with unxz. diff --git a/libarchive/test/test_compat_xz_1.txz.uu b/libarchive/test/test_compat_xz_1.txz.uu index 9d4b8e8ee6d6..af47f4eee314 100644 --- a/libarchive/test/test_compat_xz_1.txz.uu +++ b/libarchive/test/test_compat_xz_1.txz.uu @@ -1,5 +1,4 @@ -$FreeBSD: head/lib/libarchive/test/test_compat_xz_1.txz.uu 191183 2009-04-17 01:06:31Z kientzle $ -begin 644 test_compat_gzip_1.txz +begin 644 test_compat_xz_1.txz M_3=Z6%H```3FUK1&`@`A`18```!T+^6CX`^?`(-=`#,,/!NGC#0&C6L"2_R2 M/O9*^(7KX=WM^(=KA(RH"\09$$)!Q_+JUHQ*`]R;ITL_F3/I6:^Q0550A&)B MHS@=K]7@K1-9FOIP#PU!I<PUHW+W#<F(6FSL/<?5:4*>?E5&IHH&Q=N>_C&G diff --git a/libarchive/test/test_compat_zip.c b/libarchive/test/test_compat_zip.c index 813ea5dc6701..e2d41cc9b439 100644 --- a/libarchive/test/test_compat_zip.c +++ b/libarchive/test/test_compat_zip.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_compat_zip.c 196962 2009-09-08 05:02:41Z kientzle $"); /* Copy this function for each test file and adjust it accordingly. */ DEFINE_TEST(test_compat_zip_1) diff --git a/libarchive/test/test_compat_zip_1.zip.uu b/libarchive/test/test_compat_zip_1.zip.uu index 29cdf96b029b..e13a6cac29d9 100644 --- a/libarchive/test/test_compat_zip_1.zip.uu +++ b/libarchive/test/test_compat_zip_1.zip.uu @@ -1,4 +1,3 @@ -$FreeBSD: src/lib/libarchive/test/test_compat_zip_1.zip.uu,v 1.2 2008/06/30 15:49:12 des Exp $ begin 644 test_compat_zip_1.zip M4$L#!!0`"``(``B$@S<````````````````4````345402U)3D8O34%.249% M4U0N34;S3<S+3$LM+M$-2RTJSLS/LU(PU#/@Y7+,0Q)Q+$A,SDA5`(H!)<U! diff --git a/libarchive/test/test_compat_zip_8.zip.uu b/libarchive/test/test_compat_zip_8.zip.uu index 316b6f62d4bb..2ab6cf70c670 100644 --- a/libarchive/test/test_compat_zip_8.zip.uu +++ b/libarchive/test/test_compat_zip_8.zip.uu @@ -1,6 +1,6 @@ -begin 666 test_compat_zip_8.zip
-M4$L#!!0````(`%A\;TOY6""D$`````X````(````87)C7'1E<W3[_Z^$(96A
-MF*&$@9>!BP$`4$L!`A0`%`````@`6'QO2_E8(*00````#@````@`````````
-H`````````````&%R8UQT97-T4$L%!@`````!``$`-@```#8`````````
-`
-end
+begin 666 test_compat_zip_8.zip +M4$L#!!0````(`%A\;TOY6""D$`````X````(````87)C7'1E<W3[_Z^$(96A +MF*&$@9>!BP$`4$L!`A0`%`````@`6'QO2_E8(*00````#@````@````````` +H`````````````&%R8UQT97-T4$L%!@`````!``$`-@```#8````````` +` +end diff --git a/libarchive/test/test_compat_zstd.c b/libarchive/test/test_compat_zstd.c index 134775816a94..34b8edeb924d 100644 --- a/libarchive/test/test_compat_zstd.c +++ b/libarchive/test/test_compat_zstd.c @@ -23,8 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); - /* * Verify our ability to read sample files compatibly with 'zstd -d'. * diff --git a/libarchive/test/test_empty_write.c b/libarchive/test/test_empty_write.c index a983df503993..b5572f73d77a 100644 --- a/libarchive/test/test_empty_write.c +++ b/libarchive/test/test_empty_write.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_empty_write.c 189308 2009-03-03 17:02:51Z kientzle $"); DEFINE_TEST(test_empty_write) { diff --git a/libarchive/test/test_entry.c b/libarchive/test/test_entry.c index f20576490a5f..228fdd8bcc56 100644 --- a/libarchive/test/test_entry.c +++ b/libarchive/test/test_entry.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_entry.c 201247 2009-12-30 05:59:21Z kientzle $"); #include <locale.h> diff --git a/libarchive/test/test_entry_strmode.c b/libarchive/test/test_entry_strmode.c index ba183db025af..abeed4c483b2 100644 --- a/libarchive/test/test_entry_strmode.c +++ b/libarchive/test/test_entry_strmode.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_entry_strmode.c 201247 2009-12-30 05:59:21Z kientzle $"); DEFINE_TEST(test_entry_strmode) { diff --git a/libarchive/test/test_extattr_freebsd.c b/libarchive/test/test_extattr_freebsd.c index 7cb30b56067a..9d9a26e9d9f9 100644 --- a/libarchive/test/test_extattr_freebsd.c +++ b/libarchive/test/test_extattr_freebsd.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_extattr_freebsd.c 201247 2009-12-30 05:59:21Z kientzle $"); #if defined(__FreeBSD__) && __FreeBSD__ > 4 #include <sys/extattr.h> diff --git a/libarchive/test/test_filter_count.c b/libarchive/test/test_filter_count.c index 4885ab89a52e..8b28795ee0d5 100644 --- a/libarchive/test/test_filter_count.c +++ b/libarchive/test/test_filter_count.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_file_nonexistent.c 189473 2009-03-07 02:09:21Z kientzle $"); static void read_test(const char *name); static void write_test(void); diff --git a/libarchive/test/test_fuzz.c b/libarchive/test/test_fuzz.c index 3fbe64410bc4..dcb4f73ca372 100644 --- a/libarchive/test/test_fuzz.c +++ b/libarchive/test/test_fuzz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_fuzz.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * This was inspired by an ISO fuzz tester written by Michal Zalewski @@ -124,10 +123,9 @@ test_fuzz(const struct files *filesets) newraw = realloc(rawimage, oldsize + size); if (!assert(newraw != NULL)) { - free(rawimage); - rawimage = NULL; free(tmp); - continue; + size = 0; + break; } rawimage = newraw; memcpy(rawimage + oldsize, tmp, size); diff --git a/libarchive/test/test_fuzz_1.iso.Z.uu b/libarchive/test/test_fuzz_1.iso.Z.uu index 07a3e934da43..0eb3f7deb4ce 100644 --- a/libarchive/test/test_fuzz_1.iso.Z.uu +++ b/libarchive/test/test_fuzz_1.iso.Z.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_fuzz_1.iso.Z.uu 201247 2009-12-30 05:59:21Z kientzle $ - begin 644 test_fuzz_1.iso.Z M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR MI,F3*%.J7,FRI<N7,&/*G$FSILV;.'/JW,FSI\^?0(,*'4JTJ-&C2),J7<JT diff --git a/libarchive/test/test_gnutar_filename_encoding.c b/libarchive/test/test_gnutar_filename_encoding.c index 3ec4f61290f8..f473ddfb4fe9 100644 --- a/libarchive/test/test_gnutar_filename_encoding.c +++ b/libarchive/test/test_gnutar_filename_encoding.c @@ -23,8 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); - #include <locale.h> DEFINE_TEST(test_gnutar_filename_encoding_UTF8_CP866) diff --git a/libarchive/test/test_link_resolver.c b/libarchive/test/test_link_resolver.c index 8332c4f985bd..5bea9a463b30 100644 --- a/libarchive/test/test_link_resolver.c +++ b/libarchive/test/test_link_resolver.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_link_resolver.c,v 1.2 2008/06/15 04:31:43 kientzle Exp $"); static void test_linkify_tar(void) { diff --git a/libarchive/test/test_open_failure.c b/libarchive/test/test_open_failure.c index 5316a872b6a8..a8eedadc95fe 100644 --- a/libarchive/test/test_open_failure.c +++ b/libarchive/test/test_open_failure.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #define MAGIC 123456789 struct my_data { diff --git a/libarchive/test/test_open_fd.c b/libarchive/test/test_open_fd.c index 7da8b5ebcb56..bd73fb36197f 100644 --- a/libarchive/test/test_open_fd.c +++ b/libarchive/test/test_open_fd.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_open_fd.c 201247 2009-12-30 05:59:21Z kientzle $"); #if defined(_WIN32) && !defined(__CYGWIN__) #define open _open diff --git a/libarchive/test/test_open_file.c b/libarchive/test/test_open_file.c index bee4b3b4835b..f4ca82bb01a0 100644 --- a/libarchive/test/test_open_file.c +++ b/libarchive/test/test_open_file.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_open_file.c 201247 2009-12-30 05:59:21Z kientzle $"); DEFINE_TEST(test_open_file) { diff --git a/libarchive/test/test_open_filename.c b/libarchive/test/test_open_filename.c index 91afce244ae4..09a83690be0d 100644 --- a/libarchive/test/test_open_filename.c +++ b/libarchive/test/test_open_filename.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_open_filename.c 191183 2009-04-17 01:06:31Z kientzle $"); static void test_open_filename_mbs(void) diff --git a/libarchive/test/test_pax_filename_encoding.c b/libarchive/test/test_pax_filename_encoding.c index 2fb7f452d54f..737641c5abca 100644 --- a/libarchive/test/test_pax_filename_encoding.c +++ b/libarchive/test/test_pax_filename_encoding.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_pax_filename_encoding.c 201247 2009-12-30 05:59:21Z kientzle $"); #include <locale.h> diff --git a/libarchive/test/test_pax_filename_encoding.tar.uu b/libarchive/test/test_pax_filename_encoding.tar.uu index 47db18915698..1c221fd6be20 100644 --- a/libarchive/test/test_pax_filename_encoding.tar.uu +++ b/libarchive/test/test_pax_filename_encoding.tar.uu @@ -1,4 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_pax_filename_encoding.tar.uu 191183 2009-04-17 01:06:31Z kientzle $ begin 644 test_pax_filename_encoding.tar M4&%X2&5A9&5R+V%B8\R,;6YO6'AY>@`````````````````````````````` M```````````````````````````````````````````````````````````` diff --git a/libarchive/test/test_pax_xattr_header.c b/libarchive/test/test_pax_xattr_header.c index d0394aa09eda..8af81079ea7e 100644 --- a/libarchive/test/test_pax_xattr_header.c +++ b/libarchive/test/test_pax_xattr_header.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static struct archive_entry* create_archive_entry(void) { diff --git a/libarchive/test/test_rar_multivolume_single_file.part1.rar.uu b/libarchive/test/test_rar_multivolume_single_file.part1.rar.uu index 22b5c8dfa3e8..b2afdf152a48 100644 --- a/libarchive/test/test_rar_multivolume_single_file.part1.rar.uu +++ b/libarchive/test/test_rar_multivolume_single_file.part1.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_rar_multivolume_single_file.part1.rar M4F%R(1H'`%IN<Q$!#0````````"(KG0BD$,`[1H``(].```#D,J\!?-C(4`4 M,!D`I($``$QI8F%R8VAI=F5!9&1I;F=497-T+FAT;6S`S/-C(4#T8R%`/"%$ M3T-465!%($A434P@4%5"3$E#("(M+R]7,T,O+T141"!(5$U,(#0N,"!4<F%N diff --git a/libarchive/test/test_rar_multivolume_single_file.part2.rar.uu b/libarchive/test/test_rar_multivolume_single_file.part2.rar.uu index e00e06cb278e..615698bdefb3 100644 --- a/libarchive/test/test_rar_multivolume_single_file.part2.rar.uu +++ b/libarchive/test/test_rar_multivolume_single_file.part2.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_rar_multivolume_single_file.part2.rar M4F%R(1H'`!EZ<Q$`#0````````#7@W0CD$,`[1H``(].```#.)1.%?-C(4`4 M,!D`I($``$QI8F%R8VAI=F5!9&1I;F=497-T+FAT;6S`S/-C(4#T8R%`*0IG M96YE<F%T92!D971A:6QE9"!L;V<@;65S<V%G97,@;VX@9F%I;'5R92X@26X@ diff --git a/libarchive/test/test_rar_multivolume_single_file.part3.rar.uu b/libarchive/test/test_rar_multivolume_single_file.part3.rar.uu index 06e72a790dab..63c984782e1d 100644 --- a/libarchive/test/test_rar_multivolume_single_file.part3.rar.uu +++ b/libarchive/test/test_rar_multivolume_single_file.part3.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_rar_multivolume_single_file.part3.rar M4F%R(1H'`!EZ<Q$`#0`````````?;70AD$,`M1@``(].```#8Z8%7O-C(4`4 M,!D`I($``$QI8F%R8VAI=F5!9&1I;F=497-T+FAT;6S`S/-C(4#T8R%`=7-U M86QL>2!R=6X*"6%L;"!O9B!T:&4@=&5S=',N(`H)/"]0/@H)/$Q)/CQ0(%-4 diff --git a/libarchive/test/test_rar_multivolume_uncompressed_files.part01.rar.uu b/libarchive/test/test_rar_multivolume_uncompressed_files.part01.rar.uu index 876b7e9acbd1..b583f86f869e 100644 --- a/libarchive/test/test_rar_multivolume_uncompressed_files.part01.rar.uu +++ b/libarchive/test/test_rar_multivolume_uncompressed_files.part01.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_rar_multivolume_uncompressed_files.part01.rar M4F%R(1H'`%IN<Q$!#0````````"G@W0BD$P`C#,``(].```#]EC4PKM,-4$4 M,"(`I($``'1E<W1D:7)<3&EB87)C:&EV94%D9&EN9U1E<W0R+FAT;6R`S#)? M.T)17SM"/"%$3T-465!%($A434P@4%5"3$E#("(M+R]7,T,O+T141"!(5$U, diff --git a/libarchive/test/test_rar_multivolume_uncompressed_files.part02.rar.uu b/libarchive/test/test_rar_multivolume_uncompressed_files.part02.rar.uu index 97e826ee7a64..fdf944443a07 100644 --- a/libarchive/test/test_rar_multivolume_uncompressed_files.part02.rar.uu +++ b/libarchive/test/test_rar_multivolume_uncompressed_files.part02.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_rar_multivolume_uncompressed_files.part02.rar M4F%R(1H'`!EZ<Q$`#0````````#G!'0AD$P``QL``(].```#8Z8%7KM,-4$4 M,"(`I($``'1E<W1D:7)<3&EB87)C:&EV94%D9&EN9U1E<W0R+FAT;6R`S#)? M.T)17SM"(&%S<V5R=$5Q=6%L365M('1O('1E<W0@97%U86QI='D@:6YS=&5A diff --git a/libarchive/test/test_rar_multivolume_uncompressed_files.part03.rar.uu b/libarchive/test/test_rar_multivolume_uncompressed_files.part03.rar.uu index 027f050889fd..caf9e7569bd6 100644 --- a/libarchive/test/test_rar_multivolume_uncompressed_files.part03.rar.uu +++ b/libarchive/test/test_rar_multivolume_uncompressed_files.part03.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_rar_multivolume_uncompressed_files.part03.rar M4F%R(1H'`!EZ<Q$`#0````````"P,W0CD%<`@3,``(].```#*23KD;M,-4$4 M,"T`I($``'1E<W1D:7)<=&5S='-U8F1I<EQ,:6)A<F-H:79E061D:6YG5&5S M=#(N:'1M;,#,,U\[0F-?.T)I;VYS+B!)9B!T:&4@87-S97)T:6]N(&9A:6QS diff --git a/libarchive/test/test_rar_multivolume_uncompressed_files.part04.rar.uu b/libarchive/test/test_rar_multivolume_uncompressed_files.part04.rar.uu index be9a921bc33c..1e645fe35aa2 100644 --- a/libarchive/test/test_rar_multivolume_uncompressed_files.part04.rar.uu +++ b/libarchive/test/test_rar_multivolume_uncompressed_files.part04.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_rar_multivolume_uncompressed_files.part04.rar M4F%R(1H'`!EZ<Q$`#0````````!K>G0AD%<`W`(``(].```#8Z8%7KM,-4$4 M,"T`I($``'1E<W1D:7)<=&5S='-U8F1I<EQ,:6)A<F-H:79E061D:6YG5&5S M=#(N:'1M;,#,,U\[0F-?.T)B>0IT:&4@87)C:&EV92!W<FET97(@:7,@=&AE diff --git a/libarchive/test/test_rar_multivolume_uncompressed_files.part05.rar.uu b/libarchive/test/test_rar_multivolume_uncompressed_files.part05.rar.uu index 0891b2285b0c..eb271f063a64 100644 --- a/libarchive/test/test_rar_multivolume_uncompressed_files.part05.rar.uu +++ b/libarchive/test/test_rar_multivolume_uncompressed_files.part05.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_rar_multivolume_uncompressed_files.part05.rar M4F%R(1H'`!EZ<Q$`#0````````!U''0AD$0`+AX``(].```#8Z8%7KM,-4$4 M,!H`I($``$QI8F%R8VAI=F5!9&1I;F=497-T,BYH=&ULP,P)7SM",E\[0F9E M<F5N8V5?9FEL92@F<75O=#MT97-T7V9O;RYT87(F<75O=#LI.SPO4%)%/CQ0 diff --git a/libarchive/test/test_rar_multivolume_uncompressed_files.part06.rar.uu b/libarchive/test/test_rar_multivolume_uncompressed_files.part06.rar.uu index 6511cb68c6af..c63065865a0e 100644 --- a/libarchive/test/test_rar_multivolume_uncompressed_files.part06.rar.uu +++ b/libarchive/test/test_rar_multivolume_uncompressed_files.part06.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_rar_multivolume_uncompressed_files.part06.rar M4F%R(1H'`!EZ<Q$`#0`````````*JW0CD$L`C3,``(].```#8\SY_?-C(4`4 M,"$`I($``'1E<W1D:7)<3&EB87)C:&EV94%D9&EN9U1E<W0N:'1M;(#,,E\[ M0DU?.T(N+B!S971U<"!O;6ET=&5D("XN+B`J+PHF;F)S<#L@)FYB<W`[(&%S diff --git a/libarchive/test/test_rar_multivolume_uncompressed_files.part07.rar.uu b/libarchive/test/test_rar_multivolume_uncompressed_files.part07.rar.uu index fa3206266ce4..c7dab1b886e9 100644 --- a/libarchive/test/test_rar_multivolume_uncompressed_files.part07.rar.uu +++ b/libarchive/test/test_rar_multivolume_uncompressed_files.part07.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_rar_multivolume_uncompressed_files.part07.rar M4F%R(1H'`!EZ<Q$`#0````````!*\70AD$L`YP4``(].```#8Z8%7O-C(4`4 M,"$`I($``'1E<W1D:7)<3&EB87)C:&EV94%D9&EN9U1E<W0N:'1M;(#,,E\[ M0DU?.T)I=&@@82!D;WIE;B!E;G1R:65S(&1O=VX@=&\*:G5S="!A(&9E=R!K diff --git a/libarchive/test/test_rar_multivolume_uncompressed_files.part08.rar.uu b/libarchive/test/test_rar_multivolume_uncompressed_files.part08.rar.uu index e8e0ffe8c57e..9e53660ed0c5 100644 --- a/libarchive/test/test_rar_multivolume_uncompressed_files.part08.rar.uu +++ b/libarchive/test/test_rar_multivolume_uncompressed_files.part08.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_rar_multivolume_uncompressed_files.part08.rar M4F%R(1H'`!EZ<Q$`#0````````#I1G0AD%8`/R$``(].```#8Z8%7O-C(4`4 M,"P`I($``'1E<W1D:7)<=&5S='-U8F1I<EQ,:6)A<F-H:79E061D:6YG5&5S M="YH=&ULP,PS7SM"6U\[0D-O;G1E;G1S/"]45#XL"@D\5%0@0TQ!4U,](G=E diff --git a/libarchive/test/test_rar_multivolume_uncompressed_files.part09.rar.uu b/libarchive/test/test_rar_multivolume_uncompressed_files.part09.rar.uu index bdcdc999c4d6..c2d890401e69 100644 --- a/libarchive/test/test_rar_multivolume_uncompressed_files.part09.rar.uu +++ b/libarchive/test/test_rar_multivolume_uncompressed_files.part09.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_rar_multivolume_uncompressed_files.part09.rar M4F%R(1H'`!EZ<Q$`#0````````"N!'0CD$,`E3,``(].```#97_()_-C(4`4 M,!D`I($``$QI8F%R8VAI=F5!9&1I;F=497-T+FAT;6S`S`E?.T(R7SM"4STB M=V5S=&5R;B(^/$$@3D%-13TB0F%S:6-?=&5S=%]T97)M:6YO;&]G>2(^/"]! diff --git a/libarchive/test/test_rar_multivolume_uncompressed_files.part10.rar.uu b/libarchive/test/test_rar_multivolume_uncompressed_files.part10.rar.uu index aef15d214a21..66c22262e189 100644 --- a/libarchive/test/test_rar_multivolume_uncompressed_files.part10.rar.uu +++ b/libarchive/test/test_rar_multivolume_uncompressed_files.part10.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_rar_multivolume_uncompressed_files.part10.rar M4F%R(1H'`!EZ<Q$`#0`````````5)G0AD$,`^@@``(].```#8Z8%7O-C(4`4 M,!D`I($``$QI8F%R8VAI=F5!9&1I;F=497-T+FAT;6S`S`E?.T(R7SM"97AE M<F-I<V4@8F]U;F1A<GD@8V%S97,@=VET:"!V97)Y"FQA<F=E(&5N=')I97,L diff --git a/libarchive/test/test_read_data_large.c b/libarchive/test/test_read_data_large.c index a86bcc08ff6b..59cbfd496ca9 100644 --- a/libarchive/test/test_read_data_large.c +++ b/libarchive/test/test_read_data_large.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_data_large.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * Test read/write of a 10M block of data in a single operation. diff --git a/libarchive/test/test_read_disk.c b/libarchive/test/test_read_disk.c index 43d7d86bab24..24349574a7a2 100644 --- a/libarchive/test/test_read_disk.c +++ b/libarchive/test/test_read_disk.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_disk.c 201247 2009-12-30 05:59:21Z kientzle $"); static void gname_cleanup(void *d) diff --git a/libarchive/test/test_read_disk_directory_traversals.c b/libarchive/test/test_read_disk_directory_traversals.c index bca3ce518e21..009c9a8db1e1 100644 --- a/libarchive/test/test_read_disk_directory_traversals.c +++ b/libarchive/test/test_read_disk_directory_traversals.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #include <limits.h> #if defined(_WIN32) && !defined(__CYGWIN__) @@ -1608,6 +1607,12 @@ test_parent(void) int file_count; int match_count; int r; +#if defined(O_PATH) || defined(O_SEARCH) || \ + (defined(__FreeBSD__) && defined(O_EXEC)) + const char *ignore_traversals_test4; + + ignore_traversals_test4 = getenv("IGNORE_TRAVERSALS_TEST4"); +#endif assertMakeDir("lock", 0311); assertMakeDir("lock/dir1", 0755); @@ -1784,7 +1789,8 @@ test_parent(void) if (r == ARCHIVE_FAILED) { #if defined(O_PATH) || defined(O_SEARCH) || \ (defined(__FreeBSD__) && defined(O_EXEC)) - assertEqualIntA(a, ARCHIVE_OK, r); + if (ignore_traversals_test4 == NULL) + assertEqualIntA(a, ARCHIVE_OK, r); #endif /* Close the disk object. */ archive_read_close(a); diff --git a/libarchive/test/test_read_disk_entry_from_file.c b/libarchive/test/test_read_disk_entry_from_file.c index 7a41034ac37e..386c3c48ebf4 100644 --- a/libarchive/test/test_read_disk_entry_from_file.c +++ b/libarchive/test/test_read_disk_entry_from_file.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_disk_entry_from_file.c 201247 2009-12-30 05:59:21Z kientzle $"); static const char * gname_lookup(void *d, int64_t g) diff --git a/libarchive/test/test_read_extract.c b/libarchive/test/test_read_extract.c index da0f2265a02b..32c1b6b18142 100644 --- a/libarchive/test/test_read_extract.c +++ b/libarchive/test/test_read_extract.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_extract.c 201247 2009-12-30 05:59:21Z kientzle $"); #define BUFF_SIZE 1000000 #define FILE_BUFF_SIZE 100000 diff --git a/libarchive/test/test_read_file_nonexistent.c b/libarchive/test/test_read_file_nonexistent.c index acb72a1e32cc..4a6d5d266227 100644 --- a/libarchive/test/test_read_file_nonexistent.c +++ b/libarchive/test/test_read_file_nonexistent.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_file_nonexistent.c 189473 2009-03-07 02:09:21Z kientzle $"); DEFINE_TEST(test_read_file_nonexistent) { diff --git a/libarchive/test/test_read_filter_lrzip.tar.lrz.uu b/libarchive/test/test_read_filter_lrzip.tar.lrz.uu index d9bbd6116e0a..2272c2778e82 100644 --- a/libarchive/test/test_read_filter_lrzip.tar.lrz.uu +++ b/libarchive/test/test_read_filter_lrzip.tar.lrz.uu @@ -1,4 +1,4 @@ -begin 644 test_read_filter_lrzip.tar.lrz.uu +begin 644 test_read_filter_lrzip.tar.lrz M3%):20`&`"@``````````%T````!`0```@$`*`,`````#@`#`````&4`!E`` MAP``````*(%=%O"2=0L1MCAA@GB4H1+_)V=!8=DS/0JC4Z+Q&5I0A'\SJ-#. M$U<4K-:^%:G^C3$B/80>END]NJE=5AP+]64N7$3):G02EKP>+AD`!IH`HQ(` diff --git a/libarchive/test/test_read_filter_program.c b/libarchive/test/test_read_filter_program.c index a27589a146c9..18b42121cc22 100644 --- a/libarchive/test/test_read_filter_program.c +++ b/libarchive/test/test_read_filter_program.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_compress_program.c 201247 2009-12-30 05:59:21Z kientzle $"); static unsigned char archive[] = { 31,139,8,0,222,'C','p','C',0,3,211,'c',160,'=','0','0','0','0','7','5','U', diff --git a/libarchive/test/test_read_filter_program_signature.c b/libarchive/test/test_read_filter_program_signature.c index 110addb87fe9..46909f97ab9e 100644 --- a/libarchive/test/test_read_filter_program_signature.c +++ b/libarchive/test/test_read_filter_program_signature.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static unsigned char archive[] = { 31,139,8,0,222,'C','p','C',0,3,211,'c',160,'=','0','0','0','0','7','5','U', diff --git a/libarchive/test/test_read_filter_uudecode.c b/libarchive/test/test_read_filter_uudecode.c index ac2eff59f794..1bc9385c3f6a 100644 --- a/libarchive/test/test_read_filter_uudecode.c +++ b/libarchive/test/test_read_filter_uudecode.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_uu.c 201248 2009-12-30 06:12:03Z kientzle $"); static const char archive[] = { "begin 644 test_read_uu.Z\n" diff --git a/libarchive/test/test_read_filter_uudecode_base64_raw.uu b/libarchive/test/test_read_filter_uudecode_base64_raw.uu new file mode 100644 index 000000000000..b4ddfb0a22e8 --- /dev/null +++ b/libarchive/test/test_read_filter_uudecode_base64_raw.uu @@ -0,0 +1,11 @@ +begin-base64 600 LICENSE2.txt +VEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIOKAnEFTIElT4oCdLCBXSVRIT1VUIFdBUlJBTlRZIE9G +IEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQg +VE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJ +Q1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg +QVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFN +QUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNU +LCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElP +TiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBT +T0ZUV0FSRS4K +==== diff --git a/libarchive/test/test_read_filter_uudecode_raw.c b/libarchive/test/test_read_filter_uudecode_raw.c new file mode 100644 index 000000000000..6f02dc5de147 --- /dev/null +++ b/libarchive/test/test_read_filter_uudecode_raw.c @@ -0,0 +1,67 @@ +/*- + * Copyright (c) 2023 Martin Matuska + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +DEFINE_TEST(test_read_filter_uudecode_raw) +{ + struct archive_entry *ae; + struct archive *a; + + const char *name = "test_read_filter_uudecode_raw.uu"; + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_raw(a)); + copy_reference_file(name); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 670)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("LICENSE.txt", archive_entry_pathname(ae)); + assertEqualInt((AE_IFREG | 0755), archive_entry_mode(ae)); + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + +DEFINE_TEST(test_read_filter_uudecode_base64_raw) +{ + struct archive_entry *ae; + struct archive *a; + + const char *name = "test_read_filter_uudecode_base64_raw.uu"; + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_raw(a)); + copy_reference_file(name); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 670)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("LICENSE2.txt", archive_entry_pathname(ae)); + assertEqualInt((AE_IFREG | 0600), archive_entry_mode(ae)); + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} diff --git a/libarchive/test/test_read_filter_uudecode_raw.uu b/libarchive/test/test_read_filter_uudecode_raw.uu new file mode 100644 index 000000000000..8a5f8b5a607d --- /dev/null +++ b/libarchive/test/test_read_filter_uudecode_raw.uu @@ -0,0 +1,14 @@ +begin 755 LICENSE.txt +M5$A%(%-/1E1705)%($E3(%!23U9)1$5$(.*`G$%3($E3XH"=+"!7251(3U54 +M(%=!4E)!3E19($]&($%.62!+24Y$+"!%6%!215-3($]2($E-4$Q)140L($E. +M0TQ51$E.1R!"550@3D]4($Q)34E4140@5$\@5$A%(%=!4E)!3E1)15,@3T8@ +M34520TA!3E1!0DE,2519+"!&251.15-3($9/4B!!(%!!4E1)0U5,05(@4%52 +M4$]312!!3D0@3D].24Y&4DE.1T5-14Y4+B!)3B!.3R!%5D5.5"!32$%,3"!4 +M2$4@05542$]24R!/4B!#3U!94DE'2%0@2$],1$524R!"12!,24%"3$4@1D]2 +M($%.62!#3$%)32P@1$%-04=%4R!/4B!/5$A%4B!,24%"24Q)5%DL(%=(151( +M15(@24X@04X@04-424].($]&($-/3E1204-4+"!43U)4($]2($]42$525TE3 +M12P@05))4TE.1R!&4D]-+"!/550@3T8@3U(@24X@0T].3D5#5$E/3B!7251( +M(%1(12!33T945T%212!/4B!42$4@55-%($]2($]42$52($1%04Q)3D=3($E. +/(%1(12!33T945T%212X* +` +end diff --git a/libarchive/test/test_read_format_7zip.c b/libarchive/test/test_read_format_7zip.c index 3c72595aeef7..9f76705deaf2 100644 --- a/libarchive/test/test_read_format_7zip.c +++ b/libarchive/test/test_read_format_7zip.c @@ -23,13 +23,15 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); #if defined(_WIN32) && !defined(__CYGWIN__) #define close _close #define open _open #endif +#define __LIBARCHIVE_BUILD +#include <archive_crc32.h> + /* * Extract a non-encoded file. * The header of the 7z archive files is not encoded. @@ -58,7 +60,7 @@ test_copy(int use_open_fd) /* Verify regular file1. */ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); - assertEqualInt((AE_IFREG | 0666), archive_entry_mode(ae)); + assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); assertEqualString("file1", archive_entry_pathname(ae)); assertEqualInt(86401, archive_entry_mtime(ae)); assertEqualInt(60, archive_entry_size(ae)); @@ -284,6 +286,141 @@ test_extract_all_files(const char *refname) } /* + * Extract multi files. + * Like test_extract_all_files, but with zstandard compression. + */ +static void +test_extract_all_files_zstd(const char *refname) +{ + struct archive_entry *ae; + struct archive *a; + char buff[128]; + + extract_reference_file(refname); + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, refname, 10240)); + + /* Verify directory dir1. Note that this comes before the dir1/file1 entry in recent versions of 7-Zip. */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt((AE_IFDIR | 0755), archive_entry_mode(ae)); + assertEqualString("dir1/", archive_entry_pathname(ae)); + assertEqualInt(2764801, archive_entry_mtime(ae)); + assertEqualInt(archive_entry_is_encrypted(ae), 0); + assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0); + + /* Verify regular file1. */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); + assertEqualString("dir1/file1", archive_entry_pathname(ae)); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(13, archive_entry_size(ae)); + assertEqualInt(archive_entry_is_encrypted(ae), 0); + assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0); + assertEqualInt(13, archive_read_data(a, buff, sizeof(buff))); + assertEqualMem(buff, "aaaaaaaaaaaa\n", 13); + + /* Verify regular file2. */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); + assertEqualString("file2", archive_entry_pathname(ae)); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(26, archive_entry_size(ae)); + assertEqualInt(archive_entry_is_encrypted(ae), 0); + assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0); + assertEqualInt(26, archive_read_data(a, buff, sizeof(buff))); + assertEqualMem(buff, "aaaaaaaaaaaa\nbbbbbbbbbbbb\n", 26); + + /* Verify regular file3. */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); + assertEqualString("file3", archive_entry_pathname(ae)); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(39, archive_entry_size(ae)); + assertEqualInt(archive_entry_is_encrypted(ae), 0); + assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0); + assertEqualInt(39, archive_read_data(a, buff, sizeof(buff))); + assertEqualMem(buff, "aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\n", 39); + + /* Verify regular file4. */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); + assertEqualString("file4", archive_entry_pathname(ae)); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(52, archive_entry_size(ae)); + assertEqualInt(archive_entry_is_encrypted(ae), 0); + assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0); + assertEqualInt(52, archive_read_data(a, buff, sizeof(buff))); + assertEqualMem(buff, + "aaaaaaaaaaaa\nbbbbbbbbbbbb\ncccccccccccc\ndddddddddddd\n", 52); + + assertEqualInt(5, archive_file_count(a)); + + /* End of archive. */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + /* Verify archive format. */ + assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); + assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a)); + + /* Close the archive. */ + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + +/* + * Extract file from an archives using ZSTD compression with and without BCJ. + */ +static void +test_extract_file_zstd_bcj_nobjc(const char *refname) +{ + struct archive_entry *ae; + struct archive *a; + char buff[4096]; + uint32_t computed_crc = 0; + uint32_t expected_crc = 0xbd66eebc; + + extract_reference_file(refname); + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, refname, 10240)); + + /* Verify regular file: hw. */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt((AE_IFREG | 0775), archive_entry_mode(ae)); + assertEqualString("hw", archive_entry_pathname(ae)); + assertEqualInt(1685913368, archive_entry_mtime(ae)); + assertEqualInt(15952, archive_entry_size(ae)); + assertEqualInt(archive_entry_is_encrypted(ae), 0); + assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0); + + for (;;) { + la_ssize_t bytes_read = archive_read_data(a, buff, sizeof(buff)); + assert(bytes_read >= 0); + if (bytes_read == 0) break; + computed_crc = crc32(computed_crc, buff, bytes_read); + } + assertEqualInt(computed_crc, expected_crc); + + assertEqualInt(1, archive_file_count(a)); + + /* End of archive. */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + /* Verify archive format. */ + assertEqualIntA(a, ARCHIVE_FILTER_NONE, archive_filter_code(a, 0)); + assertEqualIntA(a, ARCHIVE_FORMAT_7ZIP, archive_format(a)); + + /* Close the archive. */ + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + +/* * Extract last file. * The header of the 7z archive files is encoded with LZMA. */ @@ -627,7 +764,7 @@ test_ppmd(void) /* Verify regular file1. */ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); - assertEqualInt((AE_IFREG | 0666), archive_entry_mode(ae)); + assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); assertEqualString("ppmd_test.txt", archive_entry_pathname(ae)); assertEqualInt(1322464589, archive_entry_mtime(ae)); assertEqualInt(102400, archive_entry_size(ae)); @@ -782,6 +919,74 @@ DEFINE_TEST(test_read_format_7zip_deflate) assertEqualInt(ARCHIVE_OK, archive_read_free(a)); } +DEFINE_TEST(test_read_format_7zip_zstd) +{ + struct archive *a; + + assert((a = archive_read_new()) != NULL); + + /* Extracting with libzstd */ + if (ARCHIVE_OK != archive_read_support_filter_zstd(a)) { + skipping( + "7zip:zstd decoding is not supported on this platform"); + } else { + test_extract_all_files_zstd("test_read_format_7zip_zstd.7z"); + } + + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + +DEFINE_TEST(test_read_format_7zip_zstd_solid) +{ + struct archive *a; + + assert((a = archive_read_new()) != NULL); + + /* Extracting with libzstd */ + if (ARCHIVE_OK != archive_read_support_filter_zstd(a)) { + skipping( + "7zip:zstd decoding is not supported on this platform"); + } else { + test_extract_all_files_zstd("test_read_format_7zip_solid_zstd.7z"); + } + + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + +DEFINE_TEST(test_read_format_7zip_zstd_bcj) +{ + struct archive *a; + + assert((a = archive_read_new()) != NULL); + + /* Extracting with libzstd */ + if (ARCHIVE_OK != archive_read_support_filter_zstd(a)) { + skipping( + "7zip:zstd decoding is not supported on this platform"); + } else { + test_extract_file_zstd_bcj_nobjc("test_read_format_7zip_zstd_bcj.7z"); + } + + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + +DEFINE_TEST(test_read_format_7zip_zstd_nobcj) +{ + struct archive *a; + + assert((a = archive_read_new()) != NULL); + + /* Extracting with libzstd */ + if (ARCHIVE_OK != archive_read_support_filter_zstd(a)) { + skipping( + "7zip:zstd decoding is not supported on this platform"); + } else { + test_extract_file_zstd_bcj_nobjc("test_read_format_7zip_zstd_nobcj.7z"); + } + + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + DEFINE_TEST(test_read_format_7zip_empty) { test_empty_archive(); @@ -832,7 +1037,223 @@ DEFINE_TEST(test_read_format_7zip_lzma2) assertEqualInt(ARCHIVE_OK, archive_read_free(a)); } +static void +test_arm_filter(const char *refname) +{ + struct archive *a; + struct archive_entry *ae; + char buff[7804]; + uint32_t computed_crc = 0; + uint32_t expected_crc = 0x355ec4e1; + + assert((a = archive_read_new()) != NULL); + + extract_reference_file(refname); + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, refname, 10240)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt((AE_IFREG | 0755), archive_entry_mode(ae)); + assertEqualString("hw-gnueabihf", archive_entry_pathname(ae)); + assertEqualInt(sizeof(buff), archive_entry_size(ae)); + assertEqualInt(sizeof(buff), archive_read_data(a, buff, sizeof(buff))); + computed_crc = crc32(computed_crc, buff, sizeof(buff)); + assertEqualInt(computed_crc, expected_crc); + + assertEqualInt(1, archive_file_count(a)); + + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + +DEFINE_TEST(test_read_format_7zip_zstd_arm) +{ + struct archive *a; + + assert((a = archive_read_new()) != NULL); + + if (ARCHIVE_OK != archive_read_support_filter_zstd(a)) { + skipping( + "7zip:zstd decoding is not supported on this platform"); + } else { + test_arm_filter("test_read_format_7zip_zstd_arm.7z"); + } + + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + +DEFINE_TEST(test_read_format_7zip_lzma2_arm) +{ + struct archive *a; + + assert((a = archive_read_new()) != NULL); + + if (ARCHIVE_OK != archive_read_support_filter_lzma(a)) { + skipping( + "7zip:lzma decoding is not supported on this platform"); + } else { + test_arm_filter("test_read_format_7zip_lzma2_arm.7z"); + } + + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + DEFINE_TEST(test_read_format_7zip_ppmd) { test_ppmd(); } + +static void +test_arm64_filter(const char *refname) +{ + struct archive *a; + struct archive_entry *ae; + char buff[70368]; + uint32_t computed_crc = 0; + uint32_t expected_crc = 0xde97d594; + + assert((a = archive_read_new()) != NULL); + + extract_reference_file(refname); + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, refname, 10240)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt((AE_IFREG | 0775), archive_entry_mode(ae)); + assertEqualString("hw-arm64", archive_entry_pathname(ae)); + assertEqualInt(sizeof(buff), archive_entry_size(ae)); + assertEqualInt(sizeof(buff), archive_read_data(a, buff, sizeof(buff))); + computed_crc = crc32(computed_crc, buff, sizeof(buff)); + assertEqualInt(computed_crc, expected_crc); + + assertEqualInt(1, archive_file_count(a)); + + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + +DEFINE_TEST(test_read_format_7zip_lzma2_arm64) +{ +#ifdef HAVE_LZMA_FILTER_ARM64 + struct archive *a; + + assert((a = archive_read_new()) != NULL); + + if (ARCHIVE_OK != archive_read_support_filter_lzma(a)) { + skipping( + "7zip:lzma decoding is not supported on this platform"); + } else { + test_arm64_filter("test_read_format_7zip_lzma2_arm64.7z"); + } + + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +#else + skipping("This version of liblzma does not support LZMA_FILTER_ARM64"); +#endif +} + +DEFINE_TEST(test_read_format_7zip_deflate_arm64) +{ + struct archive *a; + + assert((a = archive_read_new()) != NULL); + + if (ARCHIVE_OK != archive_read_support_filter_gzip(a)) { + skipping( + "7zip:deflate decoding is not supported on this platform"); + } else { + test_arm64_filter("test_read_format_7zip_deflate_arm64.7z"); + } + + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + +DEFINE_TEST(test_read_format_7zip_win_attrib) +{ + struct archive *a; + + assert((a = archive_read_new()) != NULL); + + if (ARCHIVE_OK != archive_read_support_filter_lzma(a)) { + skipping( + "7zip:lzma decoding is not supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + return; + } + + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + + // This archive has four files and four directories: + // * hidden directory + // * readonly directory + // * regular directory + // * system directory + // * regular "archive" file + // * hidden file + // * readonly file + // * system file + const char *refname = "test_read_format_7zip_win_attrib.7z"; + extract_reference_file(refname); + + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, refname, 10240)); + + struct archive_entry *ae; + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("hidden_dir/", archive_entry_pathname(ae)); + assertEqualInt((AE_IFDIR | 0755), archive_entry_mode(ae)); + assertEqualString("hidden", archive_entry_fflags_text(ae)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("readonly_dir/", archive_entry_pathname(ae)); + assertEqualInt((AE_IFDIR | 0555), archive_entry_mode(ae)); + assertEqualString("rdonly", archive_entry_fflags_text(ae)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("regular_dir/", archive_entry_pathname(ae)); + assertEqualInt((AE_IFDIR | 0755), archive_entry_mode(ae)); + assertEqualString(NULL, archive_entry_fflags_text(ae)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("system_dir/", archive_entry_pathname(ae)); + assertEqualInt((AE_IFDIR | 0755), archive_entry_mode(ae)); + assertEqualString("system", archive_entry_fflags_text(ae)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("archive_file.txt", archive_entry_pathname(ae)); + assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); + assertEqualString(NULL, archive_entry_fflags_text(ae)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("hidden_file.txt", archive_entry_pathname(ae)); + assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); + assertEqualString("hidden", archive_entry_fflags_text(ae)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("readonly_file.txt", archive_entry_pathname(ae)); + assertEqualInt((AE_IFREG | 0444), archive_entry_mode(ae)); + assertEqualString("rdonly", archive_entry_fflags_text(ae)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("system_file.txt", archive_entry_pathname(ae)); + assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); + assertEqualString("system", archive_entry_fflags_text(ae)); + + + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} diff --git a/libarchive/test/test_read_format_7zip_copy.7z.uu b/libarchive/test/test_read_format_7zip_copy.7z.uu index 2429834c26dc..92e7c5867ab2 100644 --- a/libarchive/test/test_read_format_7zip_copy.7z.uu +++ b/libarchive/test/test_read_format_7zip_copy.7z.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_7zip_none.7z +begin 644 test_read_format_7zip_copy.7z M-WJ\KR<<``-!QGV(/`````````!"`````````(/;BV,@("`@("`@("`@("`@ M("`@("`@("`@("`@(&9I;&4@,2!C;VYT96YT<PIH96QL;PIH96QL;PIH96QL M;PH!!`8``0D\``<+`0`!`0`,/``("@&J'=X/```%`1$-`&8`:0!L`&4`,0`` diff --git a/libarchive/test/test_read_format_7zip_deflate_arm64.7z.uu b/libarchive/test/test_read_format_7zip_deflate_arm64.7z.uu new file mode 100644 index 000000000000..2199d921b549 --- /dev/null +++ b/libarchive/test/test_read_format_7zip_deflate_arm64.7z.uu @@ -0,0 +1,64 @@ +begin 664 test_read_format_7zip_deflate_arm64.7z +M-WJ\KR<<``2V^52G)0H```````!:`````````.HY+B_LU5^(3%$<P/%SYPY+ +M_N1?*/]F5R'Y3_['&'^&0FB]T9BU@ZFQH]F1#65X4C:9"`](HI`'#PHO_N5! +M>2.2T-J0XF&*!R-C_.Z=<^_<NSLKWK^?]MS?GM\]OW//W'ONS*&5:U<%#$,Y +M3'5;6;UP[TH_K/,=_:RLDYNO^LIQM!JEK&%!=USW^,/PQS[.=73=_(`<ND>9 +MV1\-3^RE>M;>QXU.A7.TUWJB)`<[&KZ8T]<]&O#7!73=1:O.CH8O%NQ0C<YE +M@[HUVO-UCRN4/P9UW/`QVVS]?[E.#C7B8J5CE[J-4M=;_;M!.FZRKO>7^[)' +MUEN-U><P/95LFIYJGII*MNQMFQJ/9[;OFCMG6FMZVLS*FH;I9QQ=OUE]G#AY +MPO$S5]KO[MVZ^,;!A0-:?S;L">HU&)4Q[IZH<^Z^V_Z?J?JI.[UJY8?;3]2E +MG^V0&G.LDQ:JD1\IK:%&/MG#^(D]S&_TD&_K/H]^`'NSK2H6D]N^/=::C6>R +ML=WQ9(MDMK?%8SN2+?%4<G]"Q9O2F:RR!EG/8JZ*KET361Z;-6WF//??V7-4 +M;$WCNEAS(I/8F6S-)C*-ZY:GTBV)QGA3*B$3[MR=;M&7B%6&UAQ8$9!/8MK- +MK#POR4SU[*\S^=.]K3L_3^=N2=^JBBC_?C.#>O_K#7#6EZ]NC$+9GV^L<]Z[ +M@,[[^Z_T>$/R\N?J<//^[Y//GKSW??KAR??UY*_J?"!H?<JJFTZ^R_QWG'R7 +M^1]X\G6>_!-/OH\G/RYDOB@=N'^M9*K\>4.=*AUX>/6!&7M9D%Q!;M/@9]'B +MH"-+\J'`N)?66*?9YU[*N4N5<W;_M?0?>?KOI-_IZ7=*/["TVO\D_8:E[MQC +M5.[96&D?377]O1DN=HY7^4^RK@X9JWY$BZ:<"TH[*.L\*LW.?X\6P[(=/I3+ +M(V3=[AIE`YV0'X^\(;%>XE*EOCR0Q_Q>:NJ_1HMQJ2F8QG4EU[;JNHZO5^II +MPZ]#SY?U/WRL_M>RDP]E?*?41GY%BTUV;<"MK=S#>_8]_-9/%8?*'-LBX05A +M0\VSUUB(%G-28U\C&"[F9.V7I854;M.VB%KPK5^X6#KPZ*IW_6_D\SAS=HQ3 +M=]_+O-8V5]O&YMNE5DEMM:;Z#)WG9^A]NRN12J5#^]*95+,R1IF+YNOOJG._ +MR^4-$K]*;)8XNEPN6]\96R2V2[PA\::U_R0^]KR'QOY-*M@VUAC5?YR=&REM +MA<PQQSJYK&ZLE9LB+2>Y&9[?B+"^IO-[$[+>.6M?2FZU73LP=#YXP8R<#*Q_ +M]_;Y0*?.6M-W&>.\<Z.E6>O[(+E)GKK5[]X.5``````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````#PIQUK"7$B"*(ULY_$__\O$M2#"@F; +M]2^"&_^"/S0*(MI,,K.;T62R3"::50\>!/6@B'A8!$'0@X('3^)1;QX4/`I> +M5-23@H(?5#36))79Z4EE=P_B:=[2>>G75=7=-36]F0D1(D2($"%"A`@1(D2( +M$"%"C`I[(U`'L4+=./%XXH<==9Y`_3-D/X?Z5W[7/>=1/TH\EWB0QN<'QK_^ +MJ19KXRK4T$'ZG;8Z=S;FI_&QU+]*/(YX-O$,D-'66%]5J;%*_0KQ=/_V$;.( +M>SID_6R[O.Y'Q&,"\R\`V>Y7M;X_A:0_U-]+\:K>>!V?J+^.QG]0OQW^+YYW +MC(YOXG4=#ND(L(C2E=BV:=.ZV)(#F;+EE&/)Y?'NKN[E7=W)E?%DN:9U+T4U +MT95(QAHCL25&I=^PS8)A.5I^:>QP02LYAAVST7OEVK5KXWW+>U<G,VNZ5ZY= +M91R!4:`-%%BC<KH*:4['OPJKM\,@JW?`0U;OQ#KG]`A>?TZ/PEY6'P-G67TL +MUC&GCX.'K#X>GK/Z!.CIY/2)>`YP^B2XPNJ3X3:K3X%7K#[5.U=D?1H,LOIT +MN,GJ,_#^Y_29^*DR^BR8S.JS(0BE=F]^KH($.A>8.AGO^OCT&.DS`4%Y;HXS +M!;Y$&)W)\QQ^/5Y\QQ^?YE=]^G3)7JX33V>N>YR?UXOSI$6<"X$X*T98_Y7` +M^C=@4QD]1?HC-I\SZ?P90IKL(;">8]@47STH_CA,'9YP;1C]!L7?RUU'IL[O +M8E-(Y^HA&F7B,'7[9-CZG`2#$3[/Z0A?A[GHZ*Y7P_Y"P/X9-H5T&7R<EZX] +MZL'[^BT@F//D.]D_KRK-^V+.MPF*F_UF+$,]!LVXZ.K,N;$5]<E,_M.H+X1F +MG"'[V0%[JZ;/;(I3=M>I-M]WIUO$.>_JS#JOM=C7+=2GJ,WWQ?T6^7GLVOO. +MG_;&[X86]J]:K/.2:^\[]U:0_JZ%_<<6>?Y!<1IUNX3T/[2OH/U8E<_#8M7- +M,_/_<7_6=I*)(BS600@M8PI'ZX/%%4#91#FKY?/BI*$=%[V6JUFH(96<<F]O +M(@NZ81M]IOL[13@%D<T7+:.$<?2BZ,L7,UI>Z$[1+@FMC`&+A?Z\X1AZHHNW +M$+VF90K-MK4!@;^![`'HM;6"(?1RH3"`+KZ>0$M',LV=Q-4(L75?:M<6L67W +M9B%`;#ZT.[5KQR:4M^T^(+9LI]'MF_>!V+9SS\;43K%GZ];]6](BG=JX<PMZ +MB+R9R8J2H]F.*&BFU;-MYXZ-FT1W8OD*$#O2N\30?M.[-KF[36N9O(&.F5*) +M_-PPV8KF[D;+FZ<,+T9R-0A#UQP-:CLE)\/2:R[N0#T"=OH*1<L73B\514ZS +M=)Q)RQ1M1PJY8P]:ZJ8ERB5#A_ZR4Y*&,3X(FL6W3'"WAP)N@])5VQ^[NUJV +M`1*E@8*C99`=N\ZYQC?30I]^2%A%QTCT6>5$IFSF];BIDY3:N"/NUE5M+*>5 +M<I#0!RR,5V.,4A\Y8=@ELVA)'8%CMI'77$/ZUI]WW"E-_'2,"GZZZ<2Q8BVY +M"2-'I9+3[:$>>G@U4_=H?,?`6L',XJQ%C%6/@7F"!%:L^V,<_@7F85-\I]8: +MU6,:EZ&`C$78(C[_M"KSXJ;_.3)6!?PKJLRQ$?PW8_N&SVP-_T%5YOFD=WC/ +M03)VTS.MZCWWROR)]$YL;3[_V<0'25>]YVB9KXZ0OZ/8JK[UKVN7>7I@_6J` +MCV/[X_/?VRYSEV_]"K/_4Y33AO_9=ID?^>=G]G^._#=ZS_$R5WS^,QC_R[2N +M3N^]A\RS1[C^%QO^+9ZC^T'&9)!Q+>#?TRGS>@4D](",ZP'_,Q&9IX^P_IN! +M^^]*Q&/9OT7]W@GXWX[(O'Z$^1\$_%]%9+[7>GZO/B9B:Y/?2R'S]M$`/\4V +M:<B??L<CC]+_A7=O>N]'B.G^5:C^/3^Y#E[3_GWOK8@;]3/\_.]E?U\F%9IG +M^/Q](*W-6Y=*K'#VJ,KX3%H7>)#\-=9?9A6:42&+GNC0>\44<_^.\=8NXV&T +M[K],'7[]4UKXOQE;M_P)P_O_!0$$!@`!"8HE``<+`0`"`P0!"`$*`0`,P>`2 +MP>`2``@*`935E]X```4!&0(``!$3`&@`=P`M`&$`<@!M`#8`-````!D`%`H! +3`#)5M-E?M]D!%08!`""`_8$````` +` +end diff --git a/libarchive/test/test_read_format_7zip_encryption_data.c b/libarchive/test/test_read_format_7zip_encryption_data.c index adedbc5311c6..653044a46317 100644 --- a/libarchive/test/test_read_format_7zip_encryption_data.c +++ b/libarchive/test/test_read_format_7zip_encryption_data.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); DEFINE_TEST(test_read_format_7zip_encryption_data) { diff --git a/libarchive/test/test_read_format_7zip_encryption_header.c b/libarchive/test/test_read_format_7zip_encryption_header.c index 7d2a4a8d7de4..d0c48044ea5e 100644 --- a/libarchive/test/test_read_format_7zip_encryption_header.c +++ b/libarchive/test/test_read_format_7zip_encryption_header.c @@ -23,8 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); - DEFINE_TEST(test_read_format_7zip_encryption_header) { diff --git a/libarchive/test/test_read_format_7zip_encryption_partially.c b/libarchive/test/test_read_format_7zip_encryption_partially.c index 68290aa64fd9..51a6c06116d7 100644 --- a/libarchive/test/test_read_format_7zip_encryption_partially.c +++ b/libarchive/test/test_read_format_7zip_encryption_partially.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); DEFINE_TEST(test_read_format_7zip_encryption_partially) { diff --git a/libarchive/test/test_read_format_7zip_lzma2_arm.7z.uu b/libarchive/test/test_read_format_7zip_lzma2_arm.7z.uu new file mode 100644 index 000000000000..5a6ade031f22 --- /dev/null +++ b/libarchive/test/test_read_format_7zip_lzma2_arm.7z.uu @@ -0,0 +1,50 @@ +begin 664 test_read_format_7zip_lzma2_arm.7z +M-WJ\KR<<``3J_$W1N`<```````!B`````````.JU,0K@'GL'L%T`/Y%%A&@[ +MWMZF$<*4U"093^%DJ=J._J..`X9!2RX<PW^KV'J:BRK]Q@`9?>NX6*J`]\W5 +MV'E1<]9A1&J5D`#J!0K[IET\(=96D87RO?!\YQ>LH!0''871$*/B-@-70EJ0 +M`;\!OE9CF-^[@!DI0LA7Z5P`#.!8`&65OAKG.CZ"F_H1?0DF"U1TA(*8<K$Y +M"`*`&0@9W/J=9Q65I#T7A=LV)A'W8Q6[]T`[8.HQ,<*'Y=%CCL4UL$N;V&GM +MI7RJ;]"A19(O_OR+.K]#3$*$G*^<SN`@%$X^!18W$Y+"$FIZ9)G"S=N3P=MY +M@23KT_,1!2PF)J^TCK3^5BSV3W)6C:UM*;1D!?PAH?98?NIW3O*]ML<LU?8( +ME0(M;`*!0>JEQ>/>U8FBB]^E)QG>MQ_<EC_YO:6#IW1:YGQZ'#(?[%-S&E3` +M>LLWD%-YVI_%$>)09X;WO&$[MP(</^*QI;<0E?AA^"+H/%V:Z`]$HE('A,*@ +M,>[#E"AI4U,3VSH@/S*]#&EGP37GQ_#W*+P:2"&0(O=$S'+O'75NH+-'ZI&2 +M9W^I\?.Y`$T4YPC[ETIN9KTL\>"^-]*+([,!RK2%12BUU!TRF!5:8B?]<3K' +M1/*E5"22231Q(@S6P/`GO*EAHOGEC)B5=%X;>B*\-D*4#KGX(2,,P4)Q\PQ< +M?L=SG>R/AC>SH1S1_FUK7"#5\]0&QR9`];@`YS*UH9Q@P^S977+E@_P<I6:% +MV\9WL&_6E6J$T"1^]-_8C1\,X@29SIR(EJ\O:44&+X/%<$?10J8IR(&%AF]. +M;`+F2G45L/XC-@7U;H=RHM974^T46;FT[:G6,,,P]"10P=GVT5+BV1)_YV=B +M<\B/L"<*&$L@!/P<Q$WJ_V,L(LC941!U;DB(])_;Y7DS-#'M(`!%3000`RRJ +MSE1^5+W]-KSJGZ#GT3O>`0KHZO?1>:7[4.RMGB]SF\_BQFC89B)!U68-_]72 +MY'BDKM\E;<Q49A+\Z/CYP1;`KR7+G]W_08*13H%=,X1;R;/2^#=BVX4X8I'F +M'T?*[;I,B-"91D!&8&\#R_<GHH'7\J@OD=H?SM_W=?N*@SS-$3.!,MFC%0HQ +M7-]>]&4Z%FR?TOR2'H[7X@Y6`M+Q@![*&M9W!0F#^@UO(8TK]U#-8<-I\2$7 +M#?WC\89&95YI\\`DXII"-P@0IQJ:L4]:O*=@V!W58(_#7%9L4BR8-<$P`4S# +MJX#Y/>DIDB#/<S%?1)1#LCP@U968H3'-IR#YC8FQ-3C)Z?):2-`3K03?OEY/ +M3.<T(#E'C4&*,%M6LSQO7A`>.0DY67H@K60XS/*(46/U*%P?G\R_U#/(0%OF +M6B#:U+X9)8*I`.^U(`PKV^7%B=?Z%GP^8CQV8V#'_1?L2KB>;6>!N.8LI>3_ +M%)-N+<;/(+J(QI_U+9C&*VDR9)8X/!5R+N8W6N84NN@'S<J]QRE@GK>9P>KC +MN]XGR&MK!GN<HK%VC/V9OW_0(^T#&6OF+@T>V=Y(MV+YS=QEYQ-,':9VRQ^N +M<?,"^Q>PC!ALZ:]"J8\:9T.Y28?K^B>@@5(:I]M>EFH%-#Z>BRBL(L)]_J#F +MT7U4C[62SWU-_0&#JECK.K2F9Z/5_U\6"K2[$'8K*N!+?`(T`:3BN$=LA)7? +MS`:MK/59JR@1*#FE_'[X+C68S<AFM@Y/G0;^@IM-;&D`?X#.F=B/S'>P*%RH +MGV(2K8@W&^<"%O>`1]-6ODEC`^X__^'#-E9'<`F-W+^-/#*=00[^ER5/Z%<; +M<5>252LEY6L`C9Q:-4^3!XGD]CGO,-XD<B+!HVLXE7<&/+BVK#G.=ZEK#8:G +M=;<?5[UYQ576&(G[V8"PV&-*Y3:*A.<H1X]+J)J@)=KQBT&XAA<1A=JT61F= +M-B&4]P%7U1"[6[=5:\'WY8QN#Z,N.G(&2L:%K]%<)ZY@*^CN!Z[#Y<6+G>LT +M.;'"/12=:`C.Z+3G1-&=R-!O#5,V.W'"C9:N4?==ODY8#*:V;QL.N$ZR'R30 +M>U5QC/A0M`TOK9EX6PZ03U<?.D&.[%6Z($\PB;7M\A6V$P"YRO+\N`?8J;X[ +MJ[8\E=5>*3E;4527?8OP\+9NXTSDP.-ML`U\:36)X[JXOZ],_M[4ZD"D0T.7 +M3C*M=YOXBE!`I5-VO'3:YUR-42G):6"01XCG5%O]H17JJJQM8A<<,3RS8CI- +MT7FK7"\1P9GO?#3O07):>\L_RHRH?]3Z#W42TX43Z=2HC/8M!<N0+!")FIB% +MV?`J$WI4FYZW":A^MEWJ;@B_>H]),JTZ-@/"U#%4-Q#G9EP-$Y^]=$>X70[D +MCP*^+R.X5U[;%+0P8JWW)`P#'VE[%=I>G;TGBX!_**[`)D9.JV9DAAYM[`"# +M0]"E%F5%X?]_%@,>,Y*W"%H.!H6KV`7H>4&=7BX&?6K$"V@"*\#2BVIL.FH9 +M_YP"D5UNL[$1$U$GLQROKS__F*#'PH`%ZC5^,0\)'D&S:;?)8`W<F_<-'U5& +M[#<10!!3-G8TP#$/A-+X9)OJ@3KY$/#%F9C-O]K6DXQG<.AE*)N?>EYT,8"? +M1]-Z'S1^IEL/*WJ-LQ\;?%QQ8/*JUY93:52Y,XHJNY<;Q.GRQ`&ZY5)H9'2< +MVT<0P98-*4HW2:\I<\W>0HW2E[B9D8LYS:````$$!@`!"8>X``<+`0`"(2$! +M`@0#`P4!`0`,GGR>?``("@'AQ%XU```%`1D!`!$;`&@`=P`M`&<`;@!U`&4` +D80!B`&D`:`!F````&0`4"@$```-.&5"<V0$5!@$`((#M@0`` +` +end diff --git a/libarchive/test/test_read_format_7zip_lzma2_arm64.7z.uu b/libarchive/test/test_read_format_7zip_lzma2_arm64.7z.uu new file mode 100644 index 000000000000..34025b8431ad --- /dev/null +++ b/libarchive/test/test_read_format_7zip_lzma2_arm64.7z.uu @@ -0,0 +1,54 @@ +begin 664 test_read_format_7zip_lzma2_arm64.7z +M-WJ\KR<<``0W'TW><P@```````!:`````````&'_J;[A$M\(:UT`/Y%%A&@] +MB:;:BN&&(J+"URDYX#ZEJ=1:R[LP;*R_8L2:_5F_1<^DV<8-2,=3[&X?U.=W +M*%Q!?DN>B^),$C`%""HM.8#>=`<R:?!<.$B$K6X!RY4*=X/2*.1;F86;KQ[4 +MW?4E#8Q06ZC4C+\8[JXT3(^1NKD"QCKT^=KB=;)Q=SIF6<^4QB+`Z)=$I>#! +MHGG`);CBW],\(2H/P+,[60V#BSUD@SPX?+]7UE`-G%X8-3UI(38JH=H'>(C4 +M.BHYW!+WO_VP/@H5V?EN8ESQEC<5V/WV[($3WNDOW%0OV?,5D(VX$W,9F]X6 +M$@+,!DJ9MCLG?+981]+>4RH&\+O6N:Z[J\UUAP1\;YX=FQG04]%"*WE/:)&N +M7]/;*`CB"$1/1LN;6/@^--#D_P_@^=I7&LU`$C*&]O)XY16O/YBAT\L2Q!M6 +MZ,^,_"DV_%G"4[;]`8E`Y>_4'B-G'SBG0\P#T504(#V)73,/E2#B3I7=S".' +MT?4S]U]05SC_GJUAE*!NK%8\&=\',!%JIL5J>;6'O[D[_5JVE7>4<QH4'CLU +M68W>\(D]JBL8$[^!T?<88]&GF&D!J76?C\!TV:R8*BQ,2%*"NX6^-J!7;)H[ +M,VL2_VSHEIU&_VR#)=O81/7B?&1://2C9_O[-3*X(-,H(QI$N8$/CSMR0_PU +MF+&[-\:YPQ-V_/\D'K<+P1?:NF3DC@(W0X+$X,HG8*-0_+3@`07IT`9`RZO> +M=4MI;EB=PHN\-U*#KN5B^JX'^8EFYG-3'H?CITKDVRN+'.(ABHXGW.51@<$J +MTX]Z-:0Y]$8M))->TGEHM">WLYXA/P.=F-)"H)_M7B5FK,I=7R&:5F=A^H:\ +M<C&)=DJR[6.-:6D+UO*R*E5(I1@<`XBX#_)(:\AWE018L%55"44+!<UF8XH" +M2PE#->"U3HG2Y>^C\3P&?0,F/>+S1<<,$W5!DW#+5:DT!&H>R]*HYAL;3=`9 +MG-6=ZO*O/-T<0GY[;.-GK`F4@EZ(HL.JR%:.V(7[VY:.`?"47U/P;N",R)G" +M%MX4UG$88O@.`;_;(1W&"==@<5,SMBD.R7>ITI@G5OR14O5NB?*E!["2KU6: +MH+P#/KA.)R4]DLK9W^<7&2RL#EF40DU1*VS`"A%7D5^"M`OB.0W5*_<#5K7* +MR'D05`R:?G3Q$`L;B5>KD\B"A%!FAV9F[BA2=I^AWD%J7`WFL7T,T%?%VI^; +M]0`QABMO4"3N3&-",I^)1E`Z61GN*(E7I&+P'2/Z$W,Q4^P3@1\Z01D"VYZ! +MZ]*!@]@/<"ZSHHN2'Z66_/Q1';U/W@:5/JY).$#*$JYEYOXW:DD&\7,"\NUZ +M*R7JO?D$*$NX)#AFK5F&$ZS<ON8N\<8ZI>`,HKM4&XRP,+WL+W:X2X<LR1IP +M\LUM.MA;?@6K(>98<OK=M=W'##O?9?+'[HNT<L089[:PE`(@A&JS#-N(RY8P +MKZP-G:6Y`4UQ,J?7N[H%+%K76C'_YN`??Y;ST/-;EE&8U$"]PQHF8.T5B2$R +M5.5<9Z4N".'9.@D;MD-`[#=B0-M_ZA^6O86*0`E=6GYLN3]\8N#(:R<C=</+ +M3&:'%QFF:O6K+D4SW.LUMRV_HRMS44P:^B0;9H#PEG+GZ*_SN&M,TE1OI9)U +MXU(CEY;4^S-SL,HMTV4C5/0K]0EH5>SA`L."U<Z?33_&H4WW2S)Q2Z=(Y^'A +M[5$+O_=WBN=[!3^07QD02;IL3F"\;31TYAC?19=V0<G<-).;,0L/+4';2.AC +M=S*,I40D-9QB=2R4D0D]YM*`K3_L$,ZD;ZHOFY5Q7(/]/%(\Z_Z*LY^R)"Y; +MFFXA8_UNAWRT-?#T#7J,V`(`CO1[1TS(FF;,M(-/EO'M$JI_'=(M9;V3XH4< +M>XPSOZY<".O^LP->K,4?Z-"*L#Z[P#"4,UW54G>W0KX/!21G-DW010]NZ54" +MT?"[+_BDNGN7B2'-)K$-,Q;L3<*/`/+A_EM-CG,CZT>TOP.1(>#99CO&/97= +MB[##0N[?U\)&U'1(]0C<X.`=LAM&_A*8SB_ADF,WP?*[URFV`;TZZ<Z+:\!Z +M)?@S#7OGKQ%,FO\[C.>FGJ2>AXP_3RLI*,:V)B$I-<88"C66?>!/I0-YKR[, +M,(`W)51UA>T26X/6.,4;@!NGC*;0VLT(3KS2Z>(RX'MC'$C+I1BBR!)!)C1* +M!AZ7_:5Q_RI!L!3"6M0;8&NO0V2HYVA,"18X1IW+/I9?$B,06BS=Z#B<$J,U +M-GI\,NTS)(%MEW#FI%Q,1ZU30VDFO38M=_@*<2-HT`H>8VF^;V6!0,8*T'5/ +MS(?V9HD%DO;K^EOY8MB'_7J6P=+7MGT:AAH>E977IC9\\<$?0X0CKH-,^Y5$ +MPG(L?(8VYY=8"QMC)#MW)JL9?(`E$Q-65D_!\FG\A]NOX"3KECRR&I/I,-_L +MY&!L^F*E(.H&^C3[CL?KK2\S60UD3W[E,,NZ1Y^*&S@5U6J#BIL,-/Q?VP9< +M,5*R?(?<6J69T=K\E=)Y6T0$(RM!_S!38A6'S"CCI=F<`'?6/*5KS2L7ON'B +M:!)QKWUW%-N6`)K7@<="%O@E[$=W9+<WQ,5V8_P\\3RL5R0Z'"4CCM9>1;A, +M+'*KT@O#)$%J/;W$T,J!'NA?2G7F<Q?P3A-U5<G`SRO,BZO\1R[AX06C#4"C +M^HL.TL"TRML`Y"K\@_@6[#[_-&WYX5L`/;WN+%=^=&DL="4<UHF*!/4.A?5W +M]77R*6A0X>7GK88KT1(K\Q52<<(!S6;SKP4H#K%(SYK0`B,Y-/&7\3]CZ/'( +M0@61%II0K.Q,&R`2$K'#I8'B(J0'\20($ONEJ2AXW;-'V3AP;9ME^L7JBW46 +M!+9%;M7.G(>CLF;A8*'@X"+832%9%WXO^K*>?/(]*..3\@`!!`8``0F(<P`' +M"P$``B$A`0D!"@$`#,'@$L'@$@`("@&4U9?>```%`1D"```1$P!H`'<`+0!A +C`'(`;0`V`#0````9`!0*`0`R5;397[?9`14&`0`@@/V!```` +` +end diff --git a/libarchive/test/test_read_format_7zip_malformed.c b/libarchive/test/test_read_format_7zip_malformed.c index 4ca6f0913e35..f2120879fa8c 100644 --- a/libarchive/test/test_read_format_7zip_malformed.c +++ b/libarchive/test/test_read_format_7zip_malformed.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static void test_malformed1(void) diff --git a/libarchive/test/test_read_format_7zip_packinfo_digests.c b/libarchive/test/test_read_format_7zip_packinfo_digests.c index 7f105d1f2806..e46a17b3b1da 100644 --- a/libarchive/test/test_read_format_7zip_packinfo_digests.c +++ b/libarchive/test/test_read_format_7zip_packinfo_digests.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); /* Read archive with digests in PackInfo */ DEFINE_TEST(test_read_format_7zip_packinfo_digests) @@ -49,7 +48,7 @@ DEFINE_TEST(test_read_format_7zip_packinfo_digests) /* Verify regular file1. */ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); - assertEqualInt((AE_IFREG | 0666), archive_entry_mode(ae)); + assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); assertEqualString("a.txt", archive_entry_pathname(ae)); assertEqualInt(1576808819, archive_entry_mtime(ae)); assertEqualInt(4, archive_entry_size(ae)); @@ -61,7 +60,7 @@ DEFINE_TEST(test_read_format_7zip_packinfo_digests) /* Verify regular file2. */ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); - assertEqualInt((AE_IFREG | 0666), archive_entry_mode(ae)); + assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); assertEqualString("b.txt", archive_entry_pathname(ae)); assertEqualInt(1576808819, archive_entry_mtime(ae)); assertEqualInt(4, archive_entry_size(ae)); diff --git a/libarchive/test/test_read_format_7zip_solid_zstd.7z.uu b/libarchive/test/test_read_format_7zip_solid_zstd.7z.uu new file mode 100644 index 000000000000..3bffb98f07ea --- /dev/null +++ b/libarchive/test/test_read_format_7zip_solid_zstd.7z.uu @@ -0,0 +1,9 @@ +begin 664 test_read_format_7zip_solid_zstd.7z +M-WJ\KR<<``1&(FS)O@`````````B`````````$V+D*,HM2_]`$@!``!0*DT8 +M!````"$````HM2_]((+%```P80IB8V0*!X"P/JZA4J4;TS.X,9C'`#4``($S +M!ZX/T5NC)*"0H'?;G=XO-Y<-`+"F*K87M`OOZ1+1#31#M/`2YN,FY:(1).I) +M(B(+;9$W4?0*8=3V5N;BSZ)(0UGD/'LOSN"0&#DNX!A2*5\#&8IP$1G=7-]@ +MP\EE$]Z;/%6NU^\_,X:MD?57P#S>.+BINH?CHRX,::[Q5P*!X\DH````%P8V +?`0F`B``'"P$``2,#`0$%70`0```,@-H*`9/CZP`````` +` +end diff --git a/libarchive/test/test_read_format_7zip_win_attrib.7z.uu b/libarchive/test/test_read_format_7zip_win_attrib.7z.uu new file mode 100644 index 000000000000..dc7495bcbf37 --- /dev/null +++ b/libarchive/test/test_read_format_7zip_win_attrib.7z.uu @@ -0,0 +1,10 @@ +begin 644 test_read_format_7zip_win_attrib.7z +M-WJ\KR<<``0:MZ25^0`````````B`````````,/QN>$!`!IA<F-H:79E:&ED +M9&5N<F5A9&]N;'ES>7-T96T```"!,P>N#\_\\&P/Z^J<OS8]_GH-_C9=&O:; +MN?AF5PM%@/8R"MH"PK!D-+92R@HB57B\_G7B9D`HLH<G4Z@!).&WAAA(R4U? +M%0%=EB_VM=2[WZJHK$/PHCG(E(Y#O[W'JQD2%>%U\S6&7C"[<$<2GL2\B,** +MW`0[F2;R)EO2:N)4RB6G.3+R6%97BQ]K"X),-'`E&./R#`2A\R&D1#U8FUC& +MANR65$7S:?$CR7DS8<)L'MR%.5Y)T-;62DU\S8W?$4=U2972R-0]5J81R3E/ +M\K&`%O\H:/`E4``7!A\!"8#:``<+`0`!(P,!`05=`!````R!C@H!`M-R5@`` +` +end diff --git a/libarchive/test/test_read_format_7zip_zstd.7z.uu b/libarchive/test/test_read_format_7zip_zstd.7z.uu new file mode 100644 index 000000000000..acd49c421a6f --- /dev/null +++ b/libarchive/test/test_read_format_7zip_zstd.7z.uu @@ -0,0 +1,12 @@ +begin 664 test_read_format_7zip_zstd.7z +M-WJ\KR<<``2QPP_C,`$````````C``````````+H!E<HM2_]`$@!``!0*DT8 +M!````!$````HM2_](`U%```080H!``80`BBU+_T`2`$``%`J31@$````%``` +M`"BU+_T@&ET``"!A"F(*`@#`H`'8*+4O_0!(`0``4"I-&`0````6````*+4O +M_2`G;0``,&$*8@IC"@,4``@8V2BU+_T`2`$``%`J31@$````&0```"BU+_T@ +M-(4``$!A"F(*8PID"@04``@8(QL``($S!ZYMP-,)%[KY0NUS!EQ9<T<AN:R" +M7Z^`KZ24FV4LJ?"A)\MX&!"$=31!F6U\W/D!@*G'-=Z@#"&#>8R#*L]U;J=* +M@K`Q6]^1F4MZF33TE2LJK8X@%5MY%P.#1*EM98=_,9"?K'$*_A0YVC)]1ML= +MK-5-,X82B;/_L`I&FQ!5HP#H````%P:`J`$)@(@`!PL!``$C`P$!!5T`$``` ++#(#Z"@%\$`,4```` +` +end diff --git a/libarchive/test/test_read_format_7zip_zstd_arm.7z.uu b/libarchive/test/test_read_format_7zip_zstd_arm.7z.uu new file mode 100644 index 000000000000..770e99b3c10d --- /dev/null +++ b/libarchive/test/test_read_format_7zip_zstd_arm.7z.uu @@ -0,0 +1,61 @@ +begin 644 test_read_format_7zip_zstd_arm.7z +M-WJ\KR<<``0IIN38A`D```````!R``````````1RSP4HM2_]`$@!``!0*DT8 +M!````&\)```HM2_]8'P=+4L`REV0%$E@''(._[5GFW&YEVY]?G/)^,\9+2"B +M(\1H-(@DHJ*L)A?\C,G6FR3?/D.:6QDP<&`QFLOCXM`%J_](<>7+QU&E6E:N +M9=5-A,@4*0%(`38!`-3GD[<=6PPVGV</-O5)9%/+G)7MT/SVF2%"[?YY9?YU +MQOSKV/[5+O_IT#_2EO]=G'^=-?^YMW]5Z!^I;:@BQ:G]/U%1=T.&V5/O?8'$ +M1_>GC_)87GYQ_BZ,9+G<6(:EL+AFM]/OESN[+<?BJN+OQ,!I;>)245575._@ +M^RPCV7?'7IB-7R_..I.<?_RR2]YGMM,\B7QASI_N3>8;"%/NJ_\?\/_!_P<: +M^G3XSS-DOP`414SD%5U,'70<P:9LB=\F,5F\?(8L*B"#5:97+^5R9HG.9OS" +MQ!96@'QA!=NI[<^M__^U_7E!?>-F?MS1VK_/VO^C&^I_1SA*^_=)^^5T\.;Z +M_W0/7Z?^[E_7Q03P`7[I>3]\I]RK_U^TYO^=_E7>+WWZ>^_CU12)<EV_^4?G +MR'7]]O5_"I3K>L[N?\MU#>?H_X-28WKB?Y#2_H5D[#04WF9R/8>-46ZIY]4H +M_[E-HI8CI(5G.6PHP["KW.$%T24@`CT?H"YM4.#W#_7_$LP0H8J@_5G9\>QI +M=PPFO9L77'W,=3WH<A+Y(B62E*$]&2G_PJ-_(0+A_PLGG.V81D:R`=M*5Z/! +MU6XCX&IET$AFM3.2M$&+%6\)F%-88<=J)PG3OY#Y+^R_JOT#S?9Q,8X9"8UD +M%7A&IQ6/@M*_T,._<,>_D`?:4S&I@D;2#5JL<FIIE`GCF)',Z*R@8Z5#0??_ +M2__"LC-U_=P*ZB,Q6_]D:`Q1MAA,Z;/'$/CLP03\_P3_0AQN8^!J-RQP]7]< +M!PJJV2[]-RUCCA\Y'\&X+V;;3#U^<(+Z_)L6S[]I/9W`&=.V!DZ<IY,X:A@7 +M5W:8&%3^/UQN.7_:C64XR9>=/]U?I!=OW1=F+M]/KEY>S4[+:QQ[<3#6#>,P +MS":???N<_*[T7VSG+Y+E_%NEE]<%?4YB^.=!@="D_R`W:7)EGJC+VO<>:,/( +M\K[_V5!^"/W92(#84!'B?5"@#>*'Y&'/_Q;Q1/_;[`_]<+/84PFV[WO2M)[4 +M2L^_FUK-[[<=1DVMEU-2?3DI7H!^/\D=^=X'_6[Q0?]$0Q)M_T)1>VH1],7_ +M:W`1HJNG<KWO=Y334X+4S.>_IVY`DR(,_?O^G7K_0[6:5[\H)=H)`=>"@'Z4 +M/Q^33T_=]2CA&;)S@F?<`77FZ')IJEE:`V4.V`!0HUVT@RG1%MK`':0"J3LH +M;^^*.CNZ+Q*?<OM?).NR_]]4_`--3:<%1*:U:6U:,&SVN(G,L#2$("5%E<NE +M2M0[]Q],\_\'_H>D\+1^+8/_W\ID\V-J^^W(_,#XTKIH4:O2Q$CO2S"#\-CA +M&,ZPD*+'A="2":C_L9T"_Q\,^!YD:/"1%93KNHT#)91V>Q/YSKVS/7:72SFY +M/DTCU^_RU_K)=\G&8JW27=_9ODYWQ=HJKB_/Z_K=Z?9U_0XS87=>?^:Q_-*S +M"V+N2S$Z%FO75]*LDE@556Q?8@N_3>3:C+]6M\OQ^LS9[?&KG#N]/I+M2S%Z +M_9?"XGK^W[ITD\=OVVFN5=7&K)++=,MY&[O/=K9U:1H)Q:>NHHI<G&L*P_&H +MQ:^*45I75/REJK"*61R,_#DW9DWQ*:SBUI'S3ZYARO[&+^?\Q9;+9LO=)3M[ +MO=C<8Y>+L?/,\I=I;=WNPLREG'QGD^7T+/>6PRQ2AK\"@C2H$C.5*65$1$1$ +M)$F2-`9""D@*96%02N8^$J#D.`MT#".12:(@2<HJU-B:`WL`""01MII[1KW] +M.:P7R=+&`+BTZ1F7\S?[C@SB[IQG[ZA[Q/@?MO<?.^4Z.6E&^E"NC6X[H>)# +M4:BMMH#O(,3N\SNY98ID=!W0;%:X'+'JB96]?7)D)*]C(/`75J#"!K*H?_US +MA4W\/A]*S]-7_2]IAM/+/`B("R[9CK@UI^F_L_F\S3TLEF]4;-9K"D.FI-BN +MV;3B7IH,H:X*!VQF'5DKMS(QWD"?M;I7HLYJC5@4O84-JXI4]\ANPCC,Z6V! +MH1<1&1[VBD<[;N__]';,59N\AQ^&]#"-.ERL<TH!+^^O:-90UN(2?41R,7YG +MC=D)1;Z7Q%]M-0-KZ?NVGSM/-)/9WE[9=:\@3"'BI0G5?07Z*O=+2,O@T055 +M`]'KHF?3P7&^LM$=DZ'I%RJ9[,2",X=RL)#A?XC[#7TWG0*WTBO_91+R"@77 +M5JX1_+=H.<UDB7I[WVT+H8+N1^8>W77^#-%@[(V?&%>E1@EGMLCHLB@IEGBO +MR^7F7VZ4^<_*:H]3M2!41<$&Q+=RB)TZU2K(ZASM'+S$FS<U`,,R=?`BY2`5 +M#*1PHK!T/N@X9_BI-U$V`IL%#F'N=A\HG/UR9PGA@4+>C)$0QJJE7#\<..?\ +M5<-K!(&!>!\SDU,3G@>GQG!HY@,:VA83.3UV:[8,/#IFAAR>4[SNQD@#X(ZP +MSB1KCH5,N!*?N?=.*K&"L:.#>WPGFRQ?G!MXSQ%MC#G3I!&A'&2-D>2,A/-E +MECT8^7<1UPS%/*;,`34&^-#OCIS.QE_GW3XH<S`Y<]E[>G\@9&@Y?L((/T]` +M)T;C<[`:OL9XFC,(CGNQ:L7!)HW!FUD*LUE../[1_FDQ56O"(#?<^P\D9Y8S +M\B>"887TP=S,B&&5FXH0#40E'^VT-J)ZZC$8F8IXY#3.]BBD/Y!W$_ZW_PF! +M]O@GGFKZK7B;%/:O*>@EBKE4E'Z,8L,CF729$*JA:H"9A4<-W536[#+GLD*, +MA1`PA]/73?\?687^X]/J)UG5TW%7:20ZKXIC[MVDJ)')G',2BOU+XJ+MC.)< +M.2`Z'M=W?='`QE[.OF=_/FV="Y,I[]N:M1/U6>W;\;-N"M*]+K<S"VM!.5`7 +M8H9W)EDHM[D#]C..3VI`)!.?FH80X:%M%"!>&L1B*%65/ZC8$_36I;+/=_@$ +M3FB?WK+IOVATX0C;5Y*=[>\S4F1(V)J!O?<A_6Y4"P(JCG3]$BG<;7:X.L8- +M.5R.-,-0NA&D)4Y:]3E;M@@=Y>?36$$TKF(S2@FLJ\FLP*@EGBB:2%'/9-Z8 +M8Q,_6=Z>;B0PSV4-O0H-CLX!^O0EGI6A1BSB-+@-^M_[_W@_H7<<>.R8P"(# +M;W9GXI=Q",^;'>9$=#]CA-$DQL\_IE\_^00T'^]Z\9A<H(3D5@4!!`8``0F) +MA``'"P$``B0$]Q$!!0$%`P``!`,#!0$!``R>?)Y\``@*`>'$7C4```4!&0H` +M````````````$1L`:`!W`"T`9P!N`'4`90!A`&(`:0!H`&8````9`!0*`0`` +166S@9)S9`14&`0`@@.V!```` +` +end diff --git a/libarchive/test/test_read_format_7zip_zstd_bcj.7z.uu b/libarchive/test/test_read_format_7zip_zstd_bcj.7z.uu new file mode 100644 index 000000000000..2a75db8972cf --- /dev/null +++ b/libarchive/test/test_read_format_7zip_zstd_bcj.7z.uu @@ -0,0 +1,56 @@ +begin 664 test_read_format_7zip_zstd_bcj.7z +M-WJ\KR<<``0N5BP@P@@```````!B`````````(*-K]$HM2_]`$@!``!0*DT8 +M!````*T(```HM2_]8%`]'44`ZE%D$DIPW'$.RP,C]5>);DM31:I?D,QMZ#'[ +MX]O[KCOFX)J*\$44=%&TV"+)8#QPV28QFR]0!V-3JH9UII:164M``!FT!`!L +MXELXL[8O4Q,!'@$2`5/J6F?&6/][6'!>ZPF&:U6C8%?F9DH.#=>\Y71GN:,M +M^ZA,>'Z0J2/,U:!!Y(?S^B3?P==^[[?]YK&,Q.+\7;C(4KFQ#"L]4<UNIU\L +M=W9;_D1%Y$]$H4B=H$[@2DE$IZ8'OIOBA=GXO>*LEI'SCU\6R?O,=IH;BR_, +M^=,]F?4+_I]'MWL=@)3B4LF]J`%84^*+!@]ERRM(EKDF0@0*\*,A13M[J_;, +M*JBF":I,JT3`(:"1UI!6,G[AH1;N$0&++]Q;5RDTUW:S#K<G2G>B?&TWF[K] +MTO%\G]%M-\G(:E8U$$&Q(;$WDZ;I?H%#_\%^!#:>[<]:V>W_<Z_@?U[X`M[H +MA4"P?^$_:O4:WO9[UYB<ABX"31,=K>LQ-_Y?Q`(@"A`L^!S]UHDBP&X#+X<) +MS4GK>LP.H+]9:E#78]`VV'FC.[!1K?U2*3:2NB93]/].==UT^O\>==W,\/]? +M==V44-=-'0;;@?WP+*-()<@P[!['GHC]HU%G3KK6_QP>N.7:3':M;%ATH6"X +M5K.NM0IE?OG9C8W8_ZH67)-_%.SL'Q6>_:M>@EZKKIMUJ5R"7&M5A.0'M[;4 +M9V?&P.&\UIV>1F5MLE<;FI+U2(R2M=FUI@DE%2V)P>4ZMO6SVU+C=&8,(,YK +MY>EH%F;<4AE<K@_C9Z=>F?GO3?%`"2[7)S_F;T@5U>S"M7+I6DE0Z2*&^9T( +MJG_I9W?UWQ,25(-=_:/IEZ/P9_??RQ%4__=P%-5CYQ*N-=P)*8F#4Q-_J:5U +M'?(JJ";.7XGXA`058FD):LB'3TA23)R_445Q[&_\<LY?B40F6^XBV?GJE7./ +M7:YDYYGEKT]MW>["64C9^%I)EM.SW%L.LT49QN)R:^3(SM^H7ETE.]UGXV.Q +MG;]%EO.7U5^?C5.OJ[*+Z*C1$-(A?J%;#=`G\MY'Q2V%>VHZ_YM'O9).+?@] +M&[B#>O9PXX#A62$P9N#(I\W?">*#9\:C*[Y`E1!]GR=28((]^C4"J>WK;[__ +M:S)_$_HE*_R&?+\TV>-DL>I!>D%)J<F7!I?3K-.T7:\Y%>`P3US430XU<+-S +M),83X)<`RFY;.%N87*>=0>!SX'OZ_PMXW8W.*B=`J28#S1D*U77O4Y3UMK+_ +MO\$[$]BLC/9N@+Y/YWVH[O3MW+GVQ&Q`R,C:,)F[_R=SFIU!UC7+1_G_FTY: +M8Y)D#["R,A(5%88*A3Y0-$W3'+='>?"2_FWPSMRM12UGXO>_YX^R,O;,`86% +MR76-YO\_I%]?Q!O0\0A\!KO'+A(I&]6GZ:+ZQA?)QLIV;H]'5WUY5M7O6FY7 +MW^C2,I:J?H>S6-B=U9]Y++_T[)Z8.U))Q\I6_2/-'H>(24CM.]3";[*H[+.; +M)<]9:C+&4MTNQ^IGS6Z/W^/<:?6+;$<J:?5?Z8F*IHN<?QN[_%N73O+X;3O- +M.1#;F#URF6XYV]EG.]NZ7,B'3DE(5)QJ.,7$Q"&"4*C2@C%")2(21)(DQ1RR +M"R"09#G(&+EY$D!S+-A5AA&"G!$1$1DI*"HJ*%3:#M)%Q65GGN/P$%8VV5B2 +M]NFSWV5TIA<46D6>L+^>0INN&\C!Q)+"<SH9C<?:``)];9<186MJP)B*VK4: +M<%,XO+^L0FV@^)9)8+0SP[K`8[^)+1'?^U#DQOUSWD`NSPKPO[6=TYI:*BDT +M()-&:!P3=L1H1J,'B6H"\'D5T"]'7H=*%&BA]AN]!S@'8HS*8<T"D8=K-Y-B +M>(-?'D)(%2ZL3O]\]"#?E1$+0VXIS="D"#8T@4)AH;OS0QK*@.S(L,50<_CA +MSLQF9'9?XSB;;-U94YD.FO]*997K@$8#<$+3;FE`!=:DQF+2IM`^P_V)X+H8 +M>CA6D83\V2'4'&8019V9GJ;4N^GH!]DY[/[G+;OB1_1;1C*]PB'S([P%1P=2 +MVZWP^0AVC4J*P$8O6>4N-N<4YQ@52=LB99,=Q-92\YTM6_:!O(CLS*.3].4# +M"=G'<EW8WT4PE,R`*.$U^=K#".R@`QA*]1])G-)@U:>`&WN&'Q@PN!^%WP*@ +M>Q#R';%'W>W,J`@NVM/IYT(1Z9WO[L0DR.YFB5_M%B-Q;^"AA"&\S5O?^]2G +M5:<U6.,RP%;%Y"R;NE!;^QBLHNWDHT[PY!X'$RQ]3:HQ#!%;Y"&8XYZ)DEAN +MOEQW1C&Y+8?>0N[G64]G+ZWR@D&V)Q@^LXPO*B9G9F,9'#!BQ>,6;6FU$N?3 +M`.Q/U+S_$G<B>PHT*;\)<@Y@CF:$OL@/;(&MBC.]2FU)]]1H%"W*G?%/.,%R +M%[H<>8MCK*V1.J%.C=7'N/;E*:U^2SX@)@'SYZ\;36III>#+-E0=MARSYX'R +M\WH,G%TT4TXJ7V:1?#Q/HER'4TFC.'Y%Y0D*MH2(6\B5YU*21O#?4OS=K,#> +MM?@F6*^:37;#*>NV\;VYS9R567I^EN(RXY3MF[\:?IS1%VRW7Z[:^VI<W^EW +M+C1I4NN.\7L'K_%;28(A;"6.*=[#.\.NM%)`@9'*7@+F3A[K)9_8.LC%A)"A +M'*)/SZS!C8<S>'LY=_ZBTR<)4IT7]IYY]1OK&'@.&E"VR@9%YH&S'Q,#9CF] +MG8&_K//(.AY#/&&R\L5Y9G9*M">BYP#J+4'9&3=D:QBW=45`IG&!W"1D^=K7 +M3-\)$&`N%0_$JV$!\![TG-`=:",BG5.9A)"?V=NSXPVO21_O-QG<+$FCO"K< +M+7,ER$BPT:CS!0`Z0BV^S#)QZ3PK0-/_L#+OU^QUO<'=-9BN6Y:-5!LY:B;N +MZREX8;-G[,XTOK;@Y$4Z[)9[!"MHPI^1M7KK1KL45B0C''SO8H,4XUG<1RU\ +MG/6=<8^3]'MPL\V\;ITR,#$MU@E[S7%[`00&``$)B,(`!PL!``(D!/<1`04! +M!0,```0#`P$#`0`,OE"^4``("@&\[F:]```%`1D*`````````````!$'`&@` +@=P```!D$`````!0*`0``'';'*9?9`14&`0`@@/V!```` +` +end diff --git a/libarchive/test/test_read_format_7zip_zstd_nobcj.7z.uu b/libarchive/test/test_read_format_7zip_zstd_nobcj.7z.uu new file mode 100644 index 000000000000..c6fed0bebb84 --- /dev/null +++ b/libarchive/test/test_read_format_7zip_zstd_nobcj.7z.uu @@ -0,0 +1,56 @@ +begin 664 test_read_format_7zip_zstd_nobcj.7z +M-WJ\KR<<``0`N.\QQ0@```````!2`````````#TEXKPHM2_]`$@!``!0*DT8 +M!````+`(```HM2_]8%`]-44`*E)P$DIPW'$.R^E<Z*8D%G.UILPF5,4RT_G_ +M</>\_]^S[,>DG"("L:I:;)%D,!ZX;).8S1>H@[$I[8=UII:164M``!FT!`!L +MLB.<6?N3%!4!'@$2`4JZ6"F]QIDPV'_>%=P7BW[I8M4HT)&YD9)#@VO>T')( +M6DXDLR#Z0.9.,$=CQA`?#OR3?`=?^_-\VY];GI%8>_\;%UNJ5YYCX1,5_?(: +MQGKIU]U/5,3]112,U@GKA"U4(CHU_>]?%'#<RO#5;K>,>[\,M\C-Z9;7VUB$ +MX[V_YLFL7_#_N]H]V0'(*.^4G(L:@#4EO&CP8+:T<F298S)$H,!&$F+$<W+5 +MGED%U31AG>NUZ$?T.]HBVDK*<$SDQKRB7Q&.>2PKE>9<?M;A]D4J3U3/Y6=3 +MMU\ZHM\[NIW-LK*:50T$<(QH[,NHJGJZP*7_X'P$MIWMT9K9[?]SK^"!/O@" +M_NB#O[#_X']J]1K>]N=98W(:M@B]-TWPM'<Q-OY?Q((@"A`L_"`]%ZH50+=A +MI\.4ZJB]B]$1]#=+#7H7@^8,0V]R#ISIUOE2*,XCO8\Q^G^GWIM._\^C]V:& +M_P?KO2FA]V8.!MN!\V-ZUE(ES''\'LF<C/6>=H;6Q(O]U]F!6[+-I!?+9H57 +M^J6+/?-BJWKO6EZ`=&0CSO\U"XY)[]U%Z[W[H/VO78!?;`X_\UJW`+O8J@C) +M!W)IZ2AGPL#AOE@>GC:%97*R-C1)6*0P2=BF%YLVI&2T)`*7+!D7D$Y+Q^%, +M&#_<%]O#T5B@<4LE<,G^"R#=>E7FGS?5\P2X9)WXF+XA55232Q>[Q8LE,<6+ +M",9W0JC_$I#NZI\71*B'7?7>MW@Y!H%T_SP<0OV?=\.HDZ$!3DE*')R:]DLM +ML>QP5T$U[?U"XE,25(BE):CA'CXE23'M_<95Z\AA&=Y[OQ*)3+K[1;;TU2MI +M+K];V=)TN^'>ZK[\C;.0L_&WDNVNZ9F[.VZ+<XRU9]>XD7R_<;VZ2O*:T\;' +M:OF&B^W>/Z\^3ANG/H?*221';<;0#A$LY6J0/G'W/REN:NQ3V_D_=]0+=VK` +M]SE_IY#/.3QQONRJ$"`S8.35YO,`Z?$],CY5\5_@SV#Z/T^DP$S#/OT:`=4& +M]K<___N8OPWYDA5\1#V?FN1RLECU0+T@%#;UTN!TFEU-._L:5`$.$\5%W>12 +M`S<\2&,]`7X)P.S&A;.)S3W-#(*?`^_#_U_`Y]SD6.4$"&LQ4IWA4/]CE/4V +ML_^WL4,3V*R.SK-!^KV=[Z4Y:._,H2QOS/:CK*P-DZG[_S'H&0J$9;$\E/^_ +M[:BU)4C.`5961:*BQ-)@L$>:JJJ*X_;ICIW2?XT=FKNQJ.5,_/DPZL/,K$5S +M06)B<^]G_O^#"@9&O`4=C[]G<'+Y12)GX_IU75S?""-;6>G2[O'XKC_3Z_I\ +MZ^7K&]]ZQEK7YW%6&[_T^O269[BFWQ,T1RIK6>FN?ZS;(Q%1*<F%B=P83A:5 +MG'ZS9CIK3<I8Z\MG>?TL^N4R?*1YO7ZQY4AEO?X+GZCJNKCWN_*[WWWKY)9A +ME]>;`]&5V^.>:W>WO/V6M^Z[@WOHI)1$M:F&4TQ,'':"4:CB>C%")2(21)(D +MQ1RR"R@01$'(&+EY$D!C+-E5AA&"G!$1$1DI*"HJ*%3:#M)%"5G$G\<Y$4%Q +M64R2EN_3WVWTII>"8%:>G[^>!M\V$XK!3)(B?F)-CZ=K`("^=H&,T+K]/R8B +M['>&V!;.[RZK*AXHW/(1&>W$L([TS6UB*(17-)#`^=N<-Y!+LP+,;VWOM.:V +MG"H>@K<%',>.&QD-=+)!XH+%'R\&]".3\%"A*"Q49ZE[Z/-`S&!3[<L:E#@& +MA%BW.,7W(7@3D./J)N.CU_NNC!D.LDMIAB9%OI,)=,R+KH$/::@'Y".+K4/- +MPX\'-IN1$_^:[U*/S[A,)7LPX2OTM=(!J2UI0@W=TO;)K?W&TB(--7\FB`$B +M/3++09C?7H+'0_"B9J`3NBFF*?K=)/Y!WTGB_/.61>$CTBVC3R]ZNOP";Z'2 +MH2O_5Y`ZL)EB)470T:OT<M?/"<8&A@JN:9`2T@YA:U_ST9;WZ<.\=.SLUP;[ +ML8&*_`<R7?A?15#RY@&4<!_XM,,(/*`#*!KU7TG<TL`ZI(!;?C0_\(IP/PFC +M!<#J03`[8B^LVZE1$;]HKZ>>2R/20[R[(Y,@NY,>;K5;&0GE`P\E#.%]WG4O +M&5+K/5T3')<)O"I,1MVZ"]]^(&Q5B">>RVD\[W$PP\;7(AE#%.%E-HDY"IIT +MR<O-V]7.57,P-O3L[,9\JA,U[NZ[%.66!(=^O.-+T>+8L[$1_("Y?)9Q7F&M +MK64ED6D`V29*P=.*;'(U%I_))$V/)_?,$=;YBZAX0W2M@PFKU%9S3_T.T:#< +MW/V$HY:ZT^6Q"C":"ARLJ?J@S!>.02=/K6Z%TS_J/3*YY=UH8DNK;;"^H=ZX +M?#9L*(R;]X<0VT7;[:2U;!;IBO(DRB<X/9CD["OJ3U#0)4380JXDEUJQ+?^6 +MQ9]E9?:N1#;!:O6*S!L066>.[\UAYLS,UO/S@RN?PVG?_*AAX1GE0+O-\:J] +M7,:5^[ASH4F3NG>,TSNX9AQPQ>"V$LT4["&]0<RS`D"!CDHM@?6T'K,GK]A2 +MY<)&R'8.49C.U.`&G#,$]H)X]D&G#PQ2G85TGYUQNR,`\*"5<`/_S/,L?XD) +M9XJM2X7?[#Q?'+\4C_E,]6(W,Q\BV@OO(69_>W=&EFLO#1^W/A*04USP-0!9 +MOO8][Q\"!,VAXT'A8CF`N?FP)O*.V0A/YEIF(B0G]^KN-F5KPD;:J[TX$J21 +MW@+<%;CB-NJY,<;P!8#[&A:9S.V+U9\ADL)_&*EW<Y[@TX1U%2S7:L_"MRW9 +MRNK#WA2O/$HMMGEX90/<HA4YI%X[XGOT7\\[]6#K&X[C%K/Q-/QT<4.*><[O +ML2P=S_X<N'7,5CS>O.NY4@\-FS$OP8EX>6=[`00&``$)B,4`!PL!``$D!/<1 +M`04!!0,```R^4``("@&\[F:]```%`1D#````$0<`:`!W````&00`````%`H! +3```<=L<IE]D!%08!`""`_8$````` +` +end diff --git a/libarchive/test/test_read_format_ar.ar.uu b/libarchive/test/test_read_format_ar.ar.uu index ae61e59fc7af..1e644cc8ab07 100644 --- a/libarchive/test/test_read_format_ar.ar.uu +++ b/libarchive/test/test_read_format_ar.ar.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_ar.ar.uu 201247 2009-12-30 05:59:21Z kientzle $ - begin 755 test_read_format_ar.ar M(3QA<F-H/@HO+R`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ M("`@("`@("`@("`T,"`@("`@("`@8`IY>7ET='1S<W-A86%F9F8N;R\*:&AH diff --git a/libarchive/test/test_read_format_ar.c b/libarchive/test/test_read_format_ar.c index 1cc3cc047225..6e279ec134d9 100644 --- a/libarchive/test/test_read_format_ar.c +++ b/libarchive/test/test_read_format_ar.c @@ -26,8 +26,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_ar.c 201247 2009-12-30 05:59:21Z kientzle $"); - DEFINE_TEST(test_read_format_ar) { diff --git a/libarchive/test/test_read_format_cab.c b/libarchive/test/test_read_format_cab.c index 8f6adae66a4a..f5ce21cbf19b 100644 --- a/libarchive/test/test_read_format_cab.c +++ b/libarchive/test/test_read_format_cab.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); /* Execute the following command to rebuild the data for this program: diff --git a/libarchive/test/test_read_format_cab_filename.c b/libarchive/test/test_read_format_cab_filename.c index 2f46a7e6ed05..efab3ccd69f1 100644 --- a/libarchive/test/test_read_format_cab_filename.c +++ b/libarchive/test/test_read_format_cab_filename.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); #include <locale.h> diff --git a/libarchive/test/test_read_format_cab_filename_cp932.cab.uu b/libarchive/test/test_read_format_cab_filename_cp932.cab.uu index 0d51f10c418a..9d59000c73ed 100644 --- a/libarchive/test/test_read_format_cab_filename_cp932.cab.uu +++ b/libarchive/test/test_read_format_cab_filename_cp932.cab.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_cab_cp932.cab +begin 644 test_read_format_cab_filename_cp932.cab M35-#1@````"4`````````"P``````````P$!``(````(_@``;@````$``Q(% M````````````=#ZO5"``E5R"OH+F7(J_CIHN='AT``4````%``````!T/KM4 M(`"57(*^@N9<B.J7EY5<+G1X=``I]2&+'@`*`%N`@(T`,*```0````$````! diff --git a/libarchive/test/test_read_format_cpio_afio.c b/libarchive/test/test_read_format_cpio_afio.c index 95d3171e72cc..0eff8cfee856 100644 --- a/libarchive/test/test_read_format_cpio_afio.c +++ b/libarchive/test/test_read_format_cpio_afio.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* execute the following to rebuild the data for this program: diff --git a/libarchive/test/test_read_format_cpio_bin.c b/libarchive/test/test_read_format_cpio_bin.c index 7b0fad268c0b..f5be2e65cdc1 100644 --- a/libarchive/test/test_read_format_cpio_bin.c +++ b/libarchive/test/test_read_format_cpio_bin.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_cpio_bin.c,v 1.2 2008/09/01 05:38:33 kientzle Exp $"); static unsigned char archive[] = { 199,'q',21,4,177,'y',237,'A',232,3,232,3,2,0,0,0,'p','C',244,'M',2,0,0,0, diff --git a/libarchive/test/test_read_format_cpio_bin_Z.c b/libarchive/test/test_read_format_cpio_bin_Z.c index 6afe691138fb..aea5bcb4b5bc 100644 --- a/libarchive/test/test_read_format_cpio_bin_Z.c +++ b/libarchive/test/test_read_format_cpio_bin_Z.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_cpio_bin_Z.c 189464 2009-03-07 00:25:33Z kientzle $"); static unsigned char archive[] = { 31,157,144,199,226,'T',' ',16,'+','O',187,' ',232,6,'$',20,0,160,'!',156, diff --git a/libarchive/test/test_read_format_cpio_bin_be.c b/libarchive/test/test_read_format_cpio_bin_be.c index 164396dab23f..66e4a9ca9afd 100644 --- a/libarchive/test/test_read_format_cpio_bin_be.c +++ b/libarchive/test/test_read_format_cpio_bin_be.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_cpio_bin_be.c 191592 2009-04-27 19:30:09Z kientzle $"); DEFINE_TEST(test_read_format_cpio_bin_be) { diff --git a/libarchive/test/test_read_format_cpio_bin_be.cpio.uu b/libarchive/test/test_read_format_cpio_bin_be.cpio.uu index f29b07138802..91d1b4c70075 100644 --- a/libarchive/test/test_read_format_cpio_bin_be.cpio.uu +++ b/libarchive/test/test_read_format_cpio_bin_be.cpio.uu @@ -1,4 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_cpio_bin_be.cpio.uu 191592 2009-04-27 19:30:09Z kientzle $ begin 644 test_read_format_cpio_bin_be.cpio M<<<`"#P\@:0#Z`````$``$GS"&\`%0````5F:6QE,3$Q,3(R,C(S,S,S-#0T M-```86)C9&4`<<<```````````````$`````````"P````!44D%)3$52(2$A diff --git a/libarchive/test/test_read_format_cpio_bin_bz2.c b/libarchive/test/test_read_format_cpio_bin_bz2.c index 7497bc41a988..b1a994bc5359 100644 --- a/libarchive/test/test_read_format_cpio_bin_bz2.c +++ b/libarchive/test/test_read_format_cpio_bin_bz2.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_cpio_bin_bz2.c 201247 2009-12-30 05:59:21Z kientzle $"); static unsigned char archive[] = { 'B','Z','h','9','1','A','Y','&','S','Y',134,'J',208,'4',0,0,30,246,141,253, diff --git a/libarchive/test/test_read_format_cpio_bin_gz.c b/libarchive/test/test_read_format_cpio_bin_gz.c index 3cc8f15eaee5..47545f913248 100644 --- a/libarchive/test/test_read_format_cpio_bin_gz.c +++ b/libarchive/test/test_read_format_cpio_bin_gz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_cpio_bin_gz.c 191183 2009-04-17 01:06:31Z kientzle $"); static unsigned char archive[] = { 31,139,8,0,244,'M','p','C',0,3,';','^','(',202,178,177,242,173,227,11,230, diff --git a/libarchive/test/test_read_format_cpio_bin_le.c b/libarchive/test/test_read_format_cpio_bin_le.c index 2d0484c5232f..0cb6cc845554 100644 --- a/libarchive/test/test_read_format_cpio_bin_le.c +++ b/libarchive/test/test_read_format_cpio_bin_le.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_cpio_bin_le) { diff --git a/libarchive/test/test_read_format_cpio_bin_lzip.c b/libarchive/test/test_read_format_cpio_bin_lzip.c index d9acf095ed77..72791aa60a69 100644 --- a/libarchive/test/test_read_format_cpio_bin_lzip.c +++ b/libarchive/test/test_read_format_cpio_bin_lzip.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static unsigned char archive[] = { 76, 90, 73, 80, 1, 12, 0, 99,156, 62,160, 67,124,230, 93,220, diff --git a/libarchive/test/test_read_format_cpio_bin_lzma.c b/libarchive/test/test_read_format_cpio_bin_lzma.c index 9a8a23ceb77c..a629cb547e88 100644 --- a/libarchive/test/test_read_format_cpio_bin_lzma.c +++ b/libarchive/test/test_read_format_cpio_bin_lzma.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_cpio_bin_lzma.c 201247 2009-12-30 05:59:21Z kientzle $"); static unsigned char archive[] = { 93, 0, 0,128, 0,255,255,255,255,255,255,255,255, 0, 99,156, diff --git a/libarchive/test/test_read_format_cpio_bin_xz.c b/libarchive/test/test_read_format_cpio_bin_xz.c index b19c4fae606a..ff57982af436 100644 --- a/libarchive/test/test_read_format_cpio_bin_xz.c +++ b/libarchive/test/test_read_format_cpio_bin_xz.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_cpio_bin_xz.c 191183 2009-04-17 01:06:31Z kientzle $"); static unsigned char archive[] = { 0xfd, 0x37, 0x7a, 0x58, 0x5a, 0x00, 0x00, 0x04, diff --git a/libarchive/test/test_read_format_cpio_filename.c b/libarchive/test/test_read_format_cpio_filename.c index cf4f5ac266b3..c5aa9a7f52a0 100644 --- a/libarchive/test/test_read_format_cpio_filename.c +++ b/libarchive/test/test_read_format_cpio_filename.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); #include <locale.h> @@ -137,6 +136,11 @@ cleanup: DEFINE_TEST(test_read_format_cpio_filename_UTF8_UTF8_jp) { +#if defined(_WIN32) && !defined(__CYGWIN__) + /* Since we explicitly DON'T set hdrcharset=UTF-8 below */ + skipping("Windows defaults to OEMCP, not UTF-8"); + return; +#else const char *refname = "test_read_format_cpio_filename_utf8_jp.cpio"; struct archive *a; struct archive_entry *ae; @@ -180,6 +184,7 @@ DEFINE_TEST(test_read_format_cpio_filename_UTF8_UTF8_jp) /* Close the archive. */ assertEqualInt(ARCHIVE_OK, archive_read_close(a)); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +#endif } DEFINE_TEST(test_read_format_cpio_filename_CP866_KOI8R) @@ -500,6 +505,11 @@ cleanup: DEFINE_TEST(test_read_format_cpio_filename_UTF8_UTF8_ru) { +#if defined(_WIN32) && !defined(__CYGWIN__) + /* Since we explicitly DON'T set hdrcharset=UTF-8 below */ + skipping("Windows defaults to OEMCP, not UTF-8"); + return; +#else const char *refname = "test_read_format_cpio_filename_utf8_ru.cpio"; struct archive *a; struct archive_entry *ae; @@ -542,6 +552,7 @@ DEFINE_TEST(test_read_format_cpio_filename_UTF8_UTF8_ru) /* Close the archive. */ assertEqualInt(ARCHIVE_OK, archive_read_close(a)); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +#endif } DEFINE_TEST(test_read_format_cpio_filename_eucJP_CP932) diff --git a/libarchive/test/test_read_format_cpio_filename_cp866.cpio.uu b/libarchive/test/test_read_format_cpio_filename_cp866.cpio.uu index 5f0658504039..b1ac82f545b3 100644 --- a/libarchive/test/test_read_format_cpio_filename_cp866.cpio.uu +++ b/libarchive/test/test_read_format_cpio_filename_cp866.cpio.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_cpio_cp866.cpio +begin 644 test_read_format_cpio_filename_cp866.cpio M,#<P-S`W,#`P,3,W,#`P,#`Q,3`P-S4U,#`Q-S4Q,#`Q-S4Q,#`P,#`Q,#`P M,#`P,3$U-#<S,C$U,#$P,#`P,#<P,#`P,#`P,#`P-H^0B(*%D@#P\NGWY?0P M-S`W,#<P,#`Q,S<P,#`P,#(Q,#`W-34P,#$W-3$P,#$W-3$P,#`P,#$P,#`P diff --git a/libarchive/test/test_read_format_cpio_filename_eucjp.cpio.uu b/libarchive/test/test_read_format_cpio_filename_eucjp.cpio.uu index 9aa7666bc4a8..b900adb0561c 100644 --- a/libarchive/test/test_read_format_cpio_filename_eucjp.cpio.uu +++ b/libarchive/test/test_read_format_cpio_filename_eucjp.cpio.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_cpio_eucjp.cpio +begin 644 test_read_format_cpio_filename_eucjp.cpio M,#<P-S`W,#`P,3,W,#`P,#`Q,3`P-C0T,#`Q-S4Q,#`Q-S4Q,#`P,#`Q,#`P M,#`P,3$U-3$U,C(U,C`P,#`P,3$P,#`P,#`P,#`Q,+3!N_HN='AT`(J_CIJ" MJ8+(,#<P-S`W,#`P,3,W,#`P,#`R,3`P-C0T,#`Q-S4Q,#`Q-S4Q,#`P,#`Q diff --git a/libarchive/test/test_read_format_cpio_filename_koi8r.cpio.uu b/libarchive/test/test_read_format_cpio_filename_koi8r.cpio.uu index dcdfd0ed63d8..76f58acace73 100644 --- a/libarchive/test/test_read_format_cpio_filename_koi8r.cpio.uu +++ b/libarchive/test/test_read_format_cpio_filename_koi8r.cpio.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_cpio_koi8r.cpio +begin 644 test_read_format_cpio_filename_koi8r.cpio M,#<P-S`W,#`P,3,W,#`P,#`Q,3`P-S4U,#`Q-S4Q,#`Q-S4Q,#`P,#`Q,#`P M,#`P,3$U-#<S,C`P,S8P,#`P,#<P,#`P,#`P,#`P-O#RZ??E]`#P\NGWY?0P M-S`W,#<P,#`Q,S<P,#`P,#(Q,#`W-34P,#$W-3$P,#$W-3$P,#`P,#$P,#`P diff --git a/libarchive/test/test_read_format_cpio_filename_utf8_jp.cpio.uu b/libarchive/test/test_read_format_cpio_filename_utf8_jp.cpio.uu index 8f9a6f652c28..45c3c4791ffa 100644 --- a/libarchive/test/test_read_format_cpio_filename_utf8_jp.cpio.uu +++ b/libarchive/test/test_read_format_cpio_filename_utf8_jp.cpio.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_cpio_utf8_jp.cpio +begin 644 test_read_format_cpio_filename_utf8_jp.cpio M,#<P-S`W,#`P,3,W,#`P,#`Q,3`P-C0T,#`Q-S4Q,#`Q-S4Q,#`P,#`Q,#`P M,#`P,3$U-3$U,C(S-C8P,#`P,3,P,#`P,#`P,#`Q,.:\HN6MERYT>'0`BK^. MFH*I@L@P-S`W,#<P,#`Q,S<P,#`P,#(Q,#`V-#0P,#$W-3$P,#$W-3$P,#`P diff --git a/libarchive/test/test_read_format_cpio_filename_utf8_ru.cpio.uu b/libarchive/test/test_read_format_cpio_filename_utf8_ru.cpio.uu index 9ed52f87c44c..849b9fe332cf 100644 --- a/libarchive/test/test_read_format_cpio_filename_utf8_ru.cpio.uu +++ b/libarchive/test/test_read_format_cpio_filename_utf8_ru.cpio.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_cpio_utf8_ru.cpio +begin 644 test_read_format_cpio_filename_utf8_ru.cpio M,#<P-S`W,#`P,3,W,#`P,#`Q,3`P-S4U,#`Q-S4Q,#`Q-S4Q,#`P,#`Q,#`P M,#`P,3$U,C$U,38U,38P,#`P,34P,#`P,#`P,#`P-M"?T*#0F-"2T)70H@#P M\NGWY?0P-S`W,#<P,#`Q,S<P,#`P,#(Q,#`W-34P,#$W-3$P,#$W-3$P,#`P diff --git a/libarchive/test/test_read_format_cpio_odc.c b/libarchive/test/test_read_format_cpio_odc.c index f433a4c916cd..00b7c1c0698b 100644 --- a/libarchive/test/test_read_format_cpio_odc.c +++ b/libarchive/test/test_read_format_cpio_odc.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_cpio_odc.c,v 1.3 2008/09/01 05:38:33 kientzle Exp $"); static unsigned char archive[] = { '0','7','0','7','0','7','0','0','2','0','2','5','0','7','4','6','6','1','0', diff --git a/libarchive/test/test_read_format_cpio_svr4_gzip.c b/libarchive/test/test_read_format_cpio_svr4_gzip.c index cb813d24f5d4..ae201de00f68 100644 --- a/libarchive/test/test_read_format_cpio_svr4_gzip.c +++ b/libarchive/test/test_read_format_cpio_svr4_gzip.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_cpio_svr4_gzip.c 191183 2009-04-17 01:06:31Z kientzle $"); static unsigned char archive[] = { 31,139,8,0,236,'c',217,'D',0,3,'3','0','7','0','7','0','4','0','0',181,'0', diff --git a/libarchive/test/test_read_format_cpio_svr4c_Z.c b/libarchive/test/test_read_format_cpio_svr4c_Z.c index 29aa2c6341e6..b4d9a8470851 100644 --- a/libarchive/test/test_read_format_cpio_svr4c_Z.c +++ b/libarchive/test/test_read_format_cpio_svr4c_Z.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_cpio_svr4c_Z.c 189381 2009-03-05 00:31:48Z kientzle $"); static unsigned char archive[] = { 31,157,144,'0','n',4,132,'!',3,6,140,26,'8','n',228,16,19,195,160,'A',26, diff --git a/libarchive/test/test_read_format_empty.c b/libarchive/test/test_read_format_empty.c index 2556503acdf5..fc8d8cc54ebf 100644 --- a/libarchive/test/test_read_format_empty.c +++ b/libarchive/test/test_read_format_empty.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_empty.c 189308 2009-03-03 17:02:51Z kientzle $"); static unsigned char archive[] = { 0 }; diff --git a/libarchive/test/test_read_format_gtar_filename.c b/libarchive/test/test_read_format_gtar_filename.c index f81796b786da..cf9c30991b28 100644 --- a/libarchive/test/test_read_format_gtar_filename.c +++ b/libarchive/test/test_read_format_gtar_filename.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); #include <locale.h> diff --git a/libarchive/test/test_read_format_gtar_filename_cp866.tar.Z.uu b/libarchive/test/test_read_format_gtar_filename_cp866.tar.Z.uu index a6fd80c24695..b06fb11d5528 100644 --- a/libarchive/test/test_read_format_gtar_filename_cp866.tar.Z.uu +++ b/libarchive/test/test_read_format_gtar_filename_cp866.tar.Z.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_gtar_cp866.tar.Z +begin 644 test_read_format_gtar_filename_cp866.tar.Z M'YV0CR`A$E1($H"#"!,J7,BPH<.'$"-*1`BC(HP;-6H`L!@#8XR-%3O6^&BQ MI$4;`&+$J$'CQ@P9*V&0C`'#Q@T9`$#`F,BSI\^?0`'4F4,GC!P0(`",J5,F MJ,.E39U*G4JUJM6K6'G"DY?N7CEZ6<.*'4NVK-FS:-.J7<NVK<-7X%")*B7. diff --git a/libarchive/test/test_read_format_gtar_filename_eucjp.tar.Z.uu b/libarchive/test/test_read_format_gtar_filename_eucjp.tar.Z.uu index 87fa582f6809..97d87728f9fb 100644 --- a/libarchive/test/test_read_format_gtar_filename_eucjp.tar.Z.uu +++ b/libarchive/test/test_read_format_gtar_filename_eucjp.tar.Z.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_gtar_eucjp.tar.Z +begin 644 test_read_format_gtar_filename_eucjp.tar.Z M'YV0M(+MTN>"#AXZ`!(J7,BPH<.'$"-*G$@1`(R+,&S0H&'Q8HP;-6)TA/$Q MY$B,&&/``!`C1HV0-63(B+F29`P:)D&LK,BSI\^?0.O,H1-&#@@0`,;4*0,T MHE*F3:-*G4JUJM6K4Q7]<J1)4"I!R+"*'4NVK-FS:-.J7<NVK=NHR7H5//BV diff --git a/libarchive/test/test_read_format_gtar_filename_koi8r.tar.Z.uu b/libarchive/test/test_read_format_gtar_filename_koi8r.tar.Z.uu index bf4ce01708cc..a198830ae1c9 100644 --- a/libarchive/test/test_read_format_gtar_filename_koi8r.tar.Z.uu +++ b/libarchive/test/test_read_format_gtar_filename_koi8r.tar.Z.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_gtar_koi8r.tar.Z +begin 644 test_read_format_gtar_filename_koi8r.tar.Z M'YV0T*0ENU:,&H"#"!,J7,BPH<.'$"-*1`BC(HP;-6H`L!@#8XR-%3O6^&BQ MI$4;`&+$J$'CQ@P9%6>@A*&RAHP;`$#`F,BSI\^?0`'4F4,GC!P0(`",J5,F MJ,.E39U*G4JUJM6K6'G"DY?N7CEZ6<.*'4NVK-FS:-.J7<NVK<.M7;^ZG<NP diff --git a/libarchive/test/test_read_format_gtar_gz.c b/libarchive/test/test_read_format_gtar_gz.c index 2541f9926216..bc712b9e6e44 100644 --- a/libarchive/test/test_read_format_gtar_gz.c +++ b/libarchive/test/test_read_format_gtar_gz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_gtar_gz.c 191183 2009-04-17 01:06:31Z kientzle $"); static unsigned char archive[] = { 31,139,8,0,'+','e',217,'D',0,3,211,211,'g',160,'9','0',0,2,'s','S','S',16, diff --git a/libarchive/test/test_read_format_gtar_lzma.c b/libarchive/test/test_read_format_gtar_lzma.c index 280a089fd391..1aa0212da0e3 100644 --- a/libarchive/test/test_read_format_gtar_lzma.c +++ b/libarchive/test/test_read_format_gtar_lzma.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_gtar_lzma.c 191183 2009-04-17 01:06:31Z kientzle $"); static unsigned char archive[] = { 0x5d, 0x0, 0x0, 0x80, 0x0, 0x0, 0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, diff --git a/libarchive/test/test_read_format_gtar_sparse.c b/libarchive/test/test_read_format_gtar_sparse.c index 6d15a4745f9c..6a2e3650c5a8 100644 --- a/libarchive/test/test_read_format_gtar_sparse.c +++ b/libarchive/test/test_read_format_gtar_sparse.c @@ -23,8 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_gtar_sparse.c 189308 2009-03-03 17:02:51Z kientzle $"); - struct contents { int64_t o; diff --git a/libarchive/test/test_read_format_gtar_sparse_1_13.tar.uu b/libarchive/test/test_read_format_gtar_sparse_1_13.tar.uu index 86a59ffa47ab..5ab5190362a2 100644 --- a/libarchive/test/test_read_format_gtar_sparse_1_13.tar.uu +++ b/libarchive/test/test_read_format_gtar_sparse_1_13.tar.uu @@ -1,4 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_gtar_sparse_1_13.tar.uu 191183 2009-04-17 01:06:31Z kientzle $ begin 644 test_read_format_gtar_sparse_1_13.tar M<W!A<G-E```````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` diff --git a/libarchive/test/test_read_format_gtar_sparse_1_17.tar.uu b/libarchive/test/test_read_format_gtar_sparse_1_17.tar.uu index c801db840736..815ec6d64a07 100644 --- a/libarchive/test/test_read_format_gtar_sparse_1_17.tar.uu +++ b/libarchive/test/test_read_format_gtar_sparse_1_17.tar.uu @@ -1,4 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_gtar_sparse_1_17.tar.uu 189308 2009-03-03 17:02:51Z kientzle $ begin 644 test_read_format_gtar_sparse_1_17.tar M<W!A<G-E```````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` diff --git a/libarchive/test/test_read_format_gtar_sparse_1_17_posix00.tar.uu b/libarchive/test/test_read_format_gtar_sparse_1_17_posix00.tar.uu index 6001635f6adc..d19a85810a87 100644 --- a/libarchive/test/test_read_format_gtar_sparse_1_17_posix00.tar.uu +++ b/libarchive/test/test_read_format_gtar_sparse_1_17_posix00.tar.uu @@ -1,4 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_gtar_sparse_1_17_posix00.tar.uu 189308 2009-03-03 17:02:51Z kientzle $ begin 644 test_read_format_gtar_sparse_1_17_posix00.tar M+B]087A(96%D97)S+C,X-C4Y+W-P87)S90`````````````````````````` M```````````````````````````````````````````````````````````` diff --git a/libarchive/test/test_read_format_gtar_sparse_1_17_posix01.tar.uu b/libarchive/test/test_read_format_gtar_sparse_1_17_posix01.tar.uu index 6a2ad83c4d34..fac4feeb8f32 100644 --- a/libarchive/test/test_read_format_gtar_sparse_1_17_posix01.tar.uu +++ b/libarchive/test/test_read_format_gtar_sparse_1_17_posix01.tar.uu @@ -1,4 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_gtar_sparse_1_17_posix01.tar.uu 189308 2009-03-03 17:02:51Z kientzle $ begin 644 test_read_format_gtar_sparse_1_17_posix01.tar M+B]087A(96%D97)S+C,X-C8Q+W-P87)S90`````````````````````````` M```````````````````````````````````````````````````````````` diff --git a/libarchive/test/test_read_format_gtar_sparse_1_17_posix10.tar.uu b/libarchive/test/test_read_format_gtar_sparse_1_17_posix10.tar.uu index 80e802a46b3a..7ddd3fd15c2c 100644 --- a/libarchive/test/test_read_format_gtar_sparse_1_17_posix10.tar.uu +++ b/libarchive/test/test_read_format_gtar_sparse_1_17_posix10.tar.uu @@ -1,4 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_gtar_sparse_1_17_posix10.tar.uu 189308 2009-03-03 17:02:51Z kientzle $ begin 644 test_read_format_gtar_sparse_1_17_posix10.tar M+B]087A(96%D97)S+C,X-C8S+W-P87)S90`````````````````````````` M```````````````````````````````````````````````````````````` diff --git a/libarchive/test/test_read_format_gtar_sparse_1_17_posix10_modified.tar.uu b/libarchive/test/test_read_format_gtar_sparse_1_17_posix10_modified.tar.uu index a9120a21af29..cf8fd77cc0ca 100644 --- a/libarchive/test/test_read_format_gtar_sparse_1_17_posix10_modified.tar.uu +++ b/libarchive/test/test_read_format_gtar_sparse_1_17_posix10_modified.tar.uu @@ -1,4 +1,3 @@ -$FreeBSD: src/lib/libarchive/test/test_read_format_gtar_sparse_1_17_posix10_modified.tar.uu,v 1.2 2008/07/03 03:26:30 peter Exp $ begin 644 test_read_format_gtar_sparse_1_17_posix10_modified.tar M+B]087A(96%D97)S+C,X-C8S+W-P87)S90`````````````````````````` M```````````````````````````````````````````````````````````` diff --git a/libarchive/test/test_read_format_gtar_sparse_skip_entry.c b/libarchive/test/test_read_format_gtar_sparse_skip_entry.c index 1caed21bcaca..6b1d6556aa64 100644 --- a/libarchive/test/test_read_format_gtar_sparse_skip_entry.c +++ b/libarchive/test/test_read_format_gtar_sparse_skip_entry.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); #if defined(__BORLANDC__) || (defined(_MSC_VER) && _MSC_VER <= 1300) # define LITERAL_LL(x) x##i64 diff --git a/libarchive/test/test_read_format_gtar_sparse_skip_entry.tar.Z.uu b/libarchive/test/test_read_format_gtar_sparse_skip_entry.tar.Z.uu index dc0daae9e1e2..634ac0673db7 100644 --- a/libarchive/test/test_read_format_gtar_sparse_skip_entry.tar.Z.uu +++ b/libarchive/test/test_read_format_gtar_sparse_skip_entry.tar.Z.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_gtar_sparse_skip_entry.tar.Z M'YV04,+@05(F#)DR<EZ$`<"PH<.'$"-*G$BQHL6*,#+:L$$#!(",,6[4@.$1 MI$B2'S.JS#A#A@P0,63,L`$C!HP9-VB\K"FCAHT8`$#@N4BTJ-&C2"/6F4,G MC)R48^J424HQZE2J$E=F+*G5(]:O8,.*'3M6!LDY:?24Z6'S!DX:,7#(H$%# diff --git a/libarchive/test/test_read_format_iso.iso.Z.uu b/libarchive/test/test_read_format_iso.iso.Z.uu index 989c11251bae..033e33976930 100644 --- a/libarchive/test/test_read_format_iso.iso.Z.uu +++ b/libarchive/test/test_read_format_iso.iso.Z.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_iso.iso.Z.uu 201247 2009-12-30 05:59:21Z kientzle $ - begin 644 test_read_format_iso.iso.Z M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR MI,F3*%.J7,FRI<N7,&/*G$FSILV;.'/JW,FSI\^?0(,*'4JTJ-&C2),J7<JT diff --git a/libarchive/test/test_read_format_iso_Z.c b/libarchive/test/test_read_format_iso_Z.c index 6492706c3df6..09b0acb804ea 100644 --- a/libarchive/test/test_read_format_iso_Z.c +++ b/libarchive/test/test_read_format_iso_Z.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_iso_gz.c 201247 2009-12-30 05:59:21Z kientzle $"); static void test1(void) diff --git a/libarchive/test/test_read_format_iso_joliet.iso.Z.uu b/libarchive/test/test_read_format_iso_joliet.iso.Z.uu index 4642fece1b71..1854fc26ee84 100644 --- a/libarchive/test/test_read_format_iso_joliet.iso.Z.uu +++ b/libarchive/test/test_read_format_iso_joliet.iso.Z.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_iso_joliet.iso.Z.uu 201247 2009-12-30 05:59:21Z kientzle $ - begin 644 test_read_format_iso_joliet.iso.Z M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR MI,F3*%.J7,FRI<N7,&/*G$FSILV;.'/JW,FSI\^?0(,*'4JTJ-&C2),J7<JT diff --git a/libarchive/test/test_read_format_iso_joliet_long.iso.Z.uu b/libarchive/test/test_read_format_iso_joliet_long.iso.Z.uu index 030dd3cb2683..9dc675b5fe6a 100644 --- a/libarchive/test/test_read_format_iso_joliet_long.iso.Z.uu +++ b/libarchive/test/test_read_format_iso_joliet_long.iso.Z.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_iso_joliet_long.iso.Z.uu 201247 2009-12-30 05:59:21Z kientzle $ - begin 644 test_read_format_iso_joliet_long.iso.Z M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR MI,F3*%.J7,FRI<N7,&/*G$FSILV;.'/JW,FSI\^?0(,*'4JTJ-&C2),J7<JT diff --git a/libarchive/test/test_read_format_iso_joliet_rockridge.iso.Z.uu b/libarchive/test/test_read_format_iso_joliet_rockridge.iso.Z.uu index 9f1dd09c70fa..ac2fea4ab675 100644 --- a/libarchive/test/test_read_format_iso_joliet_rockridge.iso.Z.uu +++ b/libarchive/test/test_read_format_iso_joliet_rockridge.iso.Z.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_iso_joliet_rockridge.iso.Z.uu 201247 2009-12-30 05:59:21Z kientzle $ - begin 644 test_read_format_iso_joliet_rockridge.iso.Z M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR MI,F3*%.J7,FRI<N7,&/*G$FSILV;.'/JW,FSI\^?0(,*'4JTJ-&C2),J7<JT diff --git a/libarchive/test/test_read_format_iso_multi_extent.c b/libarchive/test/test_read_format_iso_multi_extent.c index dafbfd38d681..de9a40114c14 100644 --- a/libarchive/test/test_read_format_iso_multi_extent.c +++ b/libarchive/test/test_read_format_iso_multi_extent.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_iso_multi_extent.c 201247 2009-12-30 05:59:21Z kientzle $"); DEFINE_TEST(test_read_format_iso_multi_extent) { diff --git a/libarchive/test/test_read_format_iso_multi_extent.iso.Z.uu b/libarchive/test/test_read_format_iso_multi_extent.iso.Z.uu index 79100f077c99..922b5e036872 100644 --- a/libarchive/test/test_read_format_iso_multi_extent.iso.Z.uu +++ b/libarchive/test/test_read_format_iso_multi_extent.iso.Z.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_iso_multi_extent.iso.Z.uu 201247 2009-12-30 05:59:21Z kientzle $ - begin 644 test_read_format_iso_multi_extent.iso.Z M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR MI,F3*%.J7,FRI<N7,&/*G$FSILV;.'/JW,FSI\^?0(,*'4JTJ-&C2),J7<JT diff --git a/libarchive/test/test_read_format_iso_rockridge.iso.Z.uu b/libarchive/test/test_read_format_iso_rockridge.iso.Z.uu index 5f06cb3ab447..716036180cd0 100644 --- a/libarchive/test/test_read_format_iso_rockridge.iso.Z.uu +++ b/libarchive/test/test_read_format_iso_rockridge.iso.Z.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_iso_rockridge.iso.Z.uu 201247 2009-12-30 05:59:21Z kientzle $ - begin 644 test_read_format_iso_rockridge.iso.Z M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR MI,F3*%.J7,FRI<N7,&/*G$FSILV;.'/JW,FSI\^?0(,*'4JTJ-&C2),J7<JT diff --git a/libarchive/test/test_read_format_iso_rockridge_ce.iso.Z.uu b/libarchive/test/test_read_format_iso_rockridge_ce.iso.Z.uu index 00848957056a..cd817abce1f4 100644 --- a/libarchive/test/test_read_format_iso_rockridge_ce.iso.Z.uu +++ b/libarchive/test/test_read_format_iso_rockridge_ce.iso.Z.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_iso_rockridge_ce.iso.Z.uu 201247 2009-12-30 05:59:21Z kientzle $ - begin 644 test_read_format_iso_rockridge_ce.iso.Z M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR MI,F3*%.J7,FRI<N7,&/*G$FSILV;.'/JW,FSI\^?0(,*'4JTJ-&C2),J7<JT diff --git a/libarchive/test/test_read_format_iso_rockridge_new.iso.Z.uu b/libarchive/test/test_read_format_iso_rockridge_new.iso.Z.uu index 3ef253b5b1cd..8ccfe59a73bd 100644 --- a/libarchive/test/test_read_format_iso_rockridge_new.iso.Z.uu +++ b/libarchive/test/test_read_format_iso_rockridge_new.iso.Z.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_iso_rockridge_new.iso.Z.uu 201247 2009-12-30 05:59:21Z kientzle $ - begin 644 test_read_format_iso_rockridge_new.iso.Z M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR MI,F3*%.J7,FRI<N7,&/*G$FSILV;.'/JW,FSI\^?0(,*'4JTJ-&C2),J7<JT diff --git a/libarchive/test/test_read_format_iso_rockridge_rr_moved.iso.Z.uu b/libarchive/test/test_read_format_iso_rockridge_rr_moved.iso.Z.uu index 8ec91cc2d909..f710d2586c93 100644 --- a/libarchive/test/test_read_format_iso_rockridge_rr_moved.iso.Z.uu +++ b/libarchive/test/test_read_format_iso_rockridge_rr_moved.iso.Z.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_iso_rockridge_rr_moved.iso.Z.uu 201247 2009-12-30 05:59:21Z kientzle $ - begin 644 test_read_format_iso_rockridge_rr_moved.iso.Z M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR MI,F3*%.J7,FRI<N7,&/*G$FSILV;.'/JW,FSI\^?0(,*'4JTJ-&C2),J7<JT diff --git a/libarchive/test/test_read_format_iso_xorriso.c b/libarchive/test/test_read_format_iso_xorriso.c index ce71a560a01c..ca8a027b5ad2 100644 --- a/libarchive/test/test_read_format_iso_xorriso.c +++ b/libarchive/test/test_read_format_iso_xorriso.c @@ -23,8 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); - /* Execute the following command to rebuild the data for this program: diff --git a/libarchive/test/test_read_format_iso_zisofs.iso.Z.uu b/libarchive/test/test_read_format_iso_zisofs.iso.Z.uu index ef54ca6c7701..53e75cabae1a 100644 --- a/libarchive/test/test_read_format_iso_zisofs.iso.Z.uu +++ b/libarchive/test/test_read_format_iso_zisofs.iso.Z.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_iso_zisofs.iso.Z.uu 201247 2009-12-30 05:59:21Z kientzle $ - begin 644 test_read_format_iso_zisofs.iso.Z M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR MI,F3*%.J7,FRI<N7,&/*G$FSILV;.'/JW,FSI\^?0(,*'4JTJ-&C2),J7<JT diff --git a/libarchive/test/test_read_format_isojoliet_bz2.c b/libarchive/test/test_read_format_isojoliet_bz2.c index eb33c0b4f829..68a9486e7aac 100644 --- a/libarchive/test/test_read_format_isojoliet_bz2.c +++ b/libarchive/test/test_read_format_isojoliet_bz2.c @@ -27,7 +27,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_isojoliet_bz2.c 201247 2009-12-30 05:59:21Z kientzle $"); /* Execute the following to rebuild the data for this program: diff --git a/libarchive/test/test_read_format_isojoliet_long.c b/libarchive/test/test_read_format_isojoliet_long.c index 4283c399fbb4..fa089c1de1c9 100644 --- a/libarchive/test/test_read_format_isojoliet_long.c +++ b/libarchive/test/test_read_format_isojoliet_long.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_isojoliet_long.c 201247 2009-12-30 05:59:21Z kientzle $"); /* Execute the following to rebuild the data for this program: @@ -115,7 +114,7 @@ DEFINE_TEST(test_read_format_isojoliet_long) pathname[102] = '3'; pathname[103] = '\0'; assertEqualInt(0, archive_read_next_header(a, &ae)); - assertEqualString("hardlink", archive_entry_pathname(ae)); + assertEqualString(pathname, archive_entry_pathname(ae)); assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); assert(archive_entry_hardlink(ae) == NULL); assertEqualInt(6, archive_entry_size(ae)); @@ -129,9 +128,9 @@ DEFINE_TEST(test_read_format_isojoliet_long) /* Second name for the same regular file (this happens to be * returned second, so does get marked as a hardlink). */ assertEqualInt(0, archive_read_next_header(a, &ae)); - assertEqualString(pathname, archive_entry_pathname(ae)); + assertEqualString("hardlink", archive_entry_pathname(ae)); assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); - assertEqualString("hardlink", archive_entry_hardlink(ae)); + assertEqualString(pathname, archive_entry_hardlink(ae)); assert(!archive_entry_size_is_set(ae)); assertEqualInt(archive_entry_is_encrypted(ae), 0); assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); diff --git a/libarchive/test/test_read_format_isojoliet_rr.c b/libarchive/test/test_read_format_isojoliet_rr.c index 3c19516d614d..844f41367128 100644 --- a/libarchive/test/test_read_format_isojoliet_rr.c +++ b/libarchive/test/test_read_format_isojoliet_rr.c @@ -27,7 +27,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_isojoliet_rr.c 201247 2009-12-30 05:59:21Z kientzle $"); /* Execute the following to rebuild the data for this program: diff --git a/libarchive/test/test_read_format_isojoliet_versioned.c b/libarchive/test/test_read_format_isojoliet_versioned.c index 011b5e296b94..b8a03362274f 100644 --- a/libarchive/test/test_read_format_isojoliet_versioned.c +++ b/libarchive/test/test_read_format_isojoliet_versioned.c @@ -27,7 +27,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_isojoliet_bz2.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * The data for this testcase was provided by Mike Qin <mikeandmore@gmail.com> diff --git a/libarchive/test/test_read_format_isorr_bz2.c b/libarchive/test/test_read_format_isorr_bz2.c index fb4f4a853ab5..c1accea78792 100644 --- a/libarchive/test/test_read_format_isorr_bz2.c +++ b/libarchive/test/test_read_format_isorr_bz2.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_isorr_bz2.c 201247 2009-12-30 05:59:21Z kientzle $"); /* PLEASE use old cdrtools; mkisofs version is 2.01. diff --git a/libarchive/test/test_read_format_isorr_ce.c b/libarchive/test/test_read_format_isorr_ce.c index 1e57acb7668b..6b983e8ff4ab 100644 --- a/libarchive/test/test_read_format_isorr_ce.c +++ b/libarchive/test/test_read_format_isorr_ce.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_isorr_ce.c 201247 2009-12-30 05:59:21Z kientzle $"); /* Execute the following command to rebuild the data for this program: diff --git a/libarchive/test/test_read_format_isorr_new_bz2.c b/libarchive/test/test_read_format_isorr_new_bz2.c index 4c1b5692e9ef..787c1e6301be 100644 --- a/libarchive/test/test_read_format_isorr_new_bz2.c +++ b/libarchive/test/test_read_format_isorr_new_bz2.c @@ -23,8 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_isorr_new_bz2.c 201247 2009-12-30 05:59:21Z kientzle $"); - /* PLEASE use latest cdrtools at least mkisofs version is 2.01.01a63 or later. diff --git a/libarchive/test/test_read_format_isorr_rr_moved.c b/libarchive/test/test_read_format_isorr_rr_moved.c index 693caef621f2..a27230033672 100644 --- a/libarchive/test/test_read_format_isorr_rr_moved.c +++ b/libarchive/test/test_read_format_isorr_rr_moved.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_isorr_rr_moved.c 201247 2009-12-30 05:59:21Z kientzle $"); /* Execute the following command to rebuild the data for this program: diff --git a/libarchive/test/test_read_format_isozisofs_bz2.c b/libarchive/test/test_read_format_isozisofs_bz2.c index adf9624274e0..3f059fde08b5 100644 --- a/libarchive/test/test_read_format_isozisofs_bz2.c +++ b/libarchive/test/test_read_format_isozisofs_bz2.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_isozisofs_bz2.c 201247 2009-12-30 05:59:21Z kientzle $"); /* Execute the following command to rebuild the data for this program: diff --git a/libarchive/test/test_read_format_lha.c b/libarchive/test/test_read_format_lha.c index 6a53976c2a75..93e79183e5c3 100644 --- a/libarchive/test/test_read_format_lha.c +++ b/libarchive/test/test_read_format_lha.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); /* Execute the following command to rebuild the data for this program: diff --git a/libarchive/test/test_read_format_lha_bugfix_0.c b/libarchive/test/test_read_format_lha_bugfix_0.c index 2b4160b3220e..bbdcb81569b6 100644 --- a/libarchive/test/test_read_format_lha_bugfix_0.c +++ b/libarchive/test/test_read_format_lha_bugfix_0.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); DEFINE_TEST(test_read_format_lha_bugfix_0) { diff --git a/libarchive/test/test_read_format_lha_filename.c b/libarchive/test/test_read_format_lha_filename.c index 126a8704ce4a..d726f6245d7d 100644 --- a/libarchive/test/test_read_format_lha_filename.c +++ b/libarchive/test/test_read_format_lha_filename.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); #include <locale.h> diff --git a/libarchive/test/test_read_format_lha_filename_cp932.lzh.uu b/libarchive/test/test_read_format_lha_filename_cp932.lzh.uu index 15170146083e..a579fb1aaa61 100644 --- a/libarchive/test/test_read_format_lha_filename_cp932.lzh.uu +++ b/libarchive/test/test_read_format_lha_filename_cp932.lzh.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_lha_cp932.lzh +begin 644 test_read_format_lha_filename_cp932.lzh M30`M;&@P+0@````(````*:2#32`"&4A-!P!&I`,```L``8J_CIHN='AT&P!! M-'"`))KERP%TJNDQFN7+`72JZ3&:Y<L!!@``T2,'``"*OXZ:@JF"R$L`+6QH M,"T$````!````#RD@TT@`NA;30<`1J0#```)``&57"YT>'0;`$&:91,VFN7+ diff --git a/libarchive/test/test_read_format_lha_filename_utf16.c b/libarchive/test/test_read_format_lha_filename_utf16.c index 7ab13e43bdd3..d0710799bba4 100644 --- a/libarchive/test/test_read_format_lha_filename_utf16.c +++ b/libarchive/test/test_read_format_lha_filename_utf16.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); #include <locale.h> diff --git a/libarchive/test/test_read_format_lha_filename_utf16.lzh.uu b/libarchive/test/test_read_format_lha_filename_utf16.lzh.uu index ca5da7a64e59..0eeea817b462 100644 --- a/libarchive/test/test_read_format_lha_filename_utf16.lzh.uu +++ b/libarchive/test/test_read_format_lha_filename_utf16.lzh.uu @@ -1,19 +1,19 @@ -begin 644 test_read_format_lha_filename_utf16.lzh
-M@0`M;&@P+0P````,````L/5872`"IW%-!P!&I`,```T``5]?7U]?7RYT>'0*
-M``)?7U]?7U__%P!$Y`#V`/P`Q`#6`-P`+@!T`'@`=``1`$7<`-8`Q`#\`/8`
-MY`#__QL`078S<F.15=4!]0V8@I%5U0'U#9B"D575`08```\:!P``PZ3#ML.\
-MPX3#EL.<90`M;&AD+0``````````PX"D72`"``!-!P!&I`,```,``0H``E]?
-M7U]?7_\%`$`0`!$`1=P`U@#$`/P`]@#D`/__&P!!FDHB>9B"U0$H^DQ_F(+5
-M`2CZ3'^8@M4!!@``GW<'``!J`"UL:#`M&0```!D```!V)L1=(`*CNTT'`$:D
-M`P``#0`!@V6#6(-G+G1X=`H``E]?7U]?7_\1`$7<`-8`Q`#\`/8`Y`#__QL`
-M00IF#4J@E-4!L"5C?'65U0&P)6-\=975`08``$%^!P``5&5S="!I;B!*87!A
-M;F5S92!+871A:V%N87L`+6QH,"T,````#````+#U6%T@`J=Q30<`1J0#```-
-M``%?7U]?7U\N='AT"@`"@V6#6(-G_Q<`1.0`]@#\`,0`U@#<`"X`=`!X`'0`
-M"P!%QC"Y,,@P__\;`$'D5O!-H)35`?4-F(*15=4!Y%;P3:"4U0$&``"A+0<`
-M`,.DP[;#O,.$PY;#G%0`+6QH9"T``````````-3`PET@`@``30<`1J0#```#
-M``$*``*#98-8@V?_!0!`$``;`$%%!\Y.H)35`3/_]%&@E-4!,__T4:"4U0$&
-M``!>;@<``&8`+6QH,"T,````#````+#U6%T@`J=Q30<`1J0#```-``%?7U]?
-M7U\N='AT%P!$Y`#V`/P`Q`#6`-P`+@!T`'@`=``;`$'D5O!-H)35`?4-F(*1
-@5=4!Y%;P3:"4U0$&``"M>`<``,.DP[;#O,.$PY;#G`#D
-`
-end
+begin 644 test_read_format_lha_filename_utf16.lzh +M@0`M;&@P+0P````,````L/5872`"IW%-!P!&I`,```T``5]?7U]?7RYT>'0* +M``)?7U]?7U__%P!$Y`#V`/P`Q`#6`-P`+@!T`'@`=``1`$7<`-8`Q`#\`/8` +MY`#__QL`078S<F.15=4!]0V8@I%5U0'U#9B"D575`08```\:!P``PZ3#ML.\ +MPX3#EL.<90`M;&AD+0``````````PX"D72`"``!-!P!&I`,```,``0H``E]? +M7U]?7_\%`$`0`!$`1=P`U@#$`/P`]@#D`/__&P!!FDHB>9B"U0$H^DQ_F(+5 +M`2CZ3'^8@M4!!@``GW<'``!J`"UL:#`M&0```!D```!V)L1=(`*CNTT'`$:D +M`P``#0`!@V6#6(-G+G1X=`H``E]?7U]?7_\1`$7<`-8`Q`#\`/8`Y`#__QL` +M00IF#4J@E-4!L"5C?'65U0&P)6-\=975`08``$%^!P``5&5S="!I;B!*87!A +M;F5S92!+871A:V%N87L`+6QH,"T,````#````+#U6%T@`J=Q30<`1J0#```- +M``%?7U]?7U\N='AT"@`"@V6#6(-G_Q<`1.0`]@#\`,0`U@#<`"X`=`!X`'0` +M"P!%QC"Y,,@P__\;`$'D5O!-H)35`?4-F(*15=4!Y%;P3:"4U0$&``"A+0<` +M`,.DP[;#O,.$PY;#G%0`+6QH9"T``````````-3`PET@`@``30<`1J0#```# +M``$*``*#98-8@V?_!0!`$``;`$%%!\Y.H)35`3/_]%&@E-4!,__T4:"4U0$& +M``!>;@<``&8`+6QH,"T,````#````+#U6%T@`J=Q30<`1J0#```-``%?7U]? +M7U\N='AT%P!$Y`#V`/P`Q`#6`-P`+@!T`'@`=``;`$'D5O!-H)35`?4-F(*1 +@5=4!Y%;P3:"4U0$&``"M>`<``,.DP[;#O,.$PY;#G`#D +` +end diff --git a/libarchive/test/test_read_format_mtree.c b/libarchive/test/test_read_format_mtree.c index 41d325788923..70730839386d 100644 --- a/libarchive/test/test_read_format_mtree.c +++ b/libarchive/test/test_read_format_mtree.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_mtree.c 201247 2009-12-30 05:59:21Z kientzle $"); static void test_read_format_mtree1(void) @@ -789,6 +788,7 @@ DEFINE_TEST(test_read_format_mtree_nonexistent_contents_file) assertEqualInt(ARCHIVE_OK, archive_read_close(a)); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); } + /* * Check mtree file with non-printable ascii characters */ @@ -814,3 +814,32 @@ DEFINE_TEST(test_read_format_mtree_noprint) assertEqualInt(ARCHIVE_OK, archive_read_close(a)); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); } + +/* + * Check mtree file with tab characters, which are supported but not printable + */ +DEFINE_TEST(test_read_format_mtree_tab) +{ + static char archive[] = + "#mtree\n" + "\ta\ttype=file\n"; + struct archive_entry *ae; + struct archive *a; + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, archive, sizeof(archive))); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString(archive_entry_pathname(ae), "a"); + assertEqualInt(archive_entry_filetype(ae), AE_IFREG); + + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + assertEqualInt(1, archive_file_count(a)); + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} diff --git a/libarchive/test/test_read_format_pax_bz2.c b/libarchive/test/test_read_format_pax_bz2.c index 8c5d28ec05d6..4f11137b9c6f 100644 --- a/libarchive/test/test_read_format_pax_bz2.c +++ b/libarchive/test/test_read_format_pax_bz2.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_pax_bz2.c 201247 2009-12-30 05:59:21Z kientzle $"); static unsigned char archive[] = { 'B','Z','h','9','1','A','Y','&','S','Y',152,180,30,185,0,0,140,127,176,212, diff --git a/libarchive/test/test_read_format_rar.c b/libarchive/test/test_read_format_rar.c index 1425eb9a4570..dce567af48a9 100644 --- a/libarchive/test/test_read_format_rar.c +++ b/libarchive/test/test_read_format_rar.c @@ -214,6 +214,14 @@ DEFINE_TEST(test_read_format_rar_unicode_UTF8) assert((a = archive_read_new()) != NULL); assertA(0 == archive_read_support_filter_all(a)); assertA(0 == archive_read_support_format_all(a)); +#if defined(_WIN32) && !defined(__CYGWIN__) + /* Windows will use OEMCP as default, but the file is UTF-8. */ + if (ARCHIVE_OK != archive_read_set_options(a, "rar:hdrcharset=UTF-8")) { + skipping("This system cannot read input as UTF-8."); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + return; + } +#endif assertA(0 == archive_read_open_filename(a, reffile, 10240)); /* First header. */ @@ -879,16 +887,9 @@ DEFINE_TEST(test_read_format_rar_windows) assertEqualInt(ARCHIVE_OK, archive_read_free(a)); } -DEFINE_TEST(test_read_format_rar_multivolume) +static void +test_read_format_rar_multivolume_test_body_helper(struct archive *a) { - const char *reffiles[] = - { - "test_read_format_rar_multivolume.part0001.rar", - "test_read_format_rar_multivolume.part0002.rar", - "test_read_format_rar_multivolume.part0003.rar", - "test_read_format_rar_multivolume.part0004.rar", - NULL - }; int file1_size = 241647978, offset = 0; char buff[64]; const char file1_test_txt[] = "gin-bottom: 0in\"><BR>\n</P>\n</BODY>\n" @@ -903,13 +904,6 @@ DEFINE_TEST(test_read_format_rar_multivolume) int file3_size = sizeof(file3_buff); const char file3_test_txt[] = "test text document\r\n"; struct archive_entry *ae; - struct archive *a; - - extract_reference_files(reffiles); - assert((a = archive_read_new()) != NULL); - assertA(0 == archive_read_support_filter_all(a)); - assertA(0 == archive_read_support_format_all(a)); - assertA(0 == archive_read_open_filenames(a, reffiles, 10240)); /* First header. */ assertA(0 == archive_read_next_header(a, &ae)); @@ -1016,6 +1010,65 @@ DEFINE_TEST(test_read_format_rar_multivolume) assertEqualInt(ARCHIVE_OK, archive_read_free(a)); } +DEFINE_TEST(test_read_format_rar_multivolume) +{ + const char *reffiles[] = + { + "test_read_format_rar_multivolume.part0001.rar", + "test_read_format_rar_multivolume.part0002.rar", + "test_read_format_rar_multivolume.part0003.rar", + "test_read_format_rar_multivolume.part0004.rar", + NULL + }; + + struct archive *a; + + extract_reference_files(reffiles); + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_filter_all(a)); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_open_filenames(a, reffiles, 10240)); + + test_read_format_rar_multivolume_test_body_helper(a); +} + +/* As above, but using read_open_filenames_w */ +DEFINE_TEST(test_read_format_rar_multivolume_w) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + const char *reffiles[] = + { + "test_read_format_rar_multivolume.part0001.rar", + "test_read_format_rar_multivolume.part0002.rar", + "test_read_format_rar_multivolume.part0003.rar", + "test_read_format_rar_multivolume.part0004.rar", + NULL + }; + + const wchar_t *wreffiles[] = + { + L"test_read_format_rar_multivolume.part0001.rar", + L"test_read_format_rar_multivolume.part0002.rar", + L"test_read_format_rar_multivolume.part0003.rar", + L"test_read_format_rar_multivolume.part0004.rar", + NULL + }; + + struct archive *a; + + extract_reference_files(reffiles); + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_filter_all(a)); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_open_filenames_w(a, wreffiles, 10240)); + + test_read_format_rar_multivolume_test_body_helper(a); +#else + skipping("archive_read_open_filenames_w is not available on this platform"); + return; +#endif +} + DEFINE_TEST(test_read_format_rar_multivolume_skip) { const char *reffiles[] = diff --git a/libarchive/test/test_read_format_rar.rar.uu b/libarchive/test/test_read_format_rar.rar.uu index 75f93b4c281a..f197a2983302 100644 --- a/libarchive/test/test_read_format_rar.rar.uu +++ b/libarchive/test/test_read_format_rar.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar.rar M4F%R(1H'`,^0<P``#0````````"$4G0@D#(`%````!0````#0J+(OK=VVCX4 M,`@`I($``'1E<W0N='AT@`BW=MH^MW;:/G1E<W0@=&5X="!D;V-U;65N=`T* MG2]T()`R``@````(`````WM$R;;13-@^%#`(`/^A``!T97-T;&EN:\`(T4S8 diff --git a/libarchive/test/test_read_format_rar5.c b/libarchive/test/test_read_format_rar5.c index acc90510946b..705913b04cc2 100644 --- a/libarchive/test/test_read_format_rar5.c +++ b/libarchive/test/test_read_format_rar5.c @@ -168,7 +168,7 @@ DEFINE_TEST(test_read_format_rar5_compressed) assertEqualInt(DATA_SIZE, archive_entry_size(ae)); assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE)); assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae)); - verify_data(buff, 0, DATA_SIZE); + assertA(1 == verify_data(buff, 0, DATA_SIZE)); EPILOGUE(); } @@ -187,25 +187,25 @@ DEFINE_TEST(test_read_format_rar5_multiple_files) assertEqualString("test1.bin", archive_entry_pathname(ae)); assertEqualInt(DATA_SIZE, archive_entry_size(ae)); assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE)); - assertA(verify_data(buff, 1, DATA_SIZE)); + assertA(1 == verify_data(buff, 1, DATA_SIZE)); assertA(0 == archive_read_next_header(a, &ae)); assertEqualString("test2.bin", archive_entry_pathname(ae)); assertEqualInt(DATA_SIZE, archive_entry_size(ae)); assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE)); - assertA(verify_data(buff, 2, DATA_SIZE)); + assertA(1 == verify_data(buff, 2, DATA_SIZE)); assertA(0 == archive_read_next_header(a, &ae)); assertEqualString("test3.bin", archive_entry_pathname(ae)); assertEqualInt(DATA_SIZE, archive_entry_size(ae)); assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE)); - assertA(verify_data(buff, 3, DATA_SIZE)); + assertA(1 == verify_data(buff, 3, DATA_SIZE)); assertA(0 == archive_read_next_header(a, &ae)); assertEqualString("test4.bin", archive_entry_pathname(ae)); assertEqualInt(DATA_SIZE, archive_entry_size(ae)); assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE)); - assertA(verify_data(buff, 4, DATA_SIZE)); + assertA(1 == verify_data(buff, 4, DATA_SIZE)); /* There should be no more files in this archive. */ @@ -230,25 +230,25 @@ DEFINE_TEST(test_read_format_rar5_multiple_files_solid) assertEqualString("test1.bin", archive_entry_pathname(ae)); assertEqualInt(DATA_SIZE, archive_entry_size(ae)); assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE)); - assertA(verify_data(buff, 1, DATA_SIZE)); + assertA(1 == verify_data(buff, 1, DATA_SIZE)); assertA(0 == archive_read_next_header(a, &ae)); assertEqualString("test2.bin", archive_entry_pathname(ae)); assertEqualInt(DATA_SIZE, archive_entry_size(ae)); assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE)); - assertA(verify_data(buff, 2, DATA_SIZE)); + assertA(1 == verify_data(buff, 2, DATA_SIZE)); assertA(0 == archive_read_next_header(a, &ae)); assertEqualString("test3.bin", archive_entry_pathname(ae)); assertEqualInt(DATA_SIZE, archive_entry_size(ae)); assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE)); - assertA(verify_data(buff, 3, DATA_SIZE)); + assertA(1 == verify_data(buff, 3, DATA_SIZE)); assertA(0 == archive_read_next_header(a, &ae)); assertEqualString("test4.bin", archive_entry_pathname(ae)); assertEqualInt(DATA_SIZE, archive_entry_size(ae)); assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE)); - assertA(verify_data(buff, 4, DATA_SIZE)); + assertA(1 == verify_data(buff, 4, DATA_SIZE)); assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae)); EPILOGUE(); @@ -806,6 +806,36 @@ DEFINE_TEST(test_read_format_rar5_extract_win32) EPILOGUE(); } +DEFINE_TEST(test_read_format_rar5_unicode) +{ +#if !defined(WIN32) || defined(__CYGWIN__) + skipping("Skipping test on non-Windows"); + return; +#else + /* Corresponds to the names: + * 👋🌎.txt + * 𝒮𝓎𝓂𝒷𝑜𝓁𝒾𝒸 𝐿𝒾𝓃𝓀.txt + * Ⓗⓐⓡⓓ Ⓛⓘⓝⓚ.txt */ + const wchar_t* emoji_name = L"\U0001f44b\U0001f30e.txt"; + const wchar_t* italic_name = L"\U0001d4ae\U0001d4ce\U0001d4c2\U0001d4b7\U0001d45c\U0001d4c1\U0001d4be\U0001d4b8 \U0001d43f\U0001d4be\U0001d4c3\U0001d4c0.txt"; + const wchar_t* circle_name = L"\u24bd\u24d0\u24e1\u24d3 \u24c1\u24d8\u24dd\u24da.txt"; + + PROLOGUE("test_read_format_rar5_unicode.rar"); + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualWString(emoji_name, archive_entry_pathname_w(ae)); + assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualWString(circle_name, archive_entry_pathname_w(ae)); + assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); + assertEqualWString(emoji_name, archive_entry_hardlink_w(ae)); + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualWString(italic_name, archive_entry_pathname_w(ae)); + assertEqualInt(archive_entry_mode(ae), AE_IFLNK | 0644); + assertEqualWString(emoji_name, archive_entry_symlink_w(ae)); + EPILOGUE(); +#endif +} + DEFINE_TEST(test_read_format_rar5_block_by_block) { /* This test uses strange buffer sizes intentionally. */ @@ -1310,6 +1340,8 @@ DEFINE_TEST(test_read_format_rar5_sfx) assertA(size == archive_read_data(a, buff, size)); assertEqualMem(buff, test_txt, size); + + EPILOGUE(); } DEFINE_TEST(test_read_format_rar5_decode_number_out_of_bounds_read) @@ -1346,4 +1378,27 @@ DEFINE_TEST(test_read_format_rar5_bad_window_size_in_multiarchive_file) while(0 < archive_read_data(a, buf, sizeof(buf))) {} EPILOGUE(); -}
\ No newline at end of file +} + +DEFINE_TEST(test_read_format_rar5_read_data_block_uninitialized_offset) +{ + const void *buf; + size_t size; + la_int64_t offset; + + PROLOGUE("test_read_format_rar5_compressed.rar"); + assertA(0 == archive_read_next_header(a, &ae)); + + /* A real code may pass a pointer to an uninitialized variable as an offset + * output argument. Here we want to check this situation. But because + * relying on a value of an uninitialized variable in a test is not a good + * idea, let's pretend that 0xdeadbeef is a random value of the + * uninitialized variable. */ + offset = 0xdeadbeef; + assertEqualInt(ARCHIVE_OK, archive_read_data_block(a, &buf, &size, &offset)); + /* The test archive doesn't contain a sparse file. And because of that, here + * we assume that the first returned offset should be 0. */ + assertEqualInt(0, offset); + + EPILOGUE(); +} diff --git a/libarchive/test/test_read_format_rar5_bad_window_sz_in_mltarc_file.rar.uu b/libarchive/test/test_read_format_rar5_bad_window_sz_in_mltarc_file.rar.uu index 7684bc199bf9..4decccb38574 100644 --- a/libarchive/test/test_read_format_rar5_bad_window_sz_in_mltarc_file.rar.uu +++ b/libarchive/test/test_read_format_rar5_bad_window_sz_in_mltarc_file.rar.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_rar5_bad_window_size_in_multiarchive_file.rar +begin 644 test_read_format_rar5_bad_window_sz_in_mltarc_file.rar M4F%R(1H'`0`]/-[E`@$`_R`@1#[Z5P("`PL`("`@@"(`"?\@("#___\@("`@ M("`@("`@("`@4X`J]`,"YR(#$($@("`@``$@("`@@<L0("`@("`@("`@("`@ M("`@(""LCTJA`P$%`B`@`2!3@"KT`P+G(@,@("`@_P,!!B`@(/___R`@(('+ diff --git a/libarchive/test/test_read_format_rar5_compressed.rar.uu b/libarchive/test/test_read_format_rar5_compressed.rar.uu index f9f811c6dc0d..dbd42f09cbb6 100644 --- a/libarchive/test/test_read_format_rar5_compressed.rar.uu +++ b/libarchive/test/test_read_format_rar5_compressed.rar.uu @@ -1,4 +1,4 @@ -begin 644 rar5_compressed.rar +begin 644 test_read_format_rar5_compressed.rar M4F%R(1H'`0#SX8+K"P$%!P`&`0&`@(``B<9?VB8"`POI`@2P":2#`LUPRGR` M!0$(=&5S="YB:6X*`Q.+5ZQ;^!BM'LKT90$G96!4'U5V7;^4DG')SV6660QP MV663&,62$X9"223AD)"2220DXY))(0A))"$)))"22$(2$LVU;WM],PZ`?1T# diff --git a/libarchive/test/test_read_format_rar5_different_winsize_on_merge.rar.uu b/libarchive/test/test_read_format_rar5_different_winsize_on_merge.rar.uu index 85391fa4e1f6..9a3423e37afa 100644 --- a/libarchive/test/test_read_format_rar5_different_winsize_on_merge.rar.uu +++ b/libarchive/test/test_read_format_rar5_different_winsize_on_merge.rar.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_rar5_different_winsize_on_merge.rar.uu +begin 644 test_read_format_rar5_different_winsize_on_merge.rar M4F%R(1H'`0"-[P+2``+''QP,!`H``"0`N)$#`0(H$"<"``X`/3Q/`0"V```` MQ@$````V`/^%02`H^B7&,NX``"F&AK%M-50O<WY2!P$`C>\"T@`"_[6U,1"U MM;6UM[BU45)A<K6UM;6UM+6U```\______?______________P`&80"-[P+2 diff --git a/libarchive/test/test_read_format_rar5_multiarchive.part01.rar.uu b/libarchive/test/test_read_format_rar5_multiarchive.part01.rar.uu index a83c78ca22cd..9006181efaee 100644 --- a/libarchive/test/test_read_format_rar5_multiarchive.part01.rar.uu +++ b/libarchive/test/test_read_format_rar5_multiarchive.part01.rar.uu @@ -1,4 +1,4 @@ -begin 644 rar5_multiarchive.part01.rar +begin 644 test_read_format_rar5_multiarchive.part01.rar M4F%R(1H'`0!5`$'/#`$%"`$'`0'O]H"``.>[Y2I7`A,+@O8`!.#I".V#`FI) M!96`%0$W:&]M92]A;G1E:R]T96UP+V)U:6QD+W5N<F%R-2]L:6)A<F-H:79E M+V)I;B]B<V1C871?=&5S=`H#$Z@$JUL/WSH`BQ&75V"(540R)79@1V>KN2Y+ diff --git a/libarchive/test/test_read_format_rar5_multiarchive.part02.rar.uu b/libarchive/test/test_read_format_rar5_multiarchive.part02.rar.uu index fce29824622d..d766ccee9d87 100644 --- a/libarchive/test/test_read_format_rar5_multiarchive.part02.rar.uu +++ b/libarchive/test/test_read_format_rar5_multiarchive.part02.rar.uu @@ -1,4 +1,4 @@ -begin 644 rar5_multiarchive.part02.rar +begin 644 test_read_format_rar5_multiarchive.part02.rar M4F%R(1H'`0"ZHBK1#0$%"`,!!P$![_:`@`!@&RUZ5P(;"X'V``3@Z0CM@P)= M-\$R@!4!-VAO;64O86YT96LO=&5M<"]B=6EL9"]U;G)A<C4O;&EB87)C:&EV M92]B:6XO8G-D8V%T7W1E<W0*`Q.H!*M;#]\Z`,C&\^P15*#4'A\D!$R&)9;I diff --git a/libarchive/test/test_read_format_rar5_multiarchive.part03.rar.uu b/libarchive/test/test_read_format_rar5_multiarchive.part03.rar.uu index c600f025395e..b2bd1a72bafa 100644 --- a/libarchive/test/test_read_format_rar5_multiarchive.part03.rar.uu +++ b/libarchive/test/test_read_format_rar5_multiarchive.part03.rar.uu @@ -1,4 +1,4 @@ -begin 644 rar5_multiarchive.part03.rar +begin 644 test_read_format_rar5_multiarchive.part03.rar M4F%R(1H'`0`S!&6T#0$%"`,"!P$!@_:`@`#;[#5T5P(+"_W#``3@Z0CM@P)S M="<U@!4!-VAO;64O86YT96LO=&5M<"]B=6EL9"]U;G)A<C4O;&EB87)C:&EV M92]B:6XO8G-D8V%T7W1E<W0*`Q.H!*M;#]\Z`+YO1=#5A^0(J_-LW+!*WYK9 diff --git a/libarchive/test/test_read_format_rar5_multiarchive.part04.rar.uu b/libarchive/test/test_read_format_rar5_multiarchive.part04.rar.uu index 3b47dd07c873..afd18ab0a896 100644 --- a/libarchive/test/test_read_format_rar5_multiarchive.part04.rar.uu +++ b/libarchive/test/test_read_format_rar5_multiarchive.part04.rar.uu @@ -1,4 +1,4 @@ -begin 644 rar5_multiarchive.part04.rar +begin 644 test_read_format_rar5_multiarchive.part04.rar M4F%R(1H'`0`\BMS_#0$%"`,#!P$![_:`@``H3"7!5P(;"X'V``3HJ!;M@P)= M?Y*E@!4!-VAO;64O86YT96LO=&5M<"]B=6EL9"]U;G)A<C4O;&EB87)C:&EV M92]B:6XO8G-D=&%R7W1E<W0*`Q.J!*M;T74"-U,K[HY2T0OI6D^@"4>G(I3D diff --git a/libarchive/test/test_read_format_rar5_multiarchive.part05.rar.uu b/libarchive/test/test_read_format_rar5_multiarchive.part05.rar.uu index 4dc97d65ea1e..a9f1981e4845 100644 --- a/libarchive/test/test_read_format_rar5_multiarchive.part05.rar.uu +++ b/libarchive/test/test_read_format_rar5_multiarchive.part05.rar.uu @@ -1,4 +1,4 @@ -begin 644 rar5_multiarchive.part05.rar +begin 644 test_read_format_rar5_multiarchive.part05.rar M4F%R(1H'`0#UY[V;#0$%"`,$!P$![_:`@`"(]4(L5P(;"X'V``3HJ!;M@P+] MF?Z`@!4!-VAO;64O86YT96LO=&5M<"]B=6EL9"]U;G)A<C4O;&EB87)C:&EV M92]B:6XO8G-D=&%R7W1E<W0*`Q.J!*M;T74"-[]V(;"@ZL+ZZ0DS>@98+@$> diff --git a/libarchive/test/test_read_format_rar5_multiarchive.part06.rar.uu b/libarchive/test/test_read_format_rar5_multiarchive.part06.rar.uu index 1e2ad0cf9833..1ba155dbf4c8 100644 --- a/libarchive/test/test_read_format_rar5_multiarchive.part06.rar.uu +++ b/libarchive/test/test_read_format_rar5_multiarchive.part06.rar.uu @@ -1,4 +1,4 @@ -begin 644 rar5_multiarchive.part06.rar +begin 644 test_read_format_rar5_multiarchive.part06.rar M4F%R(1H'`0"V\\:,#0$%"`,%!P$![_:`@``2\>%K5P(;"X'V``3HJ!;M@P(] M(D2J@!4!-VAO;64O86YT96LO=&5M<"]B=6EL9"]U;G)A<C4O;&EB87)C:&EV M92]B:6XO8G-D=&%R7W1E<W0*`Q.J!*M;T74"-\2/YDWQ,%)DI56J+M4UB8>R diff --git a/libarchive/test/test_read_format_rar5_multiarchive.part07.rar.uu b/libarchive/test/test_read_format_rar5_multiarchive.part07.rar.uu index de1044e30589..23ba290ad4ed 100644 --- a/libarchive/test/test_read_format_rar5_multiarchive.part07.rar.uu +++ b/libarchive/test/test_read_format_rar5_multiarchive.part07.rar.uu @@ -1,4 +1,4 @@ -begin 644 rar5_multiarchive.part07.rar +begin 644 test_read_format_rar5_multiarchive.part07.rar M4F%R(1H'`0!SSTNU#0$%"`,&!P$![_:`@`#=K"Q/5P(;"X'V``3HJ!;M@P*V M0J=E@!4!-VAO;64O86YT96LO=&5M<"]B=6EL9"]U;G)A<C4O;&EB87)C:&EV M92]B:6XO8G-D=&%R7W1E<W0*`Q.J!*M;T74"-YY^$-E'40]L2'?%!?HA6*"R diff --git a/libarchive/test/test_read_format_rar5_multiarchive.part08.rar.uu b/libarchive/test/test_read_format_rar5_multiarchive.part08.rar.uu index eae45fc7a2fb..459beb48d241 100644 --- a/libarchive/test/test_read_format_rar5_multiarchive.part08.rar.uu +++ b/libarchive/test/test_read_format_rar5_multiarchive.part08.rar.uu @@ -1,4 +1,4 @@ -begin 644 rar5_multiarchive.part08.rar +begin 644 test_read_format_rar5_multiarchive.part08.rar M4F%R(1H'`0#"(ZNP#0$%"`,'!P$!\,:`@`#/Q#!K5P(+"X+&``3HJ!;M@P+X M99;E@!4!-VAO;64O86YT96LO=&5M<"]B=6EL9"]U;G)A<C4O;&EB87)C:&EV M92]B:6XO8G-D=&%R7W1E<W0*`Q.J!*M;T74"-P'V.L#Y#UMO#KJ6K6EJUOF6 diff --git a/libarchive/test/test_read_format_rar5_multiple_files.rar.uu b/libarchive/test/test_read_format_rar5_multiple_files.rar.uu index 3fa8930c9d33..26ededc9b454 100644 --- a/libarchive/test/test_read_format_rar5_multiple_files.rar.uu +++ b/libarchive/test/test_read_format_rar5_multiple_files.rar.uu @@ -1,4 +1,4 @@ -begin 644 rar5_multiple_files.rar +begin 644 test_read_format_rar5_multiple_files.rar M4F%R(1H'`0#SX8+K"P$%!P`&`0&`@(```Q:>PB<"`POD`@2`(*2#`L:R$WZ` M!0$)=&5S=#$N8FEN"@,39U^L6QI:GA#*\6`!$&149R]7!6]2222222222222 M2222222222222222222222222222222222222222222222223]_>QS,[=]KH diff --git a/libarchive/test/test_read_format_rar5_multiple_files_solid.rar.uu b/libarchive/test/test_read_format_rar5_multiple_files_solid.rar.uu index 4a8acb08c45a..8ba78774dc48 100644 --- a/libarchive/test/test_read_format_rar5_multiple_files_solid.rar.uu +++ b/libarchive/test/test_read_format_rar5_multiple_files_solid.rar.uu @@ -1,4 +1,4 @@ -begin 644 rar5_multiple_files_solid.rar +begin 644 test_read_format_rar5_multiple_files_solid.rar M4F%R(1H'`0`)[\AO"P$%!P0&`0&`@(``&8R4_R<"`POY`@2`(*2#`L:R$WZ` M'0$)=&5S=#$N8FEN"@,39U^L6QI:GA#)YW4!&&5492;T@%?U\^?/DDDDDDDD MDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDO\\YG#6M diff --git a/libarchive/test/test_read_format_rar5_sfx.exe.uu b/libarchive/test/test_read_format_rar5_sfx.exe.uu index fdf83af1a238..7df65a110384 100644 --- a/libarchive/test/test_read_format_rar5_sfx.exe.uu +++ b/libarchive/test/test_read_format_rar5_sfx.exe.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar5_sfx.exe M35J0``,````$````__\``+@`````````0``````````````````````````` M````````````````````$`$```X?N@X`M`G-(;@!3,TA5&AI<R!P<F]G<F%M M(&-A;FYO="!B92!R=6X@:6X@1$]3(&UO9&4N#0T*)`````````!B8/>3)@&9 diff --git a/libarchive/test/test_read_format_rar5_stored.rar.uu b/libarchive/test/test_read_format_rar5_stored.rar.uu index 405b8795a162..afd565ff97d4 100644 --- a/libarchive/test/test_read_format_rar5_stored.rar.uu +++ b/libarchive/test/test_read_format_rar5_stored.rar.uu @@ -1,4 +1,4 @@ -begin 644 rar5_stored.rar +begin 644 test_read_format_rar5_stored.rar M4F%R(1H'`0`SDK7E"@$%!@`%`0&`@``X,`9C+`(#"YT`!)T`I(,"M$.@E8`` M`0YH96QL;W=O<FQD+G1X=`H#$WX.JUM6Z0X::&5L;&\@;&EB87)C:&EV92!T 397-T('-U:71E(0H==U91`P4$```` diff --git a/libarchive/test/test_read_format_rar5_unicode.rar.uu b/libarchive/test/test_read_format_rar5_unicode.rar.uu new file mode 100644 index 000000000000..e011ab64e689 --- /dev/null +++ b/libarchive/test/test_read_format_rar5_unicode.rar.uu @@ -0,0 +1,9 @@ +begin 0744 test_read_format_rar5_unicode.rar
+M4F%R(1H'`0#SX8+K"P$%!P`&`0&`@(``//TR$"@"`PN-``2-`"#FQN;K@```
+M#/"?D8OPGXR.+G1X=`H#`D:)>%;RZ]D!2&5L;&\L('=O<FQD(2/9BPA(`@,<
+M``0-(`````"````=XI*]XI.0XI.AXI.3(.*3@>*3F.*3G>*3FBYT>'0*`P)&
+MB7A6\NO9`1`%!``,\)^1B_"?C(XN='ATD-'.1V$"`QP`!`"@"`````"````U
+M\)V2KO"=DX[PG9."\)V2M_"=D9SPG9.!\)V2OO"=DK@@\)V0O_"=DK[PG9.#
+L\)V3@"YT>'0*`P(>7'J>!.S9`1`%`@`,\)^1B_"?C(XN='AT'7=640,%!```
+`
+end
diff --git a/libarchive/test/test_read_format_rar_binary_data.rar.uu b/libarchive/test/test_read_format_rar_binary_data.rar.uu index 4d1cbd36d633..712dd0e67879 100644 --- a/libarchive/test/test_read_format_rar_binary_data.rar.uu +++ b/libarchive/test/test_read_format_rar_binary_data.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar_binary_data.rar M4F%R(1H'`,^0<P``#0````````!W#G2@D#D`E`H0````$``#OES$M0V6!S\= M-0\`I($``')A;F1O;5]D871A+F)I;H#,#98'/Q*6!S\1#\T0T54`#0Z16Z5B MZ6W>FQ_"3YH!RD,Z.<P&4ZSGQ+1(6^9/\HXB^LD*'EY-":6Y)MO'@@4>_X"C diff --git a/libarchive/test/test_read_format_rar_compress_best.rar.uu b/libarchive/test/test_read_format_rar_compress_best.rar.uu index 22fde0f8b673..d31adcc92b00 100644 --- a/libarchive/test/test_read_format_rar_compress_best.rar.uu +++ b/libarchive/test/test_read_format_rar_compress_best.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar_compress_best.rar M4F%R(1H'`,^0<P``#0````````"/6W0@D$,`\A8``(].```#8Z8%7C:SVCX= M-1D`I($``$QI8F%R8VAI=F5!9&1I;F=497-T+FAT;6R`S#:SVC[E:?8^IQ@[ MY,&O-%WTZIVL0'K=[L^M$"SZ*I?&B@$S2EO?UM\%P_[#*[0L[1)9)\]U]*;T diff --git a/libarchive/test/test_read_format_rar_compress_normal.rar.uu b/libarchive/test/test_read_format_rar_compress_normal.rar.uu index afc6cc08db11..2cce0e14c239 100644 --- a/libarchive/test/test_read_format_rar_compress_normal.rar.uu +++ b/libarchive/test/test_read_format_rar_compress_normal.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar_compress_normal.rar M4F%R(1H'`,^0<P``#0````````!.!G0@D$,`LQL``(].```#8Z8%7C:SVCX= M,QD`I($``$QI8F%R8VAI=F5!9&1I;F=497-T+FAT;6R`S#:SVCZ4:NT^#!U1 M#,S1%\6=F]T/PH[-`V-[U)/P29F;F3P#KD;FQC9X>MJ;G<[Z6"DBFSK*16$E diff --git a/libarchive/test/test_read_format_rar_encryption_data.c b/libarchive/test/test_read_format_rar_encryption_data.c index d0c06fb21499..540546a8dd8a 100644 --- a/libarchive/test/test_read_format_rar_encryption_data.c +++ b/libarchive/test/test_read_format_rar_encryption_data.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_rar_encryption_data) { diff --git a/libarchive/test/test_read_format_rar_encryption_header.c b/libarchive/test/test_read_format_rar_encryption_header.c index 81965eb6787f..e54db5152383 100644 --- a/libarchive/test/test_read_format_rar_encryption_header.c +++ b/libarchive/test/test_read_format_rar_encryption_header.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_rar_encryption_header) { diff --git a/libarchive/test/test_read_format_rar_encryption_partially.c b/libarchive/test/test_read_format_rar_encryption_partially.c index 81256a96a019..e68e78831b37 100644 --- a/libarchive/test/test_read_format_rar_encryption_partially.c +++ b/libarchive/test/test_read_format_rar_encryption_partially.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_rar_encryption_partially) { diff --git a/libarchive/test/test_read_format_rar_filter.c b/libarchive/test/test_read_format_rar_filter.c index 46c574743646..43619253e4ac 100644 --- a/libarchive/test/test_read_format_rar_filter.c +++ b/libarchive/test/test_read_format_rar_filter.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_rar_filter) { diff --git a/libarchive/test/test_read_format_rar_invalid1.c b/libarchive/test/test_read_format_rar_invalid1.c index 61dea1648f48..cac58688ce21 100644 --- a/libarchive/test/test_read_format_rar_invalid1.c +++ b/libarchive/test/test_read_format_rar_invalid1.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_rar_invalid1) { diff --git a/libarchive/test/test_read_format_rar_multi_lzss_blocks.rar.uu b/libarchive/test/test_read_format_rar_multi_lzss_blocks.rar.uu index dd6ab50f97cd..e717b00fd8ec 100644 --- a/libarchive/test/test_read_format_rar_multi_lzss_blocks.rar.uu +++ b/libarchive/test/test_read_format_rar_multi_lzss_blocks.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar_multi_lzss_blocks.rar M4F%R(1H'`,^0<P``#0````````"5L73`D$0`(TT``"<M,P$#<!6B:RZ@[CX= M,QH`I($``&UU;'1I7VQZ<W-?8FQO8VMS7W1E<W0N='ATP,PNH.X^+:#N/@W! ME1$,S1$`%=F]SKX56/`,:6:25T-W=Y;Z1J;2>M#'TZD7E[>^E"B3)2K$2:-U diff --git a/libarchive/test/test_read_format_rar_multivolume.part0001.rar.uu b/libarchive/test/test_read_format_rar_multivolume.part0001.rar.uu index 7378a9b558e8..bbe4be4c9070 100644 --- a/libarchive/test/test_read_format_rar_multivolume.part0001.rar.uu +++ b/libarchive/test/test_read_format_rar_multivolume.part0001.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar_multivolume.part0001.rar M4F%R(1H'`%IN<Q$!#0`````````SE'3"D$<`\>D``&I!9PX#@*>#,/AM$C\= M-1T`I($``'!P;61?;'IS<U]C;VYV97)S:6]N7W1E<W0N='ATP,SX;1(_P&X2 M/Z<8.^3!KS1=].J=K$!ZW>[/K1`L^BJ7QHH!,TI;W];?!</^PRNT+.T262?/ diff --git a/libarchive/test/test_read_format_rar_multivolume.part0002.rar.uu b/libarchive/test/test_read_format_rar_multivolume.part0002.rar.uu index 696ff565bdfd..a61a2fbc7312 100644 --- a/libarchive/test/test_read_format_rar_multivolume.part0002.rar.uu +++ b/libarchive/test/test_read_format_rar_multivolume.part0002.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar_multivolume.part0002.rar M4F%R(1H'`!EZ<Q$`#0````````#NWW3#D$<`\>D``&I!9PX#%Y:4IOAM$C\= M-1T`I($``'!P;61?;'IS<U]C;VYV97)S:6]N7W1E<W0N='ATP,SX;1(_P&X2 M/___________________________________________________________ diff --git a/libarchive/test/test_read_format_rar_multivolume.part0003.rar.uu b/libarchive/test/test_read_format_rar_multivolume.part0003.rar.uu index 91b7f28c5968..ef70b9eba606 100644 --- a/libarchive/test/test_read_format_rar_multivolume.part0003.rar.uu +++ b/libarchive/test/test_read_format_rar_multivolume.part0003.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar_multivolume.part0003.rar M4F%R(1H'`!EZ<Q$`#0````````#U+'3!D$<`^-T``&I!9PX#=T0K]_AM$C\= M-1T`I($``'!P;61?;'IS<U]C;VYV97)S:6]N7W1E<W0N='ATP,SX;1(_P&X2 M/QOK1E#^H^/%2CSU*]SFZB-O0P7.9&(^"2;U+Z.1_C%^3WOV,>5:-FN$2BNW diff --git a/libarchive/test/test_read_format_rar_multivolume.part0004.rar.uu b/libarchive/test/test_read_format_rar_multivolume.part0004.rar.uu index 0bfad779e1bd..20931f62c585 100644 --- a/libarchive/test/test_read_format_rar_multivolume.part0004.rar.uu +++ b/libarchive/test/test_read_format_rar_multivolume.part0004.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar_multivolume.part0004.rar M4F%R(1H'`!EZ<Q$`#0````````!AIG3!D$,`/`L``(].```#8Z8%7L"!$C\= M-1D`I($``$QI8F%R8VAI=F5!9&1I;F=497-T+FAT;6S`S,"!$C_!@1(_'H$B MVRP\K;>5J2C]?9NI\:;KW2+#TR@_Y5=4S)O&)O_B>J0/A0T-,@"ER';1YX:$ diff --git a/libarchive/test/test_read_format_rar_noeof.rar.uu b/libarchive/test/test_read_format_rar_noeof.rar.uu index 7cf88e7c6248..fd2d0d3a12bb 100644 --- a/libarchive/test/test_read_format_rar_noeof.rar.uu +++ b/libarchive/test/test_read_format_rar_noeof.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar_noeof.rar M4F%R(1H'`,^0<P``#0````````"$4G0@D#(`%````!0````#0J+(OK=VVCX4 M,`@`I($``'1E<W0N='AT@`BW=MH^MW;:/G1E<W0@=&5X="!D;V-U;65N=`T* ` diff --git a/libarchive/test/test_read_format_rar_ppmd_lzss_conversion.rar.uu b/libarchive/test/test_read_format_rar_ppmd_lzss_conversion.rar.uu index a41b007a0d23..472654259bb2 100644 --- a/libarchive/test/test_read_format_rar_ppmd_lzss_conversion.rar.uu +++ b/libarchive/test/test_read_format_rar_ppmd_lzss_conversion.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar_ppmd_lzss_conversion.rar M4F%R(1H'`,^0<P``#0````````!R,W3`D$<`VK$"`&I!9PX#=T0K]VL`!S\= M-1T`I($``'!P;61?;'IS<U]C;VYV97)S:6]N7W1E<W0N='ATP,B$``<_&[\& M/Z<8.^3!KS1=].J=K$!ZW>[/K1`L^BJ7QHH!,TI;W];?!</^PRNT+.T262?/ diff --git a/libarchive/test/test_read_format_rar_sfx.exe.uu b/libarchive/test/test_read_format_rar_sfx.exe.uu index ea084ecacb76..275d0749687a 100644 --- a/libarchive/test/test_read_format_rar_sfx.exe.uu +++ b/libarchive/test/test_read_format_rar_sfx.exe.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar_sfx.exe M35J0``,````$````__\``+@`````````0``````````````````````````` M````````````````````Z`````X?N@X`M`G-(;@!3,TA5&AI<R!P<F]G<F%M M(&-A;FYO="!B92!R=6X@:6X@1$]3(&UO9&4N#0T*)`````````#3[14&EXQ[ diff --git a/libarchive/test/test_read_format_rar_subblock.rar.uu b/libarchive/test/test_read_format_rar_subblock.rar.uu index 5c55ca11dd2a..8bd8e6038a8f 100644 --- a/libarchive/test/test_read_format_rar_subblock.rar.uu +++ b/libarchive/test/test_read_format_rar_subblock.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar_subblock.rar M4F%R(1H'`,^0<P``#0`````````##'H`@",`(@```!T````#&WQ`G@`````= M,P,``````$--5`@!"+Z0\5[-83@7PT#<+OM\M_$>H5JAD)Q_9XLAN3)VO("$ M4G0@D#(`%````!0````#0J+(OK=VVCX4,`@`I($``'1E<W0N='AT@`BW=MH^ diff --git a/libarchive/test/test_read_format_rar_windows.rar.uu b/libarchive/test/test_read_format_rar_windows.rar.uu index 05fa8db85846..daaa32b25ef1 100644 --- a/libarchive/test/test_read_format_rar_windows.rar.uu +++ b/libarchive/test/test_read_format_rar_windows.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar_windows.rar M4F%R(1H'`,^0<P``#0````````"6GW0@D$,`$````!`````"\1+6EVQA$C\4 M,!``(````'1E<W1D:7)<=&5S="YT>'3POU/A"W5A$C_#FG]U81(_PYI_=&5S M="!T97AT(&9I;&4-"D."=""0.P`0````$`````+Q$M:7;&$2/Q0P"``@```` diff --git a/libarchive/test/test_read_format_raw.bufr.uu b/libarchive/test/test_read_format_raw.bufr.uu index 2f4cef74619f..896e09c8fd6b 100644 --- a/libarchive/test/test_read_format_raw.bufr.uu +++ b/libarchive/test/test_read_format_raw.bufr.uu @@ -1,4 +1,4 @@ -begin 660 test_read_format_raw.bufr.uu +begin 660 test_read_format_raw.bufr M,#`P-S0T.3@P,`$-#0HP,#`-#0I)15%8,#$@155-4"`P-S`U,#`-#0I"5492 M`2+?!```%@``_@`````#_]T0``?@"P<$.P````D``'C`Z`@!(K0``,``_@!N M@#T!^`"P!P"!`````"JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ@#=]]]]] diff --git a/libarchive/test/test_read_format_raw.c b/libarchive/test/test_read_format_raw.c index 457db009727b..a0f68e5b880f 100644 --- a/libarchive/test/test_read_format_raw.c +++ b/libarchive/test/test_read_format_raw.c @@ -26,7 +26,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_raw.c 191594 2009-04-27 20:09:05Z kientzle $"); DEFINE_TEST(test_read_format_raw) { diff --git a/libarchive/test/test_read_format_raw.data.Z.uu b/libarchive/test/test_read_format_raw.data.Z.uu index eff01d3799e9..3fe4deaba09d 100644 --- a/libarchive/test/test_read_format_raw.data.Z.uu +++ b/libarchive/test/test_read_format_raw.data.Z.uu @@ -1,4 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_raw.data.Z.uu 191594 2009-04-27 20:09:05Z kientzle $ begin 644 test_read_format_raw.data.Z ('YV09MZ\40`` ` diff --git a/libarchive/test/test_read_format_raw.data.uu b/libarchive/test/test_read_format_raw.data.uu index e88da003fb42..7c68a2caa117 100644 --- a/libarchive/test/test_read_format_raw.data.uu +++ b/libarchive/test/test_read_format_raw.data.uu @@ -1,4 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_raw.data.uu 191594 2009-04-27 20:09:05Z kientzle $ begin 644 test_read_format_raw.data $9F]O"@`` ` diff --git a/libarchive/test/test_read_format_tar.c b/libarchive/test/test_read_format_tar.c index 7c7cadd0a38b..2b7cd8dedcca 100644 --- a/libarchive/test/test_read_format_tar.c +++ b/libarchive/test/test_read_format_tar.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_tar.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * Each of these archives is a short archive with a single entry. The diff --git a/libarchive/test/test_read_format_tar_concatenated.c b/libarchive/test/test_read_format_tar_concatenated.c index d1f67e20f7df..f6ed03a4404b 100644 --- a/libarchive/test/test_read_format_tar_concatenated.c +++ b/libarchive/test/test_read_format_tar_concatenated.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); /* * The sample tar file is the result of concatenating two tar files, diff --git a/libarchive/test/test_read_format_tar_empty_filename.c b/libarchive/test/test_read_format_tar_empty_filename.c index b1a1a4e1c821..310d260bb4d6 100644 --- a/libarchive/test/test_read_format_tar_empty_filename.c +++ b/libarchive/test/test_read_format_tar_empty_filename.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_tar_empty_filename.c,v 1.2 2008/09/01 05:38:33 kientzle Exp $"); /* * Tar entries with empty filenames are unusual, but shouldn't crash us. diff --git a/libarchive/test/test_read_format_tar_empty_filename.tar.uu b/libarchive/test/test_read_format_tar_empty_filename.tar.uu index f8a4f4f2f1b0..6cd9629278ae 100644 --- a/libarchive/test/test_read_format_tar_empty_filename.tar.uu +++ b/libarchive/test/test_read_format_tar_empty_filename.tar.uu @@ -1,5 +1,4 @@ -$FreeBSD: src/lib/libarchive/test/test_read_format_tar_empty_filename.tar.uu,v 1.2 2008/07/03 03:26:30 peter Exp $ -begin 644 test_compat_tar_1.tar +begin 644 test_read_format_tar_empty_filename.tar M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M`````````````#`P,#<W-2``,#`Q-S4P(``P,#`P,#`@`#`P,#`P,#`P,#`P diff --git a/libarchive/test/test_read_format_tar_empty_pax.c b/libarchive/test/test_read_format_tar_empty_pax.c index 5416021947e0..3de9c6719c63 100644 --- a/libarchive/test/test_read_format_tar_empty_pax.c +++ b/libarchive/test/test_read_format_tar_empty_pax.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * A "usual" empty tar archive contains only zero bytes diff --git a/libarchive/test/test_read_format_tar_empty_pax.tar.Z.uu b/libarchive/test/test_read_format_tar_empty_pax.tar.Z.uu index 2557b3f9f02a..0b2d53b69f77 100644 --- a/libarchive/test/test_read_format_tar_empty_pax.tar.Z.uu +++ b/libarchive/test/test_read_format_tar_empty_pax.tar.Z.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_tar_empty.tar.Z +begin 644 test_read_format_tar_empty_pax.tar.Z M'YV0<,+@^7*&S1LQ8=A\05,F#)DR<@!(G$BQHL6+&#-JW,BQ(HR/,&R(!`"R M),F2'T^B_&B#!H`8,F+,B$%C1@V9,D[2K`&C!H`S'8,*'4JTZ,4Z<^B$B?A1 MSILW=(QF=`I5*L:5,%2:M,JUJ]>O8,'6D`%BS)LV;<JXH=.#3)BW-W#D,!-F diff --git a/libarchive/test/test_read_format_tar_empty_with_gnulabel.c b/libarchive/test/test_read_format_tar_empty_with_gnulabel.c index 83f20bb97115..3ff5b318d51a 100644 --- a/libarchive/test/test_read_format_tar_empty_with_gnulabel.c +++ b/libarchive/test/test_read_format_tar_empty_with_gnulabel.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Tar archives with with just a GNU label (or ending with one) should diff --git a/libarchive/test/test_read_format_tar_filename.c b/libarchive/test/test_read_format_tar_filename.c index 9ee8e813f737..5da94967ddf8 100644 --- a/libarchive/test/test_read_format_tar_filename.c +++ b/libarchive/test/test_read_format_tar_filename.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); #include <locale.h> diff --git a/libarchive/test/test_read_format_tar_invalid_pax_size.c b/libarchive/test/test_read_format_tar_invalid_pax_size.c new file mode 100644 index 000000000000..64b5a7cc4b8d --- /dev/null +++ b/libarchive/test/test_read_format_tar_invalid_pax_size.c @@ -0,0 +1,52 @@ +/*- + * Copyright (c) 2020 Ben Wagner + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* + * The pax size attribute can be used to override the size. + * It should be validated the same way the normal size is validated. + * The test data is fuzzer output from + * https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=48467 . + */ +DEFINE_TEST(test_read_format_tar_invalid_pax_size) +{ + /* + * An archive that contains a PAX 'size' record with a large negative value. + */ + struct archive_entry *ae; + struct archive *a; + const char *refname = "test_read_format_tar_invalid_pax_size.tar"; + + extract_reference_file(refname); + assert((a = archive_read_new()) != NULL); + assertEqualInt(ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualInt(ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 10240)); + /* This assert will pass a normal debug build without the pax size check. */ + /* Run this test with `-fsanitize=undefined` to verify. */ + assertEqualIntA(a, ARCHIVE_FATAL, archive_read_next_header(a, &ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} diff --git a/libarchive/test/test_read_format_tar_invalid_pax_size.tar.uu b/libarchive/test/test_read_format_tar_invalid_pax_size.tar.uu new file mode 100644 index 000000000000..3fa9a2e0ef62 --- /dev/null +++ b/libarchive/test/test_read_format_tar_invalid_pax_size.tar.uu @@ -0,0 +1,38 @@ +begin 644 test_read_format_tar_invalid_pax_size.tar +M+B]087A(96%D97)S+C$T-#8S+V%A80`````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````#`P,#`V-#0`,#`P,#`P,``P,#`P,#`P`#`P,#`P,#`P,S$R +M`#$R-3,Q,30U,S<Q`"`Q,30R,"`@>``````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````!U='-A<@`P,``````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````S,"`@("`@(#T@("`@("`@("`@("`@("`@("`@ +M(`HS,"`@("`@(#T@("`@("`@("`@("`@("`@("`@(`HS,"`@("`@("`]("`@ +M("`@("`@("`@("`@("`@(`HS,"!S:7IE/2TQ.3<V.30Q,3$Q,S8U.3<R-S0S +M-@H@("`@("`@("`@_R`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@____("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ +M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(&%A80`````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````P +M,#,P.#$V`#`S-S0U,S0`,#`Q,38Q,``P,#`P,#`P,#`P-P`Q,C4S,3$T-3,W +M,``@,3(P-S$@(#$````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````=7-T87(`,#!D=GEU:V]V````````````````````````````````96YG +M`````````````````````````/\!````````````````,#`Q`#`P,#`P,#`P +M,#`P````````````````````````````````````````````````````]P`` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +&```````` +` +end diff --git a/libarchive/test/test_read_format_tbz.c b/libarchive/test/test_read_format_tbz.c index 331955fd9c39..7323e13c98d0 100644 --- a/libarchive/test/test_read_format_tbz.c +++ b/libarchive/test/test_read_format_tbz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_tbz.c 201247 2009-12-30 05:59:21Z kientzle $"); static unsigned char archive[] = { 'B','Z','h','9','1','A','Y','&','S','Y',237,7,140,'W',0,0,27,251,144,208, diff --git a/libarchive/test/test_read_format_tgz.c b/libarchive/test/test_read_format_tgz.c index 9fba89657e92..5bb5e02be4f4 100644 --- a/libarchive/test/test_read_format_tgz.c +++ b/libarchive/test/test_read_format_tgz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_tgz.c 191183 2009-04-17 01:06:31Z kientzle $"); static unsigned char archive[] = { 31,139,8,0,222,'C','p','C',0,3,211,'c',160,'=','0','0','0','0','7','5','U', diff --git a/libarchive/test/test_read_format_tlz.c b/libarchive/test/test_read_format_tlz.c index 7c7a1431903c..5633baa4c6e8 100644 --- a/libarchive/test/test_read_format_tlz.c +++ b/libarchive/test/test_read_format_tlz.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_tlz.c 201247 2009-12-30 05:59:21Z kientzle $"); static unsigned char archive[] = { 93, 0, 0,128, 0,255,255,255,255,255,255,255,255, 0, 23, 0, diff --git a/libarchive/test/test_read_format_txz.c b/libarchive/test/test_read_format_txz.c index c082d7e5e7be..e17b054a6213 100644 --- a/libarchive/test/test_read_format_txz.c +++ b/libarchive/test/test_read_format_txz.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_txz.c 191183 2009-04-17 01:06:31Z kientzle $"); static unsigned char archive[] = { 253, 55,122, 88, 90, 0, 0, 4,230,214,180, 70, 2, 0, 33, 1, diff --git a/libarchive/test/test_read_format_tz.c b/libarchive/test/test_read_format_tz.c index 4ba7bcb3f9c6..4dfc916a3608 100644 --- a/libarchive/test/test_read_format_tz.c +++ b/libarchive/test/test_read_format_tz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_tz.c 189381 2009-03-05 00:31:48Z kientzle $"); static unsigned char archive[] = { 31,157,144,'.',0,8,28,'H',176,160,193,131,8,19,'*','\\',200,176,'!','B',24, diff --git a/libarchive/test/test_read_format_ustar_filename.c b/libarchive/test/test_read_format_ustar_filename.c index 5c2717cdf2c0..0c7e8a3c8070 100644 --- a/libarchive/test/test_read_format_ustar_filename.c +++ b/libarchive/test/test_read_format_ustar_filename.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); #include <locale.h> diff --git a/libarchive/test/test_read_format_warc.c b/libarchive/test/test_read_format_warc.c index 658ab8a6e72b..91e6dc67e133 100644 --- a/libarchive/test/test_read_format_warc.c +++ b/libarchive/test/test_read_format_warc.c @@ -25,8 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); - DEFINE_TEST(test_read_format_warc) { diff --git a/libarchive/test/test_read_format_xar.c b/libarchive/test/test_read_format_xar.c index 1c8524520b39..daff2921690a 100644 --- a/libarchive/test/test_read_format_xar.c +++ b/libarchive/test/test_read_format_xar.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #define UID 1001 #define UNAME "cue" diff --git a/libarchive/test/test_read_format_zip.c b/libarchive/test/test_read_format_zip.c index 642a5e222ebe..9e820f509c19 100644 --- a/libarchive/test/test_read_format_zip.c +++ b/libarchive/test/test_read_format_zip.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_zip.c 189482 2009-03-07 03:30:35Z kientzle $"); #define __LIBARCHIVE_BUILD #include <archive_crc32.h> @@ -157,7 +156,7 @@ verify_basic(struct archive *a, int seek_checks) if (archive_zlib_version() != NULL) { failure("file2 has a bad CRC, so read should fail and not change buff"); memset(buff, 'a', 19); - assertEqualInt(ARCHIVE_WARN, archive_read_data(a, buff, 19)); + assertEqualInt(ARCHIVE_FAILED, archive_read_data(a, buff, 19)); assertEqualMem(buff, "aaaaaaaaaaaaaaaaaaa", 19); } else { assertEqualInt(ARCHIVE_FAILED, archive_read_data(a, buff, 19)); @@ -746,6 +745,7 @@ DEFINE_TEST(test_read_format_zip_zstd_one_file) if (ARCHIVE_OK != archive_read_support_filter_zstd(a)) { skipping("zstd is not fully supported on this platform"); archive_read_close(a); + archive_read_free(a); return; } extract_reference_file(refname); @@ -771,6 +771,7 @@ DEFINE_TEST(test_read_format_zip_zstd_one_file_blockread) if (ARCHIVE_OK != archive_read_support_filter_zstd(a)) { skipping("zstd is not fully supported on this platform"); archive_read_close(a); + archive_read_free(a); return; } extract_reference_file(refname); @@ -796,6 +797,7 @@ DEFINE_TEST(test_read_format_zip_zstd_multi) if (ARCHIVE_OK != archive_read_support_filter_zstd(a)) { skipping("zstd is not fully supported on this platform"); archive_read_close(a); + archive_read_free(a); return; } extract_reference_file(refname); @@ -833,6 +835,7 @@ DEFINE_TEST(test_read_format_zip_zstd_multi_blockread) if (ARCHIVE_OK != archive_read_support_filter_zstd(a)) { skipping("zstd is not fully supported on this platform"); archive_read_close(a); + archive_read_free(a); return; } extract_reference_file(refname); @@ -1017,6 +1020,7 @@ DEFINE_TEST(test_read_format_zip_lzma_alone_leak) if(ARCHIVE_OK != archive_read_support_filter_lzma(a)) { skipping("lzma reading is not fully supported on this platform"); archive_read_close(a); + archive_read_free(a); return; } diff --git a/libarchive/test/test_read_format_zip_7075_utf8_paths.c b/libarchive/test/test_read_format_zip_7075_utf8_paths.c index a0a510c8f29b..fefcc82881f8 100644 --- a/libarchive/test/test_read_format_zip_7075_utf8_paths.c +++ b/libarchive/test/test_read_format_zip_7075_utf8_paths.c @@ -25,7 +25,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #include <locale.h> diff --git a/libarchive/test/test_read_format_zip_bzip2.zipx.uu b/libarchive/test/test_read_format_zip_bzip2.zipx.uu index 6d9884aeddf5..4c9aeb77a941 100644 --- a/libarchive/test/test_read_format_zip_bzip2.zipx.uu +++ b/libarchive/test/test_read_format_zip_bzip2.zipx.uu @@ -1,4 +1,4 @@ -begin 644 bzip2.zipx +begin 644 test_read_format_zip_bzip2.zipx M4$L#!"X#```,`#TQD4VJ.XZZ-`(``)`#```%````=FEM<F-"6F@Y,4%9)E-9 MYPC!D@``3%^``!!TY^!2(B.7`+__W^%``C$[0!AJ>E,ID:&U-'E`T&C1IIIZ M@8&J>$9":`IZ@``'J:/2&#```````!@`2FB$T:31D9"F@8FC0`\H^:+Y;81F diff --git a/libarchive/test/test_read_format_zip_comment_stored.c b/libarchive/test/test_read_format_zip_comment_stored.c index 95df0107fecb..39f83a821006 100644 --- a/libarchive/test/test_read_format_zip_comment_stored.c +++ b/libarchive/test/test_read_format_zip_comment_stored.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Read a zip file that has a zip comment in the end of the central diff --git a/libarchive/test/test_read_format_zip_encryption_data.c b/libarchive/test/test_read_format_zip_encryption_data.c index b56d78e9074f..4a6502b9bf2d 100644 --- a/libarchive/test/test_read_format_zip_encryption_data.c +++ b/libarchive/test/test_read_format_zip_encryption_data.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_zip_encryption_data) { diff --git a/libarchive/test/test_read_format_zip_encryption_header.c b/libarchive/test/test_read_format_zip_encryption_header.c index f40e1f5cb8da..fb19c1421946 100644 --- a/libarchive/test/test_read_format_zip_encryption_header.c +++ b/libarchive/test/test_read_format_zip_encryption_header.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_zip_encryption_header) { diff --git a/libarchive/test/test_read_format_zip_encryption_partially.c b/libarchive/test/test_read_format_zip_encryption_partially.c index 77af235d58b7..cd5d2103ea6a 100644 --- a/libarchive/test/test_read_format_zip_encryption_partially.c +++ b/libarchive/test/test_read_format_zip_encryption_partially.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_zip_encryption_partially) { diff --git a/libarchive/test/test_read_format_zip_filename.c b/libarchive/test/test_read_format_zip_filename.c index 4dd2e8ad6e8f..b673344738be 100644 --- a/libarchive/test/test_read_format_zip_filename.c +++ b/libarchive/test/test_read_format_zip_filename.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); #include <locale.h> @@ -1179,6 +1178,11 @@ next_test: assertEqualInt(ARCHIVE_OK, archive_read_free(a)); /* + * By default, Windows will create an sconv_default object, which will + * interpret filenames as OEMCP + */ +#if !defined(_WIN32) || defined(__CYGWIN__) + /* * Read filename in en_US.UTF-8 without "hdrcharset=KOI8-R" option. * The filename we can properly read is only second file. */ @@ -1221,4 +1225,5 @@ next_test: /* Close the archive. */ assertEqualInt(ARCHIVE_OK, archive_read_close(a)); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +#endif } diff --git a/libarchive/test/test_read_format_zip_filename_cp866.zip.uu b/libarchive/test/test_read_format_zip_filename_cp866.zip.uu index 52c6770609e1..7ef721490c4a 100644 --- a/libarchive/test/test_read_format_zip_filename_cp866.zip.uu +++ b/libarchive/test/test_read_format_zip_filename_cp866.zip.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_zip_cp866.zip +begin 644 test_read_format_zip_filename_cp866.zip M4$L#!`H``````%VEAS[,X8$4!@````8````&`!P`CY"(@H62550)``-!HYU- M0:.=375X"P`!!.D#```$Z0,``/#RZ??E]%!+`P0*``````!=I8<^S.&!%`8` M```&````!@`<`*_@J**EXE54"0`#0:.=34&CG4UU>`L``03I`P``!.D#``#P diff --git a/libarchive/test/test_read_format_zip_filename_cp932.zip.uu b/libarchive/test/test_read_format_zip_filename_cp932.zip.uu index 90c22f2d5c45..ec0f9c091b06 100644 --- a/libarchive/test/test_read_format_zip_filename_cp932.zip.uu +++ b/libarchive/test/test_read_format_zip_filename_cp932.zip.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_zip_cp932.zip +begin 644 test_read_format_zip_filename_cp932.zip M4$L#!`H``````/94=#Z"B='W!0````4````1````E5R"OH+F+XCJEY>57"YT M>'1(96QL;U!+`P0*``````"W5'0^W)UO0@4````%````#P```)5<@KZ"YB^* MOXZ:+G1X=&MA;FII4$L!`A0+"@``````]E1T/H*)T?<%````!0```!$````` diff --git a/libarchive/test/test_read_format_zip_filename_koi8r.zip.uu b/libarchive/test/test_read_format_zip_filename_koi8r.zip.uu index 05c669560270..242c902f0b64 100644 --- a/libarchive/test/test_read_format_zip_filename_koi8r.zip.uu +++ b/libarchive/test/test_read_format_zip_filename_koi8r.zip.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_zip_koi8r.zip +begin 644 test_read_format_zip_filename_koi8r.zip M4$L#!`H``````+&CAS[,X8$4!@````8````&`!P`T-+)U\74550)``,>H)U- M'J"=375X"P`!!.D#```$Z0,``/#RZ??E]%!+`P0*``````"QHX<^S.&!%`8` M```&````!@`<`/#RZ??E]%54"0`#'J"=31Z@G4UU>`L``03I`P``!.D#``#P diff --git a/libarchive/test/test_read_format_zip_filename_utf8_jp.zip.uu b/libarchive/test/test_read_format_zip_filename_utf8_jp.zip.uu index 00c2af33723a..3c9f4b9ea934 100644 --- a/libarchive/test/test_read_format_zip_filename_utf8_jp.zip.uu +++ b/libarchive/test/test_read_format_zip_filename_utf8_jp.zip.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_zip_utf8.zip +begin 644 test_read_format_zip_filename_utf8_jp.zip M4$L#!`H```@``,E4=#X````````````````*`!P`Z*&HXX&@XX*(+U54"0`# MBEJ%3;[UBDUU>`L``03M`P``!`$"``!02P,$"@``"```]51T/H*)T?<%```` M!0```!<`'`#HH:CC@:#C@H@OY+B`Z*:GZ*&H+G1X=%54"0`#WEJ%31KLBDUU diff --git a/libarchive/test/test_read_format_zip_filename_utf8_ru.zip.uu b/libarchive/test/test_read_format_zip_filename_utf8_ru.zip.uu index 9241776d7fdf..bd71cc2a497b 100644 --- a/libarchive/test/test_read_format_zip_filename_utf8_ru.zip.uu +++ b/libarchive/test/test_read_format_zip_filename_utf8_ru.zip.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_zip_utf8_ru.zip +begin 644 test_read_format_zip_filename_utf8_ru.zip M4$L#!`H```@``,NC/S[,X8$4!@````8````,`!P`T)_0H-"8T)+0E="B550) M``-.G49-'J"=375X"P`!!.D#```$Z0,``/#RZ??E]%!+`P0*```(``!KI3\^ MS.&!%`8````&````#``<`-"_T8#0N-"RT+71@E54"0`#6J!&31Z@G4UU>`L` diff --git a/libarchive/test/test_read_format_zip_filename_utf8_ru2.zip.uu b/libarchive/test/test_read_format_zip_filename_utf8_ru2.zip.uu index 651f8b1f8b10..65a34ed59147 100644 --- a/libarchive/test/test_read_format_zip_filename_utf8_ru2.zip.uu +++ b/libarchive/test/test_read_format_zip_filename_utf8_ru2.zip.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_zip_utf8_ru2.zip +begin 644 test_read_format_zip_filename_utf8_ru2.zip M4$L#!`H``````.:PCC[,X8$4!@````8````&`!P`\/+I]^7T550)``.`\:9- MI6>G375X"P`!!.D#```$Z0,``/#RZ??E]%!+`P0*```(``!KI3\^S.&!%`8` M```&````#``<`-"_T8#0N-"RT+71@E54"0`#6J!&357SIDUU>`L``03I`P`` diff --git a/libarchive/test/test_read_format_zip_high_compression.c b/libarchive/test/test_read_format_zip_high_compression.c index 16cfbb182893..d28897027747 100644 --- a/libarchive/test/test_read_format_zip_high_compression.c +++ b/libarchive/test/test_read_format_zip_high_compression.c @@ -23,11 +23,9 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); #include <locale.h> - /* * Github Issue 748 reported problems with end-of-entry handling * with highly-compressible data. This resulted in the end of the diff --git a/libarchive/test/test_read_format_zip_jar.c b/libarchive/test/test_read_format_zip_jar.c index 912e67137704..75ea3eb9b868 100644 --- a/libarchive/test/test_read_format_zip_jar.c +++ b/libarchive/test/test_read_format_zip_jar.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Issue 822: jar files have an empty External File Attributes field which diff --git a/libarchive/test/test_read_format_zip_lzma.zipx.uu b/libarchive/test/test_read_format_zip_lzma.zipx.uu index 24fdc8e7c288..d0aad44a17d1 100644 --- a/libarchive/test/test_read_format_zip_lzma.zipx.uu +++ b/libarchive/test/test_read_format_zip_lzma.zipx.uu @@ -1,4 +1,4 @@ -begin 644 lzma.zipx +begin 644 test_read_format_zip_lzma.zipx M4$L#!#\#```.`#TQD4VJ.XZZ.0(``)`#```%````=FEM<F,0`@4`70`0```` 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 diff --git a/libarchive/test/test_read_format_zip_mac_metadata.c b/libarchive/test/test_read_format_zip_mac_metadata.c index 3f2813cc9894..9f7c35e1df85 100644 --- a/libarchive/test/test_read_format_zip_mac_metadata.c +++ b/libarchive/test/test_read_format_zip_mac_metadata.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Read a zip file that has a zip comment in the end of the central diff --git a/libarchive/test/test_read_format_zip_malformed.c b/libarchive/test/test_read_format_zip_malformed.c index f1160648e759..7e46abd8a4c1 100644 --- a/libarchive/test/test_read_format_zip_malformed.c +++ b/libarchive/test/test_read_format_zip_malformed.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static void test_malformed1(void) diff --git a/libarchive/test/test_read_format_zip_nested.c b/libarchive/test/test_read_format_zip_nested.c index 4418fc4f2502..95945638b074 100644 --- a/libarchive/test/test_read_format_zip_nested.c +++ b/libarchive/test/test_read_format_zip_nested.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_zip_nested) { @@ -50,7 +49,7 @@ DEFINE_TEST(test_read_format_zip_nested) /* Save contents of inner Zip. */ innerLength = (size_t)archive_entry_size(ae); - inner = calloc(innerLength, 1); + inner = calloc(innerLength, sizeof(char)); assertEqualInt(innerLength, archive_read_data(a, inner, innerLength)); assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); diff --git a/libarchive/test/test_read_format_zip_nofiletype.c b/libarchive/test/test_read_format_zip_nofiletype.c index b3260fa7563b..d2798b283185 100644 --- a/libarchive/test/test_read_format_zip_nofiletype.c +++ b/libarchive/test/test_read_format_zip_nofiletype.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Issue 332: Some epub files (which are really Zip archives) have diff --git a/libarchive/test/test_read_format_zip_padded.c b/libarchive/test/test_read_format_zip_padded.c index d8c694bae5e2..dcbf3406e867 100644 --- a/libarchive/test/test_read_format_zip_padded.c +++ b/libarchive/test/test_read_format_zip_padded.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static void verify_padded_archive(const char *refname) diff --git a/libarchive/test/test_read_format_zip_ppmd8.zipx.uu b/libarchive/test/test_read_format_zip_ppmd8.zipx.uu index 4440e95b3158..cdbf0f44899d 100644 --- a/libarchive/test/test_read_format_zip_ppmd8.zipx.uu +++ b/libarchive/test/test_read_format_zip_ppmd8.zipx.uu @@ -1,4 +1,4 @@ -begin 644 ppmd8.zipx +begin 644 test_read_format_zip_ppmd8.zipx M4$L#!#\#``!B`#TQD4VJ.XZZV`$``)`#```%````=FEM<F,'`"']JO"&\1[R M;;G)@`(8>EJ>3<8@F_*<(\B>K]4_(WC8#)`_QSG+`7`B&_11VIJ)@#(<W.9L M>K)_I8R^=`VUO2_S,1C=1CAU>-*`]CC+&6Q;EE'#CG-W=^[,F,+UR-TE(9,G diff --git a/libarchive/test/test_read_format_zip_sfx.c b/libarchive/test/test_read_format_zip_sfx.c index a33c1b808c56..dad0a270d7bc 100644 --- a/libarchive/test/test_read_format_zip_sfx.c +++ b/libarchive/test/test_read_format_zip_sfx.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Read a zip file that is a SFX. diff --git a/libarchive/test/test_read_format_zip_traditional_encryption_data.c b/libarchive/test/test_read_format_zip_traditional_encryption_data.c index 20e55bbc6948..8f0cfe6dc896 100644 --- a/libarchive/test/test_read_format_zip_traditional_encryption_data.c +++ b/libarchive/test/test_read_format_zip_traditional_encryption_data.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_zip_traditional_encryption_data) { diff --git a/libarchive/test/test_read_format_zip_winzip_aes.c b/libarchive/test/test_read_format_zip_winzip_aes.c index 3f543927a41e..7c5d5ea61f77 100644 --- a/libarchive/test/test_read_format_zip_winzip_aes.c +++ b/libarchive/test/test_read_format_zip_winzip_aes.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static void test_winzip_aes(const char *refname, int need_libz) diff --git a/libarchive/test/test_read_format_zip_winzip_aes128.zip.uu b/libarchive/test/test_read_format_zip_winzip_aes128.zip.uu index d0f03a3112e1..d3a69d8d41d4 100644 --- a/libarchive/test/test_read_format_zip_winzip_aes128.zip.uu +++ b/libarchive/test/test_read_format_zip_winzip_aes128.zip.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_zip_winzip_aes128_encryption_data.zip +begin 644 test_read_format_zip_winzip_aes128.zip M4$L#!#,#`0!C`(RP#D4`````@0H``*(:```&``L`4D5!1$U%`9D'``(`044! M"``>H87EHY!N6J#=V\<,#M>^H2IQID3@A--GSL+F%'R^%OKB.K(74CJ!,(%" ML\O.^D'TO'!T<+"]"28FXP@QKAY]R+02!E!XE_6A-W&<$&SJ5W]K'SJ4>'C< diff --git a/libarchive/test/test_read_format_zip_winzip_aes256.zip.uu b/libarchive/test/test_read_format_zip_winzip_aes256.zip.uu index a45c8fbe664f..ae51e66538d1 100644 --- a/libarchive/test/test_read_format_zip_winzip_aes256.zip.uu +++ b/libarchive/test/test_read_format_zip_winzip_aes256.zip.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_zip_winzip_aes256_encryption_data.zip +begin 644 test_read_format_zip_winzip_aes256.zip M4$L#!#,#`0!C`(RP#D4`````B0H``*(:```&``L`4D5!1$U%`9D'``(`044# M"`#8+Z><':+DENQS9*!7Y*&!7BQK,UN]RF*'<':@;]N)O5>]A5>0<AYWX=%S MGUTK5M-^&`+%Q<#PC+45O;+Q/4[_J7)A7*2<^!W;)^E_W%,]]7-&6R8]ZL.F diff --git a/libarchive/test/test_read_format_zip_winzip_aes256_stored.zip.uu b/libarchive/test/test_read_format_zip_winzip_aes256_stored.zip.uu index c49673aab2e7..e8300fa903a8 100644 --- a/libarchive/test/test_read_format_zip_winzip_aes256_stored.zip.uu +++ b/libarchive/test/test_read_format_zip_winzip_aes256_stored.zip.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_zip_winzip_aes256_encryption_stored_data.zip +begin 644 test_read_format_zip_winzip_aes256_stored.zip M4$L#!#,#`0!C`(RP#D4`````OAH``*(:```&``L`4D5!1$U%`9D'``(`044# M``#5>!R(9&J6OW+%/X2D%.HLH/4@[H=,;4@&P$:E>NK#GQM>2SUV&GDS9/G@ M#J5^X(O<TC2DQW<QV`U6]!AA].1DL/:C!^1V=PJ`#_Z7`]_@C+O\SN38$]ZL diff --git a/libarchive/test/test_read_format_zip_winzip_aes_large.c b/libarchive/test/test_read_format_zip_winzip_aes_large.c index f05e2183a21b..4b6202bde164 100644 --- a/libarchive/test/test_read_format_zip_winzip_aes_large.c +++ b/libarchive/test/test_read_format_zip_winzip_aes_large.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_zip_winzip_aes256_large) { diff --git a/libarchive/test/test_read_format_zip_with_invalid_traditional_eocd.c b/libarchive/test/test_read_format_zip_with_invalid_traditional_eocd.c index aca8bed60948..e9549fef8e7d 100644 --- a/libarchive/test/test_read_format_zip_with_invalid_traditional_eocd.c +++ b/libarchive/test/test_read_format_zip_with_invalid_traditional_eocd.c @@ -23,8 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); - /* * Issue 869: zip files without a valid EOCD header aren't loaded even if they * have a valid ZIP64 version of said header. diff --git a/libarchive/test/test_read_format_zip_with_invalid_traditional_eocd.zip.uu b/libarchive/test/test_read_format_zip_with_invalid_traditional_eocd.zip.uu index 63744f145ea2..7301c155e404 100644 --- a/libarchive/test/test_read_format_zip_with_invalid_traditional_eocd.zip.uu +++ b/libarchive/test/test_read_format_zip_with_invalid_traditional_eocd.zip.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_zip_without_eocd.zip +begin 644 test_read_format_zip_with_invalid_traditional_eocd.zip M4$L#!"T`"````-IT@DH`````__________\)`"``=&5S=#$N='AT`0`<```` M```````````````````````````````````````````````````````````` M`%!+`P0M``@```#:=()*`````/__________"0`@`'1E<W0R+G1X=`$`'``` diff --git a/libarchive/test/test_read_format_zip_zip64.c b/libarchive/test/test_read_format_zip_zip64.c index bd2324e549b3..51968b71addb 100644 --- a/libarchive/test/test_read_format_zip_zip64.c +++ b/libarchive/test/test_read_format_zip_zip64.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Sample file was created with: diff --git a/libarchive/test/test_read_large.c b/libarchive/test/test_read_large.c index 8dbf48d848c0..46dee4e33d6c 100644 --- a/libarchive/test/test_read_large.c +++ b/libarchive/test/test_read_large.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_large.c 201247 2009-12-30 05:59:21Z kientzle $"); static unsigned char testdata[10 * 1024 * 1024]; static unsigned char testdatacopy[10 * 1024 * 1024]; diff --git a/libarchive/test/test_read_large_splitted_rar_aa.uu b/libarchive/test/test_read_large_splitted_rar_aa.uu index a6c3b3cffebf..299b00b6814a 100644 --- a/libarchive/test/test_read_large_splitted_rar_aa.uu +++ b/libarchive/test/test_read_large_splitted_rar_aa.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_large_splitted_rar_aa M4F%R(1H'`,^0<P``#0````````!R,W3`D$<`VK$"`&I!9PX#=T0K]VL`!S\= M-1T`I($``'!P;61?;'IS<U]C;VYV97)S:6]N7W1E<W0N='ATP,B$``<_&[\& M/Z<8.^3!KS1=].J=K$!ZW>[/K1`L^BJ7QHH!,TI;W];?!</^PRNT+.T262?/ diff --git a/libarchive/test/test_read_large_splitted_rar_ab.uu b/libarchive/test/test_read_large_splitted_rar_ab.uu index 43869789a075..39ce2315c44f 100644 --- a/libarchive/test/test_read_large_splitted_rar_ab.uu +++ b/libarchive/test/test_read_large_splitted_rar_ab.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_large_splitted_rar_ab M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` diff --git a/libarchive/test/test_read_large_splitted_rar_ac.uu b/libarchive/test/test_read_large_splitted_rar_ac.uu index 0ceeae1b7fc4..7941aaaca7ad 100644 --- a/libarchive/test/test_read_large_splitted_rar_ac.uu +++ b/libarchive/test/test_read_large_splitted_rar_ac.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_large_splitted_rar_ac M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ diff --git a/libarchive/test/test_read_large_splitted_rar_ad.uu b/libarchive/test/test_read_large_splitted_rar_ad.uu index f736f13c7cb1..9b633d19a931 100644 --- a/libarchive/test/test_read_large_splitted_rar_ad.uu +++ b/libarchive/test/test_read_large_splitted_rar_ad.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_large_splitted_rar_ad M>WI\4,Y&PE_B_KBY3_KR8A*=V5Y9^":+9OY.2W-%I:#J"YC[#9]&6)@HH1ZH MV*<8TFQK2]$<A645.":BA=R^<=NOJ(%,H)2+!9H%.!"J[E>+2^(@3/9+1"6W M2O)L"JZC)MCDJG+%_;+=UEV.2(I,V[T@E<XQKA"\G.*'GD,QF_.C^"NU*.#4 diff --git a/libarchive/test/test_read_large_splitted_rar_ae.uu b/libarchive/test/test_read_large_splitted_rar_ae.uu index 9f463a4ae384..fada05733f7c 100644 --- a/libarchive/test/test_read_large_splitted_rar_ae.uu +++ b/libarchive/test/test_read_large_splitted_rar_ae.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_large_splitted_rar_ae M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ diff --git a/libarchive/test/test_read_pax_truncated.c b/libarchive/test/test_read_pax_truncated.c index 6a0bb9bafe71..a92ac3855c8d 100644 --- a/libarchive/test/test_read_pax_truncated.c +++ b/libarchive/test/test_read_pax_truncated.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_pax_truncated.c 189483 2009-03-07 03:34:34Z kientzle $"); DEFINE_TEST(test_read_pax_truncated) { diff --git a/libarchive/test/test_read_pax_xattr_schily.tar.uu b/libarchive/test/test_read_pax_xattr_schily.tar.uu index 33a3ed4ea036..83a3cdbc52b9 100644 --- a/libarchive/test/test_read_pax_xattr_schily.tar.uu +++ b/libarchive/test/test_read_pax_xattr_schily.tar.uu @@ -1,4 +1,4 @@ -begin 644 test_read_pax_xattr_schily.tar.uu +begin 644 test_read_pax_xattr_schily.tar M+B]087A(96%D97)S+C$U,C4O8V]N9F9I;&5S```````````````````````` M```````````````````````````````````````````````````````````` M`````````````#`P,#`V-#0`,#`P,#`P,``P,#`P,#`P`#`P,#`P,#`P-C0W diff --git a/libarchive/test/test_read_position.c b/libarchive/test/test_read_position.c index f245563f4c2a..e404c066e516 100644 --- a/libarchive/test/test_read_position.c +++ b/libarchive/test/test_read_position.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_position.c 189389 2009-03-05 02:19:42Z kientzle $"); static unsigned char nulls[1000]; static unsigned char tmp[1000]; diff --git a/libarchive/test/test_read_splitted_rar_aa.uu b/libarchive/test/test_read_splitted_rar_aa.uu index 9a510cb4c94a..a15d31454d26 100644 --- a/libarchive/test/test_read_splitted_rar_aa.uu +++ b/libarchive/test/test_read_splitted_rar_aa.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_splitted_rar_aa M4F%R(1H'`,^0<P``#0````````"$4G0@D#(`%````!0````#0J+(OK=VVCX4 M,`@`I($``'1E<W0N='AT@`BW=MH^MW;:/G1E<W0@=&5X="!D;V-U;65N=`T* *G2]T()`R``@````` diff --git a/libarchive/test/test_read_splitted_rar_ab.uu b/libarchive/test/test_read_splitted_rar_ab.uu index f34f25cc0b1f..0855fc3e7a9e 100644 --- a/libarchive/test/test_read_splitted_rar_ab.uu +++ b/libarchive/test/test_read_splitted_rar_ab.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_splitted_rar_ab M``@````#>T3)MM%,V#X4,`@`_Z$``'1E<W1L:6YKP`C13-@^4%_:/G1E<W0N M='ATS>!T()`Z`!0````4`````T*BR+YC=]H^%#`0`*2!``!T97-T9&ER7'1E *<W0N='ATP,QC=P`` diff --git a/libarchive/test/test_read_splitted_rar_ac.uu b/libarchive/test/test_read_splitted_rar_ac.uu index e131343bb9fe..5ec194b0a62d 100644 --- a/libarchive/test/test_read_splitted_rar_ac.uu +++ b/libarchive/test/test_read_splitted_rar_ac.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_splitted_rar_ac MVCYC=]H^=&5S="!T97AT(&1O8W5M96YT#0JAR'3@D#$````````````#```` M`&-WVCX4,`<`[4$``'1E<W1D:7+`S&-WVCYD=]H^YN=TX)`V```````````` *`P````"=J]4^%``` diff --git a/libarchive/test/test_read_splitted_rar_ad.uu b/libarchive/test/test_read_splitted_rar_ad.uu index f4d36093e04c..7d29b7d63bc9 100644 --- a/libarchive/test/test_read_splitted_rar_ad.uu +++ b/libarchive/test/test_read_splitted_rar_ad.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_splitted_rar_ad D,`P`[4$``'1E<W1E;7!T>61I<H#,G:O5/L5=VC[$/7L`0`<` ` end diff --git a/libarchive/test/test_read_truncated.c b/libarchive/test/test_read_truncated.c index 1e760d7f64da..c28a9ee30e00 100644 --- a/libarchive/test/test_read_truncated.c +++ b/libarchive/test/test_read_truncated.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_truncated.c,v 1.4 2008/09/01 05:38:33 kientzle Exp $"); static char buff[1000000]; static char buff2[100000]; diff --git a/libarchive/test/test_read_truncated_filter.c b/libarchive/test/test_read_truncated_filter.c index 532e3eeec6f7..9c5348d935d2 100644 --- a/libarchive/test/test_read_truncated_filter.c +++ b/libarchive/test/test_read_truncated_filter.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Check that we generate an error message when reading a truncated @@ -81,7 +80,7 @@ test_truncation(const char *compression, archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < 100; i++) { - sprintf(path, "%s%d", compression, i); + snprintf(path, sizeof(path), "%s%d", compression, i); archive_entry_copy_pathname(ae, path); failure("%s", path); if (!assertEqualIntA(a, ARCHIVE_OK, @@ -123,7 +122,7 @@ test_truncation(const char *compression, assert(NULL != archive_error_string(a)); break; } - sprintf(path, "%s%d", compression, i); + snprintf(path, sizeof(path), "%s%d", compression, i); assertEqualString(path, archive_entry_pathname(ae)); if (datasize != (size_t)archive_read_data(a, data, datasize)) { failure("Should have non-NULL error message for %s", diff --git a/libarchive/test/test_short_writes.c b/libarchive/test/test_short_writes.c index afa0206f07cd..8221cece1721 100644 --- a/libarchive/test/test_short_writes.c +++ b/libarchive/test/test_short_writes.c @@ -171,6 +171,8 @@ checker_free(struct checker *checker) { free(checker->shortbuf); free(checker->fullbuf); + archive_read_free(checker->short_archive); + archive_read_free(checker->full_archive); free(checker); } diff --git a/libarchive/test/test_sparse_basic.c b/libarchive/test/test_sparse_basic.c index 133a85398547..0350df1e9f27 100644 --- a/libarchive/test/test_sparse_basic.c +++ b/libarchive/test/test_sparse_basic.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_IOCTL_H #include <sys/ioctl.h> @@ -121,7 +120,7 @@ create_sparse_file(const char *path, const struct sparse *s) memset(buff, ' ', sizeof(buff)); handle = CreateFileA(path, GENERIC_WRITE, 0, - NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, + NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); assert(handle != INVALID_HANDLE_VALUE); assert(DeviceIoControl(handle, FSCTL_SET_SPARSE, NULL, 0, @@ -253,8 +252,10 @@ is_sparse_supported(const char *path) #if defined(HAVE_LINUX_FIEMAP_H) if (r < 0) return (is_sparse_supported_fiemap(path)); -#endif + return (1); +#else return (r >= 0); +#endif } #elif !defined(HAVE_LINUX_FIEMAP_H) diff --git a/libarchive/test/test_splitted_rar_seek_support_aa.uu b/libarchive/test/test_splitted_rar_seek_support_aa.uu index 0344d2ce30ef..af2fcae348e8 100644 --- a/libarchive/test/test_splitted_rar_seek_support_aa.uu +++ b/libarchive/test/test_splitted_rar_seek_support_aa.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_splitted_rar_seek_support_aa M4F%R(1H'`,^0<P``#0````````"X!'0@D$,`CTX``(].```#8Z8%7F!.(4`4 M,!D`I($``$QI8F%R8VAI=F5!9&1I;F=497-T+FAT;6S`S&!.(4!B3B%`/"%$ M3T-465!%($A434P@4%5"3$E#("(M+R]7,T,O+T141"!(5$U,(#0N,"!4<F%N diff --git a/libarchive/test/test_splitted_rar_seek_support_ab.uu b/libarchive/test/test_splitted_rar_seek_support_ab.uu index 5f41f5fdac44..5652c6ac5ebf 100644 --- a/libarchive/test/test_splitted_rar_seek_support_ab.uu +++ b/libarchive/test/test_splitted_rar_seek_support_ab.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_splitted_rar_seek_support_ab M;&]G(&UE<W-A9V5S(&]N(&9A:6QU<F4N($EN('!A<G1I8W5L87(L('1H97D@ M<')I;G0*=&AE('9A;'5E(&]F(&)O=&@@87)G=6UE;G1S.R!T:&ES(&=R96%T M;'D@<VEM<&QI9FEE<R!D:6%G;F]S:6YG"F9A:6QU<F5S+B`*/"]0/@H\2#$@ diff --git a/libarchive/test/test_splitted_rar_seek_support_ac.uu b/libarchive/test/test_splitted_rar_seek_support_ac.uu index ee9f78c48967..3b45bdb4f8f3 100644 --- a/libarchive/test/test_splitted_rar_seek_support_ac.uu +++ b/libarchive/test/test_splitted_rar_seek_support_ac.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_splitted_rar_seek_support_ac M<F]M(&-O;F9I9RYH+B`H268@=&AE('1E<W1S('5S92!T:&4@<V%M92`\5%0@ M0TQ!4U,](G=E<W1E<FXB/DA!5D5?/"]45#X*"6UA8W)O<R!A<R!T:&4@8V]D M92!B96EN9R!T97-T960@=&AE;B!C;VYF:6=U<F%T:6]N('!R;V)L96US('=I diff --git a/libarchive/test/test_tar_filenames.c b/libarchive/test/test_tar_filenames.c index 84e955cc4b08..a8c9a3dc790d 100644 --- a/libarchive/test/test_tar_filenames.c +++ b/libarchive/test/test_tar_filenames.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_tar_filenames.c,v 1.10 2008/09/01 05:38:33 kientzle Exp $"); /* * Exercise various lengths of filenames in tar archives, diff --git a/libarchive/test/test_tar_large.c b/libarchive/test/test_tar_large.c index 626f9f0878bc..7ff3fee17717 100644 --- a/libarchive/test/test_tar_large.c +++ b/libarchive/test/test_tar_large.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_tar_large.c 201247 2009-12-30 05:59:21Z kientzle $"); #include <errno.h> #include <stdlib.h> @@ -224,7 +223,7 @@ DEFINE_TEST(test_tar_large) */ for (i = 0; tests[i] != 0; i++) { assert((ae = archive_entry_new()) != NULL); - sprintf(namebuff, "file_%d", i); + snprintf(namebuff, sizeof(namebuff), "file_%d", i); archive_entry_copy_pathname(ae, namebuff); archive_entry_set_mode(ae, S_IFREG | 0755); filesize = tests[i]; @@ -271,7 +270,7 @@ DEFINE_TEST(test_tar_large) */ for (i = 0; tests[i] > 0; i++) { assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); - sprintf(namebuff, "file_%d", i); + snprintf(namebuff, sizeof(namebuff), "file_%d", i); assertEqualString(namebuff, archive_entry_pathname(ae)); assert(tests[i] == archive_entry_size(ae)); } diff --git a/libarchive/test/test_ustar_filename_encoding.c b/libarchive/test/test_ustar_filename_encoding.c index 5e4fba716c13..cc62453f1c1b 100644 --- a/libarchive/test/test_ustar_filename_encoding.c +++ b/libarchive/test/test_ustar_filename_encoding.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #include <locale.h> diff --git a/libarchive/test/test_ustar_filenames.c b/libarchive/test/test_ustar_filenames.c index 1a4b4e1452c2..896b5cc9f1a1 100644 --- a/libarchive/test/test_ustar_filenames.c +++ b/libarchive/test/test_ustar_filenames.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_ustar_filenames.c 189308 2009-03-03 17:02:51Z kientzle $"); /* * Exercise various lengths of filenames in ustar archives. diff --git a/libarchive/test/test_write_disk.c b/libarchive/test/test_write_disk.c index e38dbc78ff4e..fa0743f949f6 100644 --- a/libarchive/test/test_write_disk.c +++ b/libarchive/test/test_write_disk.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_disk.c 201247 2009-12-30 05:59:21Z kientzle $"); #define UMASK 022 /* diff --git a/libarchive/test/test_write_disk_appledouble.c b/libarchive/test/test_write_disk_appledouble.c index d82d698ebda7..3265a94d2fed 100644 --- a/libarchive/test/test_write_disk_appledouble.c +++ b/libarchive/test/test_write_disk_appledouble.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_ACL_H #include <sys/acl.h> diff --git a/libarchive/test/test_write_disk_failures.c b/libarchive/test/test_write_disk_failures.c index c563ce1d3212..ff688b993d5f 100644 --- a/libarchive/test/test_write_disk_failures.c +++ b/libarchive/test/test_write_disk_failures.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_disk_failures.c 201247 2009-12-30 05:59:21Z kientzle $"); DEFINE_TEST(test_write_disk_failures) { diff --git a/libarchive/test/test_write_disk_hardlink.c b/libarchive/test/test_write_disk_hardlink.c index 184f77a00f0d..215633ab40bf 100644 --- a/libarchive/test/test_write_disk_hardlink.c +++ b/libarchive/test/test_write_disk_hardlink.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_disk_hardlink.c 201247 2009-12-30 05:59:21Z kientzle $"); #if defined(_WIN32) && !defined(__CYGWIN__) /* Execution bits, Group members bits and others bits do not work. */ diff --git a/libarchive/test/test_write_disk_hfs_compression.c b/libarchive/test/test_write_disk_hfs_compression.c index 8a2e7df3b9b2..026e41533628 100644 --- a/libarchive/test/test_write_disk_hfs_compression.c +++ b/libarchive/test/test_write_disk_hfs_compression.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_XATTR_H #include <sys/xattr.h> diff --git a/libarchive/test/test_write_disk_lookup.c b/libarchive/test/test_write_disk_lookup.c index cabdae8ddc43..52b9a7457017 100644 --- a/libarchive/test/test_write_disk_lookup.c +++ b/libarchive/test/test_write_disk_lookup.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static void group_cleanup(void *d) diff --git a/libarchive/test/test_write_disk_mac_metadata.c b/libarchive/test/test_write_disk_mac_metadata.c index be13d96afddf..f9cfd9b3fd7c 100644 --- a/libarchive/test/test_write_disk_mac_metadata.c +++ b/libarchive/test/test_write_disk_mac_metadata.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_ACL_H #include <sys/acl.h> diff --git a/libarchive/test/test_write_disk_no_hfs_compression.c b/libarchive/test/test_write_disk_no_hfs_compression.c index 0af44d246a11..58ad187574c1 100644 --- a/libarchive/test/test_write_disk_no_hfs_compression.c +++ b/libarchive/test/test_write_disk_no_hfs_compression.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_XATTR_H #include <sys/xattr.h> diff --git a/libarchive/test/test_write_disk_perms.c b/libarchive/test/test_write_disk_perms.c index 81f8b1209ce1..4df9f70bd998 100644 --- a/libarchive/test/test_write_disk_perms.c +++ b/libarchive/test/test_write_disk_perms.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_disk_perms.c 201247 2009-12-30 05:59:21Z kientzle $"); #if !defined(_WIN32) || defined(__CYGWIN__) diff --git a/libarchive/test/test_write_disk_secure.c b/libarchive/test/test_write_disk_secure.c index 44b9ea0d5b21..ddaf95d7497c 100644 --- a/libarchive/test/test_write_disk_secure.c +++ b/libarchive/test/test_write_disk_secure.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_disk_secure.c 201247 2009-12-30 05:59:21Z kientzle $"); #define UMASK 022 diff --git a/libarchive/test/test_write_disk_secure744.c b/libarchive/test/test_write_disk_secure744.c index 08c725e12b80..35824658ce65 100644 --- a/libarchive/test/test_write_disk_secure744.c +++ b/libarchive/test/test_write_disk_secure744.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #define UMASK 022 @@ -75,7 +74,7 @@ DEFINE_TEST(test_write_disk_secure744) archive_entry_free(ae); *p++ = '/'; - sprintf(p, "target%d", n); + snprintf(p, buff_size - (p - buff), "target%d", n); /* Try to create a file through the symlink, should fail. */ assert((ae = archive_entry_new()) != NULL); diff --git a/libarchive/test/test_write_disk_secure745.c b/libarchive/test/test_write_disk_secure745.c index 870b06475cef..7b908ccc8905 100644 --- a/libarchive/test/test_write_disk_secure745.c +++ b/libarchive/test/test_write_disk_secure745.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #define UMASK 022 diff --git a/libarchive/test/test_write_disk_secure746.c b/libarchive/test/test_write_disk_secure746.c index 99cb882c059a..3f0588914707 100644 --- a/libarchive/test/test_write_disk_secure746.c +++ b/libarchive/test/test_write_disk_secure746.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #define UMASK 022 diff --git a/libarchive/test/test_write_disk_sparse.c b/libarchive/test/test_write_disk_sparse.c index 36ecf322087d..36fd6944584d 100644 --- a/libarchive/test/test_write_disk_sparse.c +++ b/libarchive/test/test_write_disk_sparse.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_disk_sparse.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * Write a file using archive_write_data call, read the file diff --git a/libarchive/test/test_write_disk_symlink.c b/libarchive/test/test_write_disk_symlink.c index aeadfee8a4e9..65194d94c081 100644 --- a/libarchive/test/test_write_disk_symlink.c +++ b/libarchive/test/test_write_disk_symlink.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_disk_symlink.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * Exercise symlink recreation. diff --git a/libarchive/test/test_write_disk_times.c b/libarchive/test/test_write_disk_times.c index 568d04c0017d..265da4c2b875 100644 --- a/libarchive/test/test_write_disk_times.c +++ b/libarchive/test/test_write_disk_times.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_disk_times.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * Exercise time restores in archive_write_disk(), including diff --git a/libarchive/test/test_write_filter_b64encode.c b/libarchive/test/test_write_filter_b64encode.c index 665087b97885..e33ff8a9817c 100644 --- a/libarchive/test/test_write_filter_b64encode.c +++ b/libarchive/test/test_write_filter_b64encode.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * A basic exercise of b64encode reading and writing. @@ -64,7 +63,7 @@ DEFINE_TEST(test_write_filter_b64encode) assert((ae = archive_entry_new()) != NULL); archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -79,7 +78,7 @@ DEFINE_TEST(test_write_filter_b64encode) assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < 99; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualIntA(a, 0, archive_read_next_header(a, &ae))) break; assertEqualString(path, archive_entry_pathname(ae)); @@ -111,7 +110,7 @@ DEFINE_TEST(test_write_filter_b64encode) assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 99; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -128,7 +127,7 @@ DEFINE_TEST(test_write_filter_b64encode) assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 99; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(0, archive_read_next_header(a, &ae))) break; assertEqualString(path, archive_entry_pathname(ae)); diff --git a/libarchive/test/test_write_filter_bzip2.c b/libarchive/test/test_write_filter_bzip2.c index 4f32d28cbed4..f48bcc213231 100644 --- a/libarchive/test/test_write_filter_bzip2.c +++ b/libarchive/test/test_write_filter_bzip2.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_compress_bzip2.c 191183 2009-04-17 01:06:31Z kientzle $"); /* * A basic exercise of bzip2 reading and writing. @@ -83,7 +82,7 @@ DEFINE_TEST(test_write_filter_bzip2) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < 999; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -99,7 +98,7 @@ DEFINE_TEST(test_write_filter_bzip2) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < 999; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(0, archive_read_next_header(a, &ae))) break; assertEqualString(path, archive_entry_pathname(ae)); @@ -133,7 +132,7 @@ DEFINE_TEST(test_write_filter_bzip2) assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 999; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -160,7 +159,7 @@ DEFINE_TEST(test_write_filter_bzip2) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 999; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(0, archive_read_next_header(a, &ae))) break; assertEqualString(path, archive_entry_pathname(ae)); @@ -187,7 +186,7 @@ DEFINE_TEST(test_write_filter_bzip2) assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 999; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -212,7 +211,7 @@ DEFINE_TEST(test_write_filter_bzip2) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 999; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(0, archive_read_next_header(a, &ae))) break; assertEqualString(path, archive_entry_pathname(ae)); diff --git a/libarchive/test/test_write_filter_compress.c b/libarchive/test/test_write_filter_compress.c index 1b8910e51adb..f7b9565b7db2 100644 --- a/libarchive/test/test_write_filter_compress.c +++ b/libarchive/test/test_write_filter_compress.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_compress.c 189308 2009-03-03 17:02:51Z kientzle $"); /* * A basic exercise of compress reading and writing. @@ -59,7 +58,7 @@ DEFINE_TEST(test_write_filter_compress) archive_write_open_memory(a, buff, buffsize, &used)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -83,7 +82,7 @@ DEFINE_TEST(test_write_filter_compress) for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(0, archive_read_next_header(a, &ae))) break; assertEqualString(path, archive_entry_pathname(ae)); diff --git a/libarchive/test/test_write_filter_gzip.c b/libarchive/test/test_write_filter_gzip.c index 935fb51f5140..ae81a4fc59d6 100644 --- a/libarchive/test/test_write_filter_gzip.c +++ b/libarchive/test/test_write_filter_gzip.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_compress_gzip.c 191183 2009-04-17 01:06:31Z kientzle $"); /* * A basic exercise of gzip reading and writing. @@ -85,7 +84,7 @@ DEFINE_TEST(test_write_filter_gzip) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -113,7 +112,7 @@ DEFINE_TEST(test_write_filter_gzip) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -148,7 +147,7 @@ DEFINE_TEST(test_write_filter_gzip) archive_write_set_options(a, "gzip:compression-level=9")); assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -187,7 +186,7 @@ DEFINE_TEST(test_write_filter_gzip) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -212,7 +211,7 @@ DEFINE_TEST(test_write_filter_gzip) assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -249,7 +248,7 @@ DEFINE_TEST(test_write_filter_gzip) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; diff --git a/libarchive/test/test_write_filter_gzip_timestamp.c b/libarchive/test/test_write_filter_gzip_timestamp.c index 23b11dba79a6..ee29f034231c 100644 --- a/libarchive/test/test_write_filter_gzip_timestamp.c +++ b/libarchive/test/test_write_filter_gzip_timestamp.c @@ -26,7 +26,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_write_filter_gzip_timestamp) { diff --git a/libarchive/test/test_write_filter_lrzip.c b/libarchive/test/test_write_filter_lrzip.c index f28c8358363d..2efc2ec284a4 100644 --- a/libarchive/test/test_write_filter_lrzip.c +++ b/libarchive/test/test_write_filter_lrzip.c @@ -68,7 +68,7 @@ DEFINE_TEST(test_write_filter_lrzip) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -84,7 +84,7 @@ DEFINE_TEST(test_write_filter_lrzip) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; diff --git a/libarchive/test/test_write_filter_lz4.c b/libarchive/test/test_write_filter_lz4.c index 4f2135a31507..97a80321dede 100644 --- a/libarchive/test/test_write_filter_lz4.c +++ b/libarchive/test/test_write_filter_lz4.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * A basic exercise of lz4 reading and writing. @@ -62,7 +61,7 @@ DEFINE_TEST(test_write_filter_lz4) assert(NULL != (buff = (char *)malloc(buffsize))); datasize = 10000; - assert(NULL != (data = (char *)calloc(1, datasize))); + assert(NULL != (data = (char *)calloc(datasize, 1))); filecount = 10; /* @@ -84,7 +83,7 @@ DEFINE_TEST(test_write_filter_lz4) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -107,7 +106,7 @@ DEFINE_TEST(test_write_filter_lz4) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -142,7 +141,7 @@ DEFINE_TEST(test_write_filter_lz4) assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -170,7 +169,7 @@ DEFINE_TEST(test_write_filter_lz4) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -195,7 +194,7 @@ DEFINE_TEST(test_write_filter_lz4) assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -225,7 +224,7 @@ DEFINE_TEST(test_write_filter_lz4) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -306,7 +305,7 @@ test_options(const char *options) assert(NULL != (buff = (char *)malloc(buffsize))); datasize = 10000; - assert(NULL != (data = (char *)calloc(1, datasize))); + assert(NULL != (data = (char *)calloc(datasize, 1))); filecount = 10; /* @@ -330,7 +329,7 @@ test_options(const char *options) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -350,7 +349,7 @@ test_options(const char *options) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; diff --git a/libarchive/test/test_write_filter_lzip.c b/libarchive/test/test_write_filter_lzip.c index 145a3084d3de..8d6544668980 100644 --- a/libarchive/test/test_write_filter_lzip.c +++ b/libarchive/test/test_write_filter_lzip.c @@ -26,7 +26,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * A basic exercise of lzip reading and writing. @@ -81,7 +80,7 @@ DEFINE_TEST(test_write_filter_lzip) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -103,7 +102,7 @@ DEFINE_TEST(test_write_filter_lzip) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -133,7 +132,7 @@ DEFINE_TEST(test_write_filter_lzip) archive_write_set_filter_option(a, NULL, "compression-level", "9")); assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -157,7 +156,7 @@ DEFINE_TEST(test_write_filter_lzip) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); failure("Trying to read %s", path); if (!assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae))) @@ -181,7 +180,7 @@ DEFINE_TEST(test_write_filter_lzip) archive_write_set_filter_option(a, NULL, "compression-level", "0")); assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -210,7 +209,7 @@ DEFINE_TEST(test_write_filter_lzip) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; diff --git a/libarchive/test/test_write_filter_lzma.c b/libarchive/test/test_write_filter_lzma.c index 68e489832504..d7c0c5b21b6b 100644 --- a/libarchive/test/test_write_filter_lzma.c +++ b/libarchive/test/test_write_filter_lzma.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_compress_lzma.c 191183 2009-04-17 01:06:31Z kientzle $"); /* * A basic exercise of lzma reading and writing. @@ -80,7 +79,7 @@ DEFINE_TEST(test_write_filter_lzma) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -102,7 +101,7 @@ DEFINE_TEST(test_write_filter_lzma) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -132,7 +131,7 @@ DEFINE_TEST(test_write_filter_lzma) archive_write_set_filter_option(a, NULL, "compression-level", "9")); assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -156,7 +155,7 @@ DEFINE_TEST(test_write_filter_lzma) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); failure("Trying to read %s", path); if (!assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae))) @@ -180,7 +179,7 @@ DEFINE_TEST(test_write_filter_lzma) archive_write_set_filter_option(a, NULL, "compression-level", "0")); assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -214,7 +213,7 @@ DEFINE_TEST(test_write_filter_lzma) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; diff --git a/libarchive/test/test_write_filter_lzop.c b/libarchive/test/test_write_filter_lzop.c index 92db7bf3dc43..87843f49bd3b 100644 --- a/libarchive/test/test_write_filter_lzop.c +++ b/libarchive/test/test_write_filter_lzop.c @@ -25,8 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); - /* * A basic exercise of lzop reading and writing. */ @@ -57,7 +55,7 @@ DEFINE_TEST(test_write_filter_lzop) assert(NULL != (buff = (char *)malloc(buffsize))); datasize = 10000; - assert(NULL != (data = (char *)calloc(1, datasize))); + assert(NULL != (data = (char *)calloc(datasize, 1))); filecount = 10; /* @@ -79,7 +77,7 @@ DEFINE_TEST(test_write_filter_lzop) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -99,7 +97,7 @@ DEFINE_TEST(test_write_filter_lzop) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -135,7 +133,7 @@ DEFINE_TEST(test_write_filter_lzop) assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -163,7 +161,7 @@ DEFINE_TEST(test_write_filter_lzop) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -188,7 +186,7 @@ DEFINE_TEST(test_write_filter_lzop) assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -218,7 +216,7 @@ DEFINE_TEST(test_write_filter_lzop) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < filecount; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; diff --git a/libarchive/test/test_write_filter_program.c b/libarchive/test/test_write_filter_program.c index 9fe264c018dc..a1f93ab79f5a 100644 --- a/libarchive/test/test_write_filter_program.c +++ b/libarchive/test/test_write_filter_program.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_compress_program.c 201247 2009-12-30 05:59:21Z kientzle $"); static char buff[1000000]; static char buff2[64]; diff --git a/libarchive/test/test_write_filter_uuencode.c b/libarchive/test/test_write_filter_uuencode.c index 57a4b49bd2a6..7eda278b35cd 100644 --- a/libarchive/test/test_write_filter_uuencode.c +++ b/libarchive/test/test_write_filter_uuencode.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * A basic exercise of uuencode reading and writing. @@ -64,7 +63,7 @@ DEFINE_TEST(test_write_filter_uuencode) assert((ae = archive_entry_new()) != NULL); archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -79,7 +78,7 @@ DEFINE_TEST(test_write_filter_uuencode) assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < 99; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualIntA(a, 0, archive_read_next_header(a, &ae))) break; assertEqualString(path, archive_entry_pathname(ae)); @@ -111,7 +110,7 @@ DEFINE_TEST(test_write_filter_uuencode) assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 99; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -128,7 +127,7 @@ DEFINE_TEST(test_write_filter_uuencode) assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 99; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(0, archive_read_next_header(a, &ae))) break; assertEqualString(path, archive_entry_pathname(ae)); diff --git a/libarchive/test/test_write_filter_xz.c b/libarchive/test/test_write_filter_xz.c index bf1265c65b6f..db4e5dafa274 100644 --- a/libarchive/test/test_write_filter_xz.c +++ b/libarchive/test/test_write_filter_xz.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_compress_xz.c 191183 2009-04-17 01:06:31Z kientzle $"); /* * A basic exercise of xz reading and writing. @@ -80,7 +79,7 @@ DEFINE_TEST(test_write_filter_xz) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -102,7 +101,7 @@ DEFINE_TEST(test_write_filter_xz) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -132,7 +131,7 @@ DEFINE_TEST(test_write_filter_xz) archive_write_set_filter_option(a, NULL, "compression-level", "9")); assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -163,7 +162,7 @@ DEFINE_TEST(test_write_filter_xz) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); failure("Trying to read %s", path); if (!assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae))) @@ -187,7 +186,7 @@ DEFINE_TEST(test_write_filter_xz) archive_write_set_filter_option(a, NULL, "compression-level", "0")); assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -220,7 +219,7 @@ DEFINE_TEST(test_write_filter_xz) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; diff --git a/libarchive/test/test_write_filter_zstd.c b/libarchive/test/test_write_filter_zstd.c index 6601e6aaf898..da711f9e4bf9 100644 --- a/libarchive/test/test_write_filter_zstd.c +++ b/libarchive/test/test_write_filter_zstd.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_write_filter_zstd) { @@ -74,7 +73,7 @@ DEFINE_TEST(test_write_filter_zstd) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize @@ -96,7 +95,7 @@ DEFINE_TEST(test_write_filter_zstd) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used1)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); if (!assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae))) break; @@ -133,9 +132,116 @@ DEFINE_TEST(test_write_filter_zstd) archive_write_set_filter_option(a, NULL, "threads", "-1")); /* negative */ assertEqualIntA(a, ARCHIVE_OK, archive_write_set_filter_option(a, NULL, "threads", "4")); +#if HAVE_ZSTD_H && HAVE_ZSTD_compressStream + /* frame-per-file: boolean */ + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "frame-per-file", "")); + /* min-frame-in: >= 0 */ + assertEqualIntA(a, ARCHIVE_FAILED, + archive_write_set_filter_option(a, NULL, "min-frame-out", "")); + assertEqualIntA(a, ARCHIVE_FAILED, + archive_write_set_filter_option(a, NULL, "min-frame-out", "-1")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-out", "0")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-out", "1048576")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-out", "1k")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-out", "1kB")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-out", "1M")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-out", "1MB")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-out", "1G")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-out", "1GB")); + /* min-frame-out: >= 0 */ + assertEqualIntA(a, ARCHIVE_FAILED, + archive_write_set_filter_option(a, NULL, "min-frame-in", "")); + assertEqualIntA(a, ARCHIVE_FAILED, + archive_write_set_filter_option(a, NULL, "min-frame-in", "-1")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-in", "0")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-in", "1048576")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-in", "1k")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-in", "1kB")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-in", "1M")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-in", "1MB")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-in", "1G")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-in", "1GB")); + /* max-frame-in: >= 1024 */ + assertEqualIntA(a, ARCHIVE_FAILED, + archive_write_set_filter_option(a, NULL, "max-frame-in", "")); + assertEqualIntA(a, ARCHIVE_FAILED, + archive_write_set_filter_option(a, NULL, "max-frame-in", "-1")); + assertEqualIntA(a, ARCHIVE_FAILED, + archive_write_set_filter_option(a, NULL, "max-frame-in", "0")); + assertEqualIntA(a, ARCHIVE_FAILED, + archive_write_set_filter_option(a, NULL, "max-frame-in", "1023")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-in", "1024")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-in", "1048576")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-in", "1k")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-in", "1kB")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-in", "1M")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-in", "1MB")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-in", "1G")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-in", "1GB")); + /* max-frame-out: >= 1024 */ + assertEqualIntA(a, ARCHIVE_FAILED, + archive_write_set_filter_option(a, NULL, "max-frame-out", "")); + assertEqualIntA(a, ARCHIVE_FAILED, + archive_write_set_filter_option(a, NULL, "max-frame-out", "-1")); + assertEqualIntA(a, ARCHIVE_FAILED, + archive_write_set_filter_option(a, NULL, "max-frame-out", "0")); + assertEqualIntA(a, ARCHIVE_FAILED, + archive_write_set_filter_option(a, NULL, "max-frame-out", "1023")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-out", "1024")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-out", "1048576")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-out", "1k")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-out", "1kB")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-out", "1M")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-out", "1MB")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-out", "1G")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-out", "1GB")); +#endif +#if ZSTD_VERSION_NUMBER >= MINVER_LONG + if ((int)(sizeof(size_t) == 4)) + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "long", "26")); + else + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "long", "27")); + assertEqualIntA(a, ARCHIVE_FAILED, + archive_write_set_filter_option(a, NULL, "long", "-1")); /* negative */ +#endif assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); assert((ae = archive_entry_new()) != NULL); archive_entry_copy_pathname(ae, path); archive_entry_set_size(ae, datasize); @@ -158,7 +264,7 @@ DEFINE_TEST(test_write_filter_zstd) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used2)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); failure("Trying to read %s", path); if (!assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae))) @@ -185,7 +291,7 @@ DEFINE_TEST(test_write_filter_zstd) archive_entry_set_filetype(ae, AE_IFREG); archive_entry_set_size(ae, datasize); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); archive_entry_copy_pathname(ae, path); assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); assertA(datasize == (size_t)archive_write_data(a, data, datasize)); @@ -205,7 +311,7 @@ DEFINE_TEST(test_write_filter_zstd) assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used3)); for (i = 0; i < 100; i++) { - sprintf(path, "file%03d", i); + snprintf(path, sizeof(path), "file%03d", i); failure("Trying to read %s", path); if (!assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae))) diff --git a/libarchive/test/test_write_format_7zip.c b/libarchive/test/test_write_format_7zip.c index c8fdcd02cc84..d91e88d8f40f 100644 --- a/libarchive/test/test_write_format_7zip.c +++ b/libarchive/test/test_write_format_7zip.c @@ -25,7 +25,6 @@ #include "test.h" -__FBSDID("$FreeBSD$"); static void test_basic(const char *compression_type) diff --git a/libarchive/test/test_write_format_7zip_empty.c b/libarchive/test/test_write_format_7zip_empty.c index 9a503e9d6bac..817009f4355b 100644 --- a/libarchive/test/test_write_format_7zip_empty.c +++ b/libarchive/test/test_write_format_7zip_empty.c @@ -25,7 +25,6 @@ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Test writing an empty archive. diff --git a/libarchive/test/test_write_format_7zip_large.c b/libarchive/test/test_write_format_7zip_large.c index b7a90d187bae..ac2fa08b4125 100644 --- a/libarchive/test/test_write_format_7zip_large.c +++ b/libarchive/test/test_write_format_7zip_large.c @@ -25,7 +25,6 @@ #include "test.h" -__FBSDID("$FreeBSD$"); #define LARGE_SIZE (1*1024*1024) static void diff --git a/libarchive/test/test_write_format_ar.c b/libarchive/test/test_write_format_ar.c index 058d3b17875c..9c6cd5ecdb05 100644 --- a/libarchive/test/test_write_format_ar.c +++ b/libarchive/test/test_write_format_ar.c @@ -26,7 +26,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_ar.c 189308 2009-03-03 17:02:51Z kientzle $"); static char buff[4096]; static char buff2[64]; diff --git a/libarchive/test/test_write_format_cpio.c b/libarchive/test/test_write_format_cpio.c index d5df8a8ce108..827cad3590c4 100644 --- a/libarchive/test/test_write_format_cpio.c +++ b/libarchive/test/test_write_format_cpio.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_cpio.c 185672 2008-12-06 06:02:26Z kientzle $"); static void test_format(int (*set_format)(struct archive *)) diff --git a/libarchive/test/test_write_format_cpio_empty.c b/libarchive/test/test_write_format_cpio_empty.c index 3ca5c395e33c..22682235fca3 100644 --- a/libarchive/test/test_write_format_cpio_empty.c +++ b/libarchive/test/test_write_format_cpio_empty.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_cpio_empty.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * Check that an "empty" cpio archive is correctly created. diff --git a/libarchive/test/test_write_format_cpio_newc.c b/libarchive/test/test_write_format_cpio_newc.c index 48b0b2646472..786b5d739b4d 100644 --- a/libarchive/test/test_write_format_cpio_newc.c +++ b/libarchive/test/test_write_format_cpio_newc.c @@ -23,8 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_cpio_newc.c 201247 2009-12-30 05:59:21Z kientzle $"); - static int is_hex(const char *p, size_t l) diff --git a/libarchive/test/test_write_format_cpio_odc.c b/libarchive/test/test_write_format_cpio_odc.c index aefb42ea872f..c763fcd2520c 100644 --- a/libarchive/test/test_write_format_cpio_odc.c +++ b/libarchive/test/test_write_format_cpio_odc.c @@ -23,8 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_cpio_odc.c 201247 2009-12-30 05:59:21Z kientzle $"); - static int is_octal(const char *p, size_t l) diff --git a/libarchive/test/test_write_format_gnutar.c b/libarchive/test/test_write_format_gnutar.c index 2a4c383e7aff..d72d076d115c 100644 --- a/libarchive/test/test_write_format_gnutar.c +++ b/libarchive/test/test_write_format_gnutar.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static char buff2[64]; diff --git a/libarchive/test/test_write_format_gnutar_filenames.c b/libarchive/test/test_write_format_gnutar_filenames.c index 655e998ed827..aae5a2a6f787 100644 --- a/libarchive/test/test_write_format_gnutar_filenames.c +++ b/libarchive/test/test_write_format_gnutar_filenames.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Inspired by Github issue #682, which reported that gnutar filenames diff --git a/libarchive/test/test_write_format_iso9660.c b/libarchive/test/test_write_format_iso9660.c index e4e98bb95c29..7b455794c5de 100644 --- a/libarchive/test/test_write_format_iso9660.c +++ b/libarchive/test/test_write_format_iso9660.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static char buff2[64]; DEFINE_TEST(test_write_format_iso9660) @@ -385,14 +384,14 @@ DEFINE_TEST(test_write_format_iso9660) assertEqualInt(2048, archive_entry_size(ae)); /* - * Read "hardlnk" + * Read "file" */ assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); assertEqualInt(2, archive_entry_atime(ae)); assertEqualInt(3, archive_entry_birthtime(ae)); assertEqualInt(4, archive_entry_ctime(ae)); assertEqualInt(5, archive_entry_mtime(ae)); - assertEqualString("hardlnk", archive_entry_pathname(ae)); + assertEqualString("file", archive_entry_pathname(ae)); assert((AE_IFREG | 0555) == archive_entry_mode(ae)); assertEqualInt(2, archive_entry_nlink(ae)); assertEqualInt(8, archive_entry_size(ae)); @@ -400,15 +399,15 @@ DEFINE_TEST(test_write_format_iso9660) assertEqualMem(buff2, "12345678", 8); /* - * Read "file" + * Read "hardlnk" */ assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); assertEqualInt(2, archive_entry_atime(ae)); assertEqualInt(3, archive_entry_birthtime(ae)); assertEqualInt(4, archive_entry_ctime(ae)); assertEqualInt(5, archive_entry_mtime(ae)); - assertEqualString("file", archive_entry_pathname(ae)); - assertEqualString("hardlnk", archive_entry_hardlink(ae)); + assertEqualString("hardlnk", archive_entry_pathname(ae)); + assertEqualString("file", archive_entry_hardlink(ae)); assert((AE_IFREG | 0555) == archive_entry_mode(ae)); assertEqualInt(2, archive_entry_nlink(ae)); assertEqualInt(0, archive_entry_size(ae)); @@ -982,13 +981,13 @@ DEFINE_TEST(test_write_format_iso9660) assertEqualInt(2048, archive_entry_size(ae)); /* - * Read "hardlink" + * Read "file" */ assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); assertEqualInt(5, archive_entry_atime(ae)); assertEqualInt(5, archive_entry_ctime(ae)); assertEqualInt(5, archive_entry_mtime(ae)); - assertEqualString("HARDLNK", archive_entry_pathname(ae)); + assertEqualString("FILE", archive_entry_pathname(ae)); assertEqualString(NULL, archive_entry_hardlink(ae)); assert((AE_IFREG | 0400) == archive_entry_mode(ae)); assertEqualInt(8, archive_entry_size(ae)); @@ -996,15 +995,15 @@ DEFINE_TEST(test_write_format_iso9660) assertEqualMem(buff2, "12345678", 8); /* - * Read "file" + * Read "hardlnk" */ assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); assertEqualInt(5, archive_entry_atime(ae)); assertEqualInt(0, archive_entry_birthtime(ae)); assertEqualInt(5, archive_entry_ctime(ae)); assertEqualInt(5, archive_entry_mtime(ae)); - assertEqualString("FILE", archive_entry_pathname(ae)); - assertEqualString("HARDLNK", archive_entry_hardlink(ae)); + assertEqualString("HARDLNK", archive_entry_pathname(ae)); + assertEqualString("FILE", archive_entry_hardlink(ae)); assert((AE_IFREG | 0400) == archive_entry_mode(ae)); assertEqualInt(2, archive_entry_nlink(ae)); assertEqualInt(0, archive_entry_size(ae)); diff --git a/libarchive/test/test_write_format_mtree.c b/libarchive/test/test_write_format_mtree.c index 5109e0920b4d..ed065f9c1340 100644 --- a/libarchive/test/test_write_format_mtree.c +++ b/libarchive/test/test_write_format_mtree.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_mtree.c 191183 2009-04-17 01:06:31Z kientzle $"); static char buff[4096]; static struct { diff --git a/libarchive/test/test_write_format_mtree_absolute_path.c b/libarchive/test/test_write_format_mtree_absolute_path.c index e3972f1f1135..0ad73792add1 100644 --- a/libarchive/test/test_write_format_mtree_absolute_path.c +++ b/libarchive/test/test_write_format_mtree_absolute_path.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); static char buff[4096]; diff --git a/libarchive/test/test_write_format_mtree_classic.c b/libarchive/test/test_write_format_mtree_classic.c index 9a75fdd71f52..f155df591895 100644 --- a/libarchive/test/test_write_format_mtree_classic.c +++ b/libarchive/test/test_write_format_mtree_classic.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); static char buff[4096]; static struct { diff --git a/libarchive/test/test_write_format_mtree_classic_indent.c b/libarchive/test/test_write_format_mtree_classic_indent.c index 6d1c54911558..187cc2be0e4b 100644 --- a/libarchive/test/test_write_format_mtree_classic_indent.c +++ b/libarchive/test/test_write_format_mtree_classic_indent.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); static char buff[4096]; static struct { diff --git a/libarchive/test/test_write_format_mtree_fflags.c b/libarchive/test/test_write_format_mtree_fflags.c index 820d86f70b3d..42a1d6522d7f 100644 --- a/libarchive/test/test_write_format_mtree_fflags.c +++ b/libarchive/test/test_write_format_mtree_fflags.c @@ -25,7 +25,7 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); + #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> #endif diff --git a/libarchive/test/test_write_format_mtree_no_separator.c b/libarchive/test/test_write_format_mtree_no_separator.c index faf42dd5245b..c7b64c1ba6a7 100644 --- a/libarchive/test/test_write_format_mtree_no_separator.c +++ b/libarchive/test/test_write_format_mtree_no_separator.c @@ -25,7 +25,7 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); + #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> #endif diff --git a/libarchive/test/test_write_format_mtree_quoted_filename.c b/libarchive/test/test_write_format_mtree_quoted_filename.c index 63e927a81ffe..aca904c83f56 100644 --- a/libarchive/test/test_write_format_mtree_quoted_filename.c +++ b/libarchive/test/test_write_format_mtree_quoted_filename.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); static char buff[4096]; diff --git a/libarchive/test/test_write_format_pax.c b/libarchive/test/test_write_format_pax.c index 4538aac8241d..625a3742c044 100644 --- a/libarchive/test/test_write_format_pax.c +++ b/libarchive/test/test_write_format_pax.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static char buff2[64]; diff --git a/libarchive/test/test_write_format_shar_empty.c b/libarchive/test/test_write_format_shar_empty.c index 13794b02bb06..b4dbce957523 100644 --- a/libarchive/test/test_write_format_shar_empty.c +++ b/libarchive/test/test_write_format_shar_empty.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_format_shar_empty.c,v 1.3 2008/09/01 05:38:33 kientzle Exp $"); /* * Check that an "empty" shar archive is correctly created as an empty file. diff --git a/libarchive/test/test_write_format_tar.c b/libarchive/test/test_write_format_tar.c index a5ccdc0115bf..631bfa4ed639 100644 --- a/libarchive/test/test_write_format_tar.c +++ b/libarchive/test/test_write_format_tar.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_tar.c 189308 2009-03-03 17:02:51Z kientzle $"); static char buff[1000000]; static char buff2[64]; diff --git a/libarchive/test/test_write_format_tar_empty.c b/libarchive/test/test_write_format_tar_empty.c index 7ccd435f1233..29912f3b2821 100644 --- a/libarchive/test/test_write_format_tar_empty.c +++ b/libarchive/test/test_write_format_tar_empty.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_tar_empty.c 189308 2009-03-03 17:02:51Z kientzle $"); /* * Check that an "empty" tar archive is correctly created. diff --git a/libarchive/test/test_write_format_tar_sparse.c b/libarchive/test/test_write_format_tar_sparse.c index 54ac00988e3d..1568b0eadc29 100644 --- a/libarchive/test/test_write_format_tar_sparse.c +++ b/libarchive/test/test_write_format_tar_sparse.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static char buff[1000000]; diff --git a/libarchive/test/test_write_format_tar_ustar.c b/libarchive/test/test_write_format_tar_ustar.c index 7bc38f7b57fd..d86749fd41b0 100644 --- a/libarchive/test/test_write_format_tar_ustar.c +++ b/libarchive/test/test_write_format_tar_ustar.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_tar_ustar.c 201247 2009-12-30 05:59:21Z kientzle $"); static int is_null(const char *p, size_t l) diff --git a/libarchive/test/test_write_format_tar_v7tar.c b/libarchive/test/test_write_format_tar_v7tar.c index 16909956878b..5fa5f4e21f29 100644 --- a/libarchive/test/test_write_format_tar_v7tar.c +++ b/libarchive/test/test_write_format_tar_v7tar.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static int is_null(const char *p, size_t l) diff --git a/libarchive/test/test_write_format_warc.c b/libarchive/test/test_write_format_warc.c index 3a4c2da1edf1..bb9f2388095b 100644 --- a/libarchive/test/test_write_format_warc.c +++ b/libarchive/test/test_write_format_warc.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); static void test_read(struct archive *a, char *buff, size_t used, char *filedata) { diff --git a/libarchive/test/test_write_format_warc_empty.c b/libarchive/test/test_write_format_warc_empty.c index 0bd31bd7f8cb..d66e85d33e68 100644 --- a/libarchive/test/test_write_format_warc_empty.c +++ b/libarchive/test/test_write_format_warc_empty.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_write_format_warc_empty) { diff --git a/libarchive/test/test_write_format_xar.c b/libarchive/test/test_write_format_xar.c index 02fd2c0e35a7..f1f3032912a7 100644 --- a/libarchive/test/test_write_format_xar.c +++ b/libarchive/test/test_write_format_xar.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static void test_xar(const char *option) diff --git a/libarchive/test/test_write_format_xar_empty.c b/libarchive/test/test_write_format_xar_empty.c index 97c080887e40..b3ba6994e9c9 100644 --- a/libarchive/test/test_write_format_xar_empty.c +++ b/libarchive/test/test_write_format_xar_empty.c @@ -29,7 +29,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_write_format_xar_empty) { diff --git a/libarchive/test/test_write_format_zip.c b/libarchive/test/test_write_format_zip.c index a7ca434f8ea9..54240eeb7afe 100644 --- a/libarchive/test/test_write_format_zip.c +++ b/libarchive/test/test_write_format_zip.c @@ -30,7 +30,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_zip.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * This test doesn't actually check that the zip writer is @@ -290,9 +289,11 @@ verify_contents(struct archive *a, int seeking, int content) assertEqualString("file", archive_entry_pathname(ae)); if (seeking) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); + assert(archive_entry_size_is_set(ae)); + assertEqualInt(8, archive_entry_size(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); } - assert(archive_entry_size_is_set(ae)); - assertEqualInt(8, archive_entry_size(ae)); if (content) { assertEqualIntA(a, 8, archive_read_data(a, filedata, sizeof(filedata))); @@ -308,9 +309,11 @@ verify_contents(struct archive *a, int seeking, int content) assertEqualString("file2", archive_entry_pathname(ae)); if (seeking) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); + assertEqualInt(4, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); } - assertEqualInt(4, archive_entry_size(ae)); - assert(archive_entry_size_is_set(ae)); if (content) { assertEqualIntA(a, 4, archive_read_data(a, filedata, sizeof(filedata))); @@ -374,10 +377,13 @@ verify_contents(struct archive *a, int seeking, int content) assertEqualInt(0, archive_entry_atime(ae)); assertEqualInt(0, archive_entry_ctime(ae)); assertEqualString("file_deflate", archive_entry_pathname(ae)); - if (seeking) + if (seeking) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); - assertEqualInt(8, archive_entry_size(ae)); - assert(archive_entry_size_is_set(ae)); + assertEqualInt(8, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } if (content) { assertEqualIntA(a, 8, archive_read_data(a, filedata, sizeof(filedata))); @@ -392,10 +398,13 @@ verify_contents(struct archive *a, int seeking, int content) assertEqualInt(0, archive_entry_atime(ae)); assertEqualInt(0, archive_entry_ctime(ae)); assertEqualString("file2_deflate", archive_entry_pathname(ae)); - if (seeking) + if (seeking) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); - assertEqualInt(4, archive_entry_size(ae)); - assert(archive_entry_size_is_set(ae)); + assertEqualInt(4, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } if (content) { assertEqualIntA(a, 4, archive_read_data(a, filedata, sizeof(filedata))); @@ -410,6 +419,7 @@ verify_contents(struct archive *a, int seeking, int content) assertEqualInt(0, archive_entry_ctime(ae)); assertEqualString("file3_deflate", archive_entry_pathname(ae)); if (seeking) { + assert(archive_entry_size_is_set(ae)); assertEqualInt(5, archive_entry_size(ae)); assertEqualInt(AE_IFREG | 0621, archive_entry_mode(ae)); } else { @@ -460,10 +470,13 @@ verify_contents(struct archive *a, int seeking, int content) assertEqualInt(0, archive_entry_atime(ae)); assertEqualInt(0, archive_entry_ctime(ae)); assertEqualString("file_stored", archive_entry_pathname(ae)); - if (seeking) + if (seeking) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); - assert(archive_entry_size_is_set(ae)); - assertEqualInt(8, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); + assertEqualInt(8, archive_entry_size(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } if (content) { assertEqualIntA(a, 8, archive_read_data(a, filedata, sizeof(filedata))); @@ -478,10 +491,13 @@ verify_contents(struct archive *a, int seeking, int content) assertEqualInt(0, archive_entry_atime(ae)); assertEqualInt(0, archive_entry_ctime(ae)); assertEqualString("file2_stored", archive_entry_pathname(ae)); - if (seeking) + if (seeking) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); - assertEqualInt(4, archive_entry_size(ae)); - assert(archive_entry_size_is_set(ae)); + assertEqualInt(4, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } if (content) { assertEqualIntA(a, 4, archive_read_data(a, filedata, sizeof(filedata))); diff --git a/libarchive/test/test_write_format_zip64_stream.c b/libarchive/test/test_write_format_zip64_stream.c new file mode 100644 index 000000000000..bed97894e8da --- /dev/null +++ b/libarchive/test/test_write_format_zip64_stream.c @@ -0,0 +1,276 @@ +/*- + * Copyright (c) 2003-2023 Tim Kientzle + * Copyright (c) 2008 Anselm Strauss + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test.h" + +/* + * Detailed byte-for-byte verification of the format of a zip archive + * written in streaming mode with Zip64 extensions enabled. + */ + +static unsigned long +bitcrc32(unsigned long c, void *_p, size_t s) +{ + /* This is a drop-in replacement for crc32() from zlib. + * Libarchive should be able to correctly generate + * uncompressed zip archives (including correct CRCs) even + * when zlib is unavailable, and this function helps us verify + * that. Yes, this is very, very slow and unsuitable for + * production use, but it's correct, compact, and works well + * enough for this particular usage. Libarchive internally + * uses a much more efficient implementation. */ + const unsigned char *p = _p; + int bitctr; + + if (p == NULL) + return (0); + + for (; s > 0; --s) { + c ^= *p++; + for (bitctr = 8; bitctr > 0; --bitctr) { + if (c & 1) c = (c >> 1); + else c = (c >> 1) ^ 0xedb88320; + c ^= 0x80000000; + } + } + return (c); +} + +/* Quick and dirty: Read 2-byte and 4-byte integers from Zip file. */ +static unsigned i2(const unsigned char *p) { return ((p[0] & 0xff) | ((p[1] & 0xff) << 8)); } +static unsigned i4(const unsigned char *p) { return (i2(p) | (i2(p + 2) << 16)); } +/* We're only working with small values here; ignore the 4 high bytes. */ +static unsigned i8(const unsigned char *p) { return (i4(p)); } + +DEFINE_TEST(test_write_format_zip64_stream) +{ + struct archive *a; + struct archive_entry *ae; + size_t used, buffsize = 1000000; + unsigned long crc; + unsigned long compressed_size = 0; + int file_perm = 00644; + int zip_version = 45; + int zip_compression = 8; + short file_uid = 10, file_gid = 20; + unsigned char *buff, *buffend, *p; + unsigned char *central_header, *local_header, *eocd, *eocd_record; + unsigned char *extension_start, *extension_end; + unsigned char *data_start, *data_end; + char file_data[] = {'1', '2', '3', '4', '5', '6', '7', '8'}; + const char *file_name = "file"; + +#ifndef HAVE_ZLIB_H + zip_compression = 0; +#endif + + buff = malloc(buffsize); + + /* Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:zip64")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:experimental")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_open_memory(a, buff, buffsize, &used)); + + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, file_name); + archive_entry_set_mode(ae, AE_IFREG | file_perm); + archive_entry_set_uid(ae, file_uid); + archive_entry_set_gid(ae, file_gid); + archive_entry_set_mtime(ae, 0, 0); + assertEqualInt(0, archive_write_header(a, ae)); + archive_entry_free(ae); + assertEqualInt(8, archive_write_data(a, file_data, sizeof(file_data))); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_free(a)); + buffend = buff + used; + dumpfile("constructed.zip", buff, used); + + /* Verify "End of Central Directory" record. */ + /* Get address of end-of-central-directory record. */ + eocd_record = p = buffend - 22; /* Assumes there is no zip comment field. */ + failure("End-of-central-directory begins with PK\\005\\006 signature"); + assertEqualMem(p, "PK\005\006", 4); + failure("This must be disk 0"); + assertEqualInt(i2(p + 4), 0); + failure("Central dir must start on disk 0"); + assertEqualInt(i2(p + 6), 0); + failure("All central dir entries are on this disk"); + assertEqualInt(i2(p + 8), i2(p + 10)); + eocd = buff + i4(p + 12) + i4(p + 16); + failure("no zip comment"); + assertEqualInt(i2(p + 20), 0); + + /* Get address of first entry in central directory. */ + central_header = p = buff + i4(buffend - 6); + failure("Central file record at offset %d should begin with" + " PK\\001\\002 signature", + i4(buffend - 10)); + + /* Verify file entry in central directory. */ + assertEqualMem(p, "PK\001\002", 4); /* Signature */ + assertEqualInt(i2(p + 4), 3 * 256 + zip_version); /* Version made by */ + assertEqualInt(i2(p + 6), zip_version); /* Version needed to extract */ + assertEqualInt(i2(p + 8), 8); /* Flags */ + assertEqualInt(i2(p + 10), zip_compression); /* Compression method */ + assertEqualInt(i2(p + 12), 0); /* File time */ + assertEqualInt(i2(p + 14), 33); /* File date */ + crc = bitcrc32(0, file_data, sizeof(file_data)); + assertEqualInt(i4(p + 16), crc); /* CRC-32 */ + compressed_size = i4(p + 20); /* Compressed size */ + assertEqualInt(i4(p + 24), sizeof(file_data)); /* Uncompressed size */ + assertEqualInt(i2(p + 28), strlen(file_name)); /* Pathname length */ + /* assertEqualInt(i2(p + 30), 28); */ /* Extra field length: See below */ + assertEqualInt(i2(p + 32), 0); /* File comment length */ + assertEqualInt(i2(p + 34), 0); /* Disk number start */ + assertEqualInt(i2(p + 36), 0); /* Internal file attrs */ + assertEqualInt(i4(p + 38) >> 16 & 01777, file_perm); /* External file attrs */ + assertEqualInt(i4(p + 42), 0); /* Offset of local header */ + assertEqualMem(p + 46, file_name, strlen(file_name)); /* Pathname */ + p = extension_start = central_header + 46 + strlen(file_name); + extension_end = extension_start + i2(central_header + 30); + + assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2(p + 2), 11); /* 'ux' size */ + /* TODO: verify 'ux' contents */ + p += 4 + i2(p + 2); + + assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4(p + 5), 0); /* 'UT' mtime */ + p += 4 + i2(p + 2); + + /* Note: We don't expect to see zip64 extension in the central + * directory, since the writer knows the actual full size by + * the time it is ready to write the central directory and has + * no reason to insert it then. Info-Zip seems to do the same + * thing. */ + + /* Just in case: Report any extra extensions. */ + while (p < extension_end) { + failure("Unexpected extension 0x%04X", i2(p)); + assert(0); + p += 4 + i2(p + 2); + } + + /* Should have run exactly to end of extra data. */ + assertEqualAddress(p, extension_end); + + assertEqualAddress(p, eocd); + + /* After Central dir, we find Zip64 eocd and Zip64 eocd locator. */ + assertEqualMem(p, "PK\006\006", 4); /* Zip64 eocd */ + assertEqualInt(i8(p + 4), 44); /* We're using v1 Zip64 eocd */ + assertEqualInt(i2(p + 12), 45); /* Written by Version 4.5 */ + assertEqualInt(i2(p + 14), 45); /* Needs version 4.5 to extract */ + assertEqualInt(i4(p + 16), 0); /* This is disk #0 */ + assertEqualInt(i4(p + 20), 0); /* Dir starts on disk #0 */ + assertEqualInt(i8(p + 24), 1); /* 1 entry on this disk */ + assertEqualInt(i8(p + 32), 1); /* 1 entry total */ + assertEqualInt(i8(p + 40), eocd - central_header); /* size of cd */ + assertEqualInt(i8(p + 48), central_header - buff); /* start of cd */ + p += 12 + i8(p + 4); + + assertEqualMem(p, "PK\006\007", 4); /* Zip64 eocd locator */ + assertEqualInt(i4(p + 4), 0); /* Zip64 eocd is on disk #0 */ + assertEqualInt(i8(p + 8), eocd - buff); /* Offset of Zip64 eocd */ + assertEqualInt(i4(p + 16), 1); /* 1 disk */ + p += 20; + + /* Regular EOCD immediately follows Zip64 records. */ + assertEqualAddress(p, eocd_record); + + /* Verify local header of file entry. */ + p = local_header = buff; + assertEqualMem(p, "PK\003\004", 4); /* Signature */ + assertEqualInt(i2(p + 4), zip_version); /* Version needed to extract */ + assertEqualInt(i2(p + 6), 8); /* Flags: bit 3 = length-at-end */ + assertEqualInt(i2(p + 8), zip_compression); /* Compression method */ + assertEqualInt(i2(p + 10), 0); /* File time */ + assertEqualInt(i2(p + 12), 33); /* File date */ + assertEqualInt(i4(p + 14), 0); /* CRC-32 */ + assertEqualInt(i4(p + 18), 0); /* Compressed size must be zero for length-at-end */ + assertEqualInt(i4(p + 22), 0); /* Uncompressed size must be zero for length-at-end */ + assertEqualInt(i2(p + 26), strlen(file_name)); /* Pathname length */ + assertEqualInt(i2(p + 28), 37); /* Extra field length */ + assertEqualMem(p + 30, file_name, strlen(file_name)); /* Pathname */ + p = extension_start = local_header + 30 + strlen(file_name); + extension_end = extension_start + i2(local_header + 28); + + assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2(p + 2), 11); /* 'ux' size */ + assertEqualInt(p[4], 1); /* 'ux' version */ + assertEqualInt(p[5], 4); /* 'ux' uid size */ + assertEqualInt(i4(p + 6), file_uid); /* 'Ux' UID */ + assertEqualInt(p[10], 4); /* 'ux' gid size */ + assertEqualInt(i4(p + 11), file_gid); /* 'Ux' GID */ + p += 4 + i2(p + 2); + + assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4(p + 5), 0); /* 'UT' mtime */ + p += 4 + i2(p + 2); + + assertEqualInt(i2(p), 0x6c78); /* 'xl' experimental extension header */ + assertEqualInt(i2(p + 2), 9); /* size */ + assertEqualInt(p[4], 7); /* bitmap of included fields */ + assertEqualInt(i2(p + 5) >> 8, 3); /* system & version made by */ + assertEqualInt(i2(p + 7), 0); /* internal file attributes */ + assertEqualInt(i4(p + 9) >> 16 & 01777, file_perm); /* external file attributes */ + p += 4 + i2(p + 2); + + /* Just in case: Report any extra extensions. */ + while (p < extension_end) { + failure("Unexpected extension 0x%04X", i2(p)); + assert(0); + p += 4 + i2(p + 2); + } + + /* Should have run exactly to end of extra data. */ + assertEqualAddress(p, extension_end); + data_start = p; + + /* Data descriptor should follow compressed data. */ + while (p < central_header && memcmp(p, "PK\007\010", 4) != 0) + ++p; + data_end = p; + assertEqualInt(data_end - data_start, compressed_size); + assertEqualMem(p, "PK\007\010", 4); + assertEqualInt(i4(p + 4), crc); /* CRC-32 */ + assertEqualInt(i8(p + 8), compressed_size); /* compressed size */ + assertEqualInt(i8(p + 16), sizeof(file_data)); /* uncompressed size */ + + /* Central directory should immediately follow the only entry. */ + assertEqualAddress(p + 24, central_header); + + free(buff); +} diff --git a/libarchive/test/test_write_format_zip_compression_store.c b/libarchive/test/test_write_format_zip_compression_store.c index c969a41d4d41..fc764ac7af83 100644 --- a/libarchive/test/test_write_format_zip_compression_store.c +++ b/libarchive/test/test_write_format_zip_compression_store.c @@ -28,7 +28,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_zip_no_compression.c 201247 2009-12-30 05:59:21Z kientzle $"); /* File data */ static const char file_name[] = "file"; @@ -128,12 +127,22 @@ static void verify_uncompressed_contents(const char *buff, size_t used) /* Misc variables */ unsigned long crc; - struct tm *tm = localtime(&now); - + struct tm *tm; +#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S) + struct tm tmbuf; +#endif /* p is the pointer to walk over the central directory, * q walks over the local headers, the data and the data descriptors. */ const char *p, *q, *local_header, *extra_start; +#if defined(HAVE_LOCALTIME_S) + tm = localtime_s(&tmbuf, &now) ? NULL : &tmbuf; +#elif defined(HAVE_LOCALTIME_R) + tm = localtime_r(&now, &tmbuf); +#else + tm = localtime(&now); +#endif + /* Remember the end of the archive in memory. */ buffend = buff + used; @@ -174,7 +183,7 @@ static void verify_uncompressed_contents(const char *buff, size_t used) assertEqualInt(i4(p + 20), sizeof(file_data1) + sizeof(file_data2)); /* Compressed size */ assertEqualInt(i4(p + 24), sizeof(file_data1) + sizeof(file_data2)); /* Uncompressed size */ assertEqualInt(i2(p + 28), strlen(file_name)); /* Pathname length */ - assertEqualInt(i2(p + 30), 28); /* Extra field length */ + assertEqualInt(i2(p + 30), 24); /* Extra field length */ assertEqualInt(i2(p + 32), 0); /* File comment length */ assertEqualInt(i2(p + 34), 0); /* Disk number start */ assertEqualInt(i2(p + 36), 0); /* Internal file attrs */ @@ -182,38 +191,33 @@ static void verify_uncompressed_contents(const char *buff, size_t used) assertEqualInt(i4(p + 42), 0); /* Offset of local header */ assertEqualMem(p + 46, file_name, strlen(file_name)); /* Pathname */ p = p + 46 + strlen(file_name); - assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(p + 2), 9); /* 'UT' size */ - assertEqualInt(p[4], 3); /* 'UT' flags */ - assertEqualInt(i4(p + 5), now); /* 'UT' mtime */ - assertEqualInt(i4(p + 9), now + 3); /* 'UT' atime */ - p = p + 4 + i2(p + 2); + assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ assertEqualInt(i2(p + 2), 11); /* 'ux' size */ /* TODO */ p = p + 4 + i2(p + 2); + assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4(p + 5), now); /* 'UT' mtime */ + p = p + 4 + i2(p + 2); + /* Verify local header of file entry. */ local_header = q = buff; assertEqualMem(q, "PK\003\004", 4); /* Signature */ assertEqualInt(i2(q + 4), 10); /* Version needed to extract */ - assertEqualInt(i2(q + 6), 8); /* Flags */ + assertEqualInt(i2(q + 6), 8); /* Flags: bit 3 = length-at-end. Required because CRC32 is unknown */ assertEqualInt(i2(q + 8), 0); /* Compression method */ assertEqualInt(i2(q + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ assertEqualInt(i2(q + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ assertEqualInt(i4(q + 14), 0); /* CRC-32 */ - assertEqualInt(i4(q + 18), sizeof(file_data1) + sizeof(file_data2)); /* Compressed size */ - assertEqualInt(i4(q + 22), sizeof(file_data1) + sizeof(file_data2)); /* Uncompressed size */ + assertEqualInt(i4(q + 18), 0); /* Compressed size, must be zero because of length-at-end */ + assertEqualInt(i4(q + 22), 0); /* Uncompressed size, must be zero because of length-at-end */ assertEqualInt(i2(q + 26), strlen(file_name)); /* Pathname length */ assertEqualInt(i2(q + 28), 41); /* Extra field length */ assertEqualMem(q + 30, file_name, strlen(file_name)); /* Pathname */ extra_start = q = q + 30 + strlen(file_name); - assertEqualInt(i2(q), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(q + 2), 9); /* 'UT' size */ - assertEqualInt(q[4], 3); /* 'UT' flags */ - assertEqualInt(i4(q + 5), now); /* 'UT' mtime */ - assertEqualInt(i4(q + 9), now + 3); /* 'UT' atime */ - q = q + 4 + i2(q + 2); assertEqualInt(i2(q), 0x7875); /* 'ux' extension header */ assertEqualInt(i2(q + 2), 11); /* 'ux' size */ @@ -224,6 +228,13 @@ static void verify_uncompressed_contents(const char *buff, size_t used) assertEqualInt(i4(q + 11), file_gid); /* 'Ux' GID */ q = q + 4 + i2(q + 2); + assertEqualInt(i2(q), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(q + 2), 9); /* 'UT' size */ + assertEqualInt(q[4], 3); /* 'UT' flags */ + assertEqualInt(i4(q + 5), now); /* 'UT' mtime */ + assertEqualInt(i4(q + 9), now + 3); /* 'UT' atime */ + q = q + 4 + i2(q + 2); + assertEqualInt(i2(q), 0x6c78); /* 'xl' experimental extension header */ assertEqualInt(i2(q + 2), 9); /* size */ assertEqualInt(q[4], 7); /* Bitmap of fields included. */ @@ -260,7 +271,7 @@ static void verify_uncompressed_contents(const char *buff, size_t used) assertEqualInt(i4(p + 20), 0); /* Compressed size */ assertEqualInt(i4(p + 24), 0); /* Uncompressed size */ assertEqualInt(i2(p + 28), strlen(folder_name)); /* Pathname length */ - assertEqualInt(i2(p + 30), 28); /* Extra field length */ + assertEqualInt(i2(p + 30), 24); /* Extra field length */ assertEqualInt(i2(p + 32), 0); /* File comment length */ assertEqualInt(i2(p + 34), 0); /* Disk number start */ assertEqualInt(i2(p + 36), 0); /* Internal file attrs */ @@ -268,12 +279,7 @@ static void verify_uncompressed_contents(const char *buff, size_t used) assertEqualInt(i4(p + 42), q - buff); /* Offset of local header */ assertEqualMem(p + 46, folder_name, strlen(folder_name)); /* Pathname */ p = p + 46 + strlen(folder_name); - assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(p + 2), 9); /* 'UT' size */ - assertEqualInt(p[4], 5); /* 'UT' flags */ - assertEqualInt(i4(p + 5), now); /* 'UT' mtime */ - assertEqualInt(i4(p + 9), now + 5); /* 'UT' atime */ - p = p + 4 + i2(p + 2); + assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ assertEqualInt(i2(p + 2), 11); /* 'ux' size */ assertEqualInt(p[4], 1); /* 'ux' version */ @@ -281,7 +287,13 @@ static void verify_uncompressed_contents(const char *buff, size_t used) assertEqualInt(i4(p + 6), folder_uid); /* 'ux' UID */ assertEqualInt(p[10], 4); /* 'ux' gid size */ assertEqualInt(i4(p + 11), folder_gid); /* 'ux' GID */ - /*p = p + 4 + i2(p + 2);*/ + p = p + 4 + i2(p + 2); + + assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4(p + 5), now); /* 'UT' mtime */ + p = p + 4 + i2(p + 2); /* Verify local header of folder entry. */ local_header = q; @@ -298,12 +310,7 @@ static void verify_uncompressed_contents(const char *buff, size_t used) assertEqualInt(i2(q + 28), 41); /* Extra field length */ assertEqualMem(q + 30, folder_name, strlen(folder_name)); /* Pathname */ extra_start = q = q + 30 + strlen(folder_name); - assertEqualInt(i2(q), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(q + 2), 9); /* 'UT' size */ - assertEqualInt(q[4], 5); /* 'UT' flags */ - assertEqualInt(i4(q + 5), now); /* 'UT' mtime */ - assertEqualInt(i4(q + 9), now + 5); /* 'UT' atime */ - q = q + 4 + i2(q + 2); + assertEqualInt(i2(q), 0x7875); /* 'ux' extension header */ assertEqualInt(i2(q + 2), 11); /* 'ux' size */ assertEqualInt(q[4], 1); /* 'ux' version */ @@ -313,6 +320,13 @@ static void verify_uncompressed_contents(const char *buff, size_t used) assertEqualInt(i4(q + 11), folder_gid); /* 'ux' GID */ q = q + 4 + i2(q + 2); + assertEqualInt(i2(q), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(q + 2), 9); /* 'UT' size */ + assertEqualInt(q[4], 5); /* 'UT' flags */ + assertEqualInt(i4(q + 5), now); /* 'UT' mtime */ + assertEqualInt(i4(q + 9), now + 5); /* 'UT' atime */ + q = q + 4 + i2(q + 2); + assertEqualInt(i2(q), 0x6c78); /* 'xl' experimental extension header */ assertEqualInt(i2(q + 2), 9); /* size */ assertEqualInt(q[4], 7); /* bitmap of fields */ diff --git a/libarchive/test/test_write_format_zip_empty.c b/libarchive/test/test_write_format_zip_empty.c index 73a55731261e..410304d44120 100644 --- a/libarchive/test/test_write_format_zip_empty.c +++ b/libarchive/test/test_write_format_zip_empty.c @@ -28,7 +28,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_zip_empty.c 201247 2009-12-30 05:59:21Z kientzle $"); DEFINE_TEST(test_write_format_zip_empty) { diff --git a/libarchive/test/test_write_format_zip_empty_zip64.c b/libarchive/test/test_write_format_zip_empty_zip64.c index 8f9975b2102c..f56bf578e4cc 100644 --- a/libarchive/test/test_write_format_zip_empty_zip64.c +++ b/libarchive/test/test_write_format_zip_empty_zip64.c @@ -28,7 +28,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_zip_empty.c 201247 2009-12-30 05:59:21Z kientzle $"); DEFINE_TEST(test_write_format_zip_empty_zip64) { diff --git a/libarchive/test/test_write_format_zip_entry_size_unset.c b/libarchive/test/test_write_format_zip_entry_size_unset.c index 13b5f1b2db1a..10c191f7ce7d 100644 --- a/libarchive/test/test_write_format_zip_entry_size_unset.c +++ b/libarchive/test/test_write_format_zip_entry_size_unset.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); /* File data */ static const char file_name[] = "file"; @@ -152,7 +151,7 @@ static void verify_contents(const char *zip_buff, size_t size) /* Check file name length */ assertEqualInt(i2(central_directory + 28), strlen(file_name)); /* Check extra field length */ - assertEqualInt(i2(central_directory + 30), 20); + assertEqualInt(i2(central_directory + 30), 15); /* Check file comment length */ assertEqualInt(i2(central_directory + 32), 0); /* Check disk number where file starts */ @@ -188,7 +187,7 @@ static void verify_contents(const char *zip_buff, size_t size) /* Check pathname length */ assertEqualInt(i2(local_file_header + 26), strlen(file_name)); /* Check extra field length */ - assertEqualInt(i2(local_file_header + 28), 20); + assertEqualInt(i2(local_file_header + 28), 15); /* Check path name match */ assertEqualMem(local_file_header + 30, file_name, strlen(file_name)); @@ -210,7 +209,7 @@ static void verify_contents(const char *zip_buff, size_t size) assertEqualInt(i4(data_descriptor + 12), sizeof(file_data1) + sizeof(file_data2)); /* Get folder entry in central directory */ - const char *central_directory_folder_entry = central_directory + 46 + 20 + strlen(file_name); + const char *central_directory_folder_entry = central_directory + 46 + i2(local_file_header + 28) + strlen(file_name); /* Get start of folder entry */ const char *local_folder_header = data_descriptor + 16; @@ -234,7 +233,7 @@ static void verify_contents(const char *zip_buff, size_t size) /* Check path name length */ assertEqualInt(i2(central_directory_folder_entry + 28), strlen(folder_name)); /* Check extra field length */ - assertEqualInt(i2(central_directory_folder_entry + 30), 20); + assertEqualInt(i2(central_directory_folder_entry + 30), 15); /* Check file comment length */ assertEqualInt(i2(central_directory_folder_entry + 32), 0); /* Check disk number start */ @@ -265,11 +264,11 @@ static void verify_contents(const char *zip_buff, size_t size) /* Check path name length */ assertEqualInt(i2(local_folder_header + 26), strlen(folder_name)); /* Check extra field length */ - assertEqualInt(i2(local_folder_header + 28), 20); + assertEqualInt(i2(local_folder_header + 28), 15); /* Check path name */ assertEqualMem(local_folder_header + 30, folder_name, strlen(folder_name)); - const char *post_local_folder = local_folder_header + 30 + strlen(folder_name) + 20; + const char *post_local_folder = local_folder_header + 30 + i2(local_folder_header + 28) + strlen(folder_name); assertEqualMem(post_local_folder, central_directory, 4); } diff --git a/libarchive/test/test_write_format_zip_file.c b/libarchive/test/test_write_format_zip_file.c index 2868123b08b9..d4f1b9b22054 100644 --- a/libarchive/test/test_write_format_zip_file.c +++ b/libarchive/test/test_write_format_zip_file.c @@ -29,7 +29,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_zip.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * Detailed byte-for-byte verification of the format of a zip archive @@ -73,7 +72,10 @@ DEFINE_TEST(test_write_format_zip_file) struct archive *a; struct archive_entry *ae; time_t t = 1234567890; - struct tm *tm = localtime(&t); + struct tm *tm; +#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S) + struct tm tmbuf; +#endif size_t used, buffsize = 1000000; unsigned long crc; int file_perm = 00644; @@ -91,6 +93,13 @@ DEFINE_TEST(test_write_format_zip_file) zip_compression = 0; #endif +#if defined(HAVE_LOCALTIME_S) + tm = localtime_s(&tmbuf, &t) ? NULL : &tmbuf; +#elif defined(HAVE_LOCALTIME_R) + tm = localtime_r(&t, &tmbuf); +#else + tm = localtime(&t); +#endif buff = malloc(buffsize); /* Create a new archive in memory. */ @@ -160,17 +169,17 @@ DEFINE_TEST(test_write_format_zip_file) p = extension_start = central_header + 46 + strlen(file_name); extension_end = extension_start + i2(central_header + 30); + assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2(p + 2), 11); /* 'ux' size */ + /* TODO: verify 'ux' contents */ + p += 4 + i2(p + 2); + assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ assertEqualInt(i2(p + 2), 5); /* 'UT' size */ assertEqualInt(p[4], 1); /* 'UT' flags */ assertEqualInt(i4(p + 5), t); /* 'UT' mtime */ p += 4 + i2(p + 2); - assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ - assertEqualInt(i2(p + 2), 11); /* 'ux' size */ - /* TODO: verify 'ux' contents */ - p += 4 + i2(p + 2); - /* Just in case: Report any extra extensions. */ while (p < extension_end) { failure("Unexpected extension 0x%04X", i2(p)); @@ -179,36 +188,30 @@ DEFINE_TEST(test_write_format_zip_file) } /* Should have run exactly to end of extra data. */ - assert(p == extension_end); + assertEqualAddress(p, extension_end); - assert(p == eocd); + assertEqualAddress(p, eocd); /* Regular EOCD immediately follows central directory. */ - assert(p == eocd_record); + assertEqualAddress(p, eocd_record); /* Verify local header of file entry. */ p = local_header = buff; assertEqualMem(p, "PK\003\004", 4); /* Signature */ assertEqualInt(i2(p + 4), zip_version); /* Version needed to extract */ - assertEqualInt(i2(p + 6), 8); /* Flags */ + assertEqualInt(i2(p + 6), 8); /* Flags: bit 3 = length-at-end */ assertEqualInt(i2(p + 8), zip_compression); /* Compression method */ assertEqualInt(i2(p + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ assertEqualInt(i2(p + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ - assertEqualInt(i4(p + 14), 0); /* CRC-32 */ - /* assertEqualInt(i4(p + 18), sizeof(file_data)); */ /* Compressed size */ - /* assertEqualInt(i4(p + 22), sizeof(file_data)); */ /* Uncompressed size not stored because we're using length-at-end. */ + assertEqualInt(i4(p + 14), 0); /* CRC-32 stored as zero because we're using length-at-end */ + assertEqualInt(i4(p + 18), 0); /* Compressed size stored as zero because we're using length-at-end. */ + assertEqualInt(i4(p + 22), 0); /* Uncompressed size stored as zero because we're using length-at-end. */ assertEqualInt(i2(p + 26), strlen(file_name)); /* Pathname length */ assertEqualInt(i2(p + 28), 37); /* Extra field length */ assertEqualMem(p + 30, file_name, strlen(file_name)); /* Pathname */ p = extension_start = local_header + 30 + strlen(file_name); extension_end = extension_start + i2(local_header + 28); - assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(p + 2), 5); /* size */ - assertEqualInt(p[4], 1); /* 'UT' flags */ - assertEqualInt(i4(p + 5), t); /* 'UT' mtime */ - p += 4 + i2(p + 2); - assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ assertEqualInt(i2(p + 2), 11); /* size */ assertEqualInt(p[4], 1); /* 'ux' version */ @@ -218,6 +221,12 @@ DEFINE_TEST(test_write_format_zip_file) assertEqualInt(i4(p + 11), file_gid); /* 'Ux' GID */ p += 4 + i2(p + 2); + assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(p + 2), 5); /* size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4(p + 5), t); /* 'UT' mtime */ + p += 4 + i2(p + 2); + assertEqualInt(i2(p), 0x6c78); /* 'xl' experimental extension block */ assertEqualInt(i2(p + 2), 9); /* size */ assertEqualInt(p[4], 7); /* bitmap of fields in this block */ @@ -234,18 +243,18 @@ DEFINE_TEST(test_write_format_zip_file) } /* Should have run exactly to end of extra data. */ - assert(p == extension_end); + assertEqualAddress(p, extension_end); /* Data descriptor should follow compressed data. */ while (p < central_header && memcmp(p, "PK\007\010", 4) != 0) ++p; assertEqualMem(p, "PK\007\010", 4); assertEqualInt(i4(p + 4), crc); /* CRC-32 */ - /* assertEqualInt(i4(p + 8), ???); */ /* compressed size */ + assertEqualInt(i4(p + 8), p - extension_end); /* compressed size */ assertEqualInt(i4(p + 12), sizeof(file_data)); /* uncompressed size */ /* Central directory should immediately follow the only entry. */ - assert(p + 16 == central_header); + assertEqualAddress(p + 16, central_header); free(buff); } diff --git a/libarchive/test/test_write_format_zip_file_zip64.c b/libarchive/test/test_write_format_zip_file_zip64.c index 71da98668d8d..f06f2aad3c95 100644 --- a/libarchive/test/test_write_format_zip_file_zip64.c +++ b/libarchive/test/test_write_format_zip_file_zip64.c @@ -29,7 +29,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_zip.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * Detailed byte-for-byte verification of the format of a zip archive @@ -75,7 +74,10 @@ DEFINE_TEST(test_write_format_zip_file_zip64) struct archive *a; struct archive_entry *ae; time_t t = 1234567890; - struct tm *tm = localtime(&t); + struct tm *tm; +#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S) + struct tm tmbuf; +#endif size_t used, buffsize = 1000000; unsigned long crc; int file_perm = 00644; @@ -92,6 +94,13 @@ DEFINE_TEST(test_write_format_zip_file_zip64) zip_compression = 0; #endif +#if defined(HAVE_LOCALTIME_S) + tm = localtime_s(&tmbuf, &t) ? NULL : &tmbuf; +#elif defined(HAVE_LOCALTIME_R) + tm = localtime_r(&t, &tmbuf); +#else + tm = localtime(&t); +#endif buff = malloc(buffsize); /* Create a new archive in memory. */ @@ -163,17 +172,17 @@ DEFINE_TEST(test_write_format_zip_file_zip64) p = extension_start = central_header + 46 + strlen(file_name); extension_end = extension_start + i2(central_header + 30); + assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2(p + 2), 11); /* 'ux' size */ + /* TODO: verify 'ux' contents */ + p += 4 + i2(p + 2); + assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ assertEqualInt(i2(p + 2), 5); /* 'UT' size */ assertEqualInt(p[4], 1); /* 'UT' flags */ assertEqualInt(i4(p + 5), t); /* 'UT' mtime */ p += 4 + i2(p + 2); - assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ - assertEqualInt(i2(p + 2), 11); /* 'ux' size */ - /* TODO: verify 'ux' contents */ - p += 4 + i2(p + 2); - /* Note: We don't expect to see zip64 extension in the central * directory, since the writer knows the actual full size by * the time it is ready to write the central directory and has @@ -188,9 +197,9 @@ DEFINE_TEST(test_write_format_zip_file_zip64) } /* Should have run exactly to end of extra data. */ - assert(p == extension_end); + assertEqualAddress(p, extension_end); - assert(p == eocd); + assertEqualAddress(p, eocd); /* After Central dir, we find Zip64 eocd and Zip64 eocd locator. */ assertEqualMem(p, "PK\006\006", 4); /* Zip64 eocd */ @@ -212,31 +221,25 @@ DEFINE_TEST(test_write_format_zip_file_zip64) p += 20; /* Regular EOCD immediately follows Zip64 records. */ - assert(p == eocd_record); + assertEqualAddress(p, eocd_record); /* Verify local header of file entry. */ p = local_header = buff; assertEqualMem(p, "PK\003\004", 4); /* Signature */ assertEqualInt(i2(p + 4), zip_version); /* Version needed to extract */ - assertEqualInt(i2(p + 6), 8); /* Flags */ + assertEqualInt(i2(p + 6), 8); /* Flags: bit 3 = length-at-end */ assertEqualInt(i2(p + 8), zip_compression); /* Compression method */ assertEqualInt(i2(p + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ assertEqualInt(i2(p + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ - assertEqualInt(i4(p + 14), 0); /* CRC-32 */ - /* assertEqualInt(i4(p + 18), sizeof(file_data)); */ /* Compressed size */ - /* assertEqualInt(i4(p + 22), sizeof(file_data)); */ /* Uncompressed size not stored because we're using length-at-end. */ + assertEqualInt(i4(p + 14), 0); /* CRC-32 must be 0 because of length-at-end */ + assertEqualInt(i4(p + 18), 0); /* Compressed size must be 0 because of length-at-end */ + assertEqualInt(i4(p + 22), 0); /* Uncompressed size must be 0 because of length-at-end. */ assertEqualInt(i2(p + 26), strlen(file_name)); /* Pathname length */ - assertEqualInt(i2(p + 28), 57); /* Extra field length */ + assertEqualInt(i2(p + 28), 37); /* Extra field length */ assertEqualMem(p + 30, file_name, strlen(file_name)); /* Pathname */ p = extension_start = local_header + 30 + strlen(file_name); extension_end = extension_start + i2(local_header + 28); - assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(p + 2), 5); /* 'UT' size */ - assertEqualInt(p[4], 1); /* 'UT' flags */ - assertEqualInt(i4(p + 5), t); /* 'UT' mtime */ - p += 4 + i2(p + 2); - assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ assertEqualInt(i2(p + 2), 11); /* 'ux' size */ assertEqualInt(p[4], 1); /* 'ux' version */ @@ -246,10 +249,10 @@ DEFINE_TEST(test_write_format_zip_file_zip64) assertEqualInt(i4(p + 11), file_gid); /* 'Ux' GID */ p += 4 + i2(p + 2); - assertEqualInt(i2(p), 0x0001); /* Zip64 extension header */ - assertEqualInt(i2(p + 2), 16); /* size */ - assertEqualInt(i8(p + 4), 8); /* uncompressed file size */ - /* compressed file size we can't verify here */ + assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4(p + 5), t); /* 'UT' mtime */ p += 4 + i2(p + 2); assertEqualInt(i2(p), 0x6c78); /* 'xl' experimental extension header */ @@ -268,18 +271,18 @@ DEFINE_TEST(test_write_format_zip_file_zip64) } /* Should have run exactly to end of extra data. */ - assert(p == extension_end); + assertEqualAddress(p, extension_end); /* Data descriptor should follow compressed data. */ while (p < central_header && memcmp(p, "PK\007\010", 4) != 0) ++p; assertEqualMem(p, "PK\007\010", 4); assertEqualInt(i4(p + 4), crc); /* CRC-32 */ - /* assertEqualInt(i8(p + 8), ???); */ /* compressed size */ + assertEqualInt(i8(p + 8), p - extension_end); /* compressed size */ assertEqualInt(i8(p + 16), sizeof(file_data)); /* uncompressed size */ /* Central directory should immediately follow the only entry. */ - assert(p + 24 == central_header); + assertEqualAddress(p + 24, central_header); free(buff); } diff --git a/libarchive/test/test_write_format_zip_large.c b/libarchive/test/test_write_format_zip_large.c index 2f98c6d4db8a..90bd16aaa581 100644 --- a/libarchive/test/test_write_format_zip_large.c +++ b/libarchive/test/test_write_format_zip_large.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #include <errno.h> #include <stdlib.h> @@ -273,22 +272,21 @@ static int64_t test_sizes[] = { 2 * GB - 1, 2 * GB, 2 * GB + 1, /* Test for 32-bit unsigned overflow. */ 4 * GB - 1, 4 * GB, 4 * GB + 1, - /* And beyond ... because we can. */ - 16 * GB - 1, 16 * GB, 16 * GB + 1, - 64 * GB - 1, 64 * GB, 64 * GB + 1, - 256 * GB - 1, 256 * GB, 256 * GB + 1, - 1 * TB, + /* And one larger sample */ + 5 * GB, 0 }; static void -verify_large_zip(struct archive *a, struct fileblocks *fileblocks) +verify_large_zip(struct archive *a, struct fileblocks *fileblocks, int seeking) { char namebuff[64]; struct archive_entry *ae; int i; + (void)seeking; /* UNUSED */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_set_options(a, "zip:ignorecrc32")); assertEqualIntA(a, ARCHIVE_OK, @@ -309,9 +307,15 @@ verify_large_zip(struct archive *a, struct fileblocks *fileblocks) for (i = 0; test_sizes[i] > 0; i++) { assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); - sprintf(namebuff, "file_%d", i); + snprintf(namebuff, sizeof(namebuff), "file_%d", i); assertEqualString(namebuff, archive_entry_pathname(ae)); - assertEqualInt(test_sizes[i], archive_entry_size(ae)); + if (seeking) { + assert(archive_entry_size_is_set(ae)); + assertEqualInt(test_sizes[i], archive_entry_size(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } + /* TODO: Read to end of data, verify length */ } assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); assertEqualString("lastfile", archive_entry_pathname(ae)); @@ -345,6 +349,7 @@ DEFINE_TEST(test_write_format_zip_large) */ a = archive_write_new(); archive_write_set_format_zip(a); + /* TODO: Repeat this entire test suite with default compression */ assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "zip:compression=store")); assertEqualIntA(a, ARCHIVE_OK, @@ -359,7 +364,7 @@ DEFINE_TEST(test_write_format_zip_large) */ for (i = 0; test_sizes[i] != 0; i++) { assert((ae = archive_entry_new()) != NULL); - sprintf(namebuff, "file_%d", i); + snprintf(namebuff, sizeof(namebuff), "file_%d", i); archive_entry_copy_pathname(ae, namebuff); archive_entry_set_mode(ae, S_IFREG | 0755); filesize = test_sizes[i]; @@ -398,7 +403,7 @@ DEFINE_TEST(test_write_format_zip_large) a = archive_read_new(); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip_seekable(a)); - verify_large_zip(a, fileblocks); + verify_large_zip(a, fileblocks, 1); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); /* @@ -407,7 +412,7 @@ DEFINE_TEST(test_write_format_zip_large) a = archive_read_new(); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip_streamable(a)); - verify_large_zip(a, fileblocks); + verify_large_zip(a, fileblocks, 0); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); /* @@ -430,7 +435,7 @@ DEFINE_TEST(test_write_format_zip_large) /* Verify regular end-of-central-directory record */ eocd = p - 22; assertEqualMem(eocd, "PK\005\006\0\0\0\0", 8); - assertEqualMem(eocd + 8, "\021\0\021\0", 4); /* 17 entries total */ + assertEqualMem(eocd + 8, "\010\0\010\0", 4); /* 8 entries total */ cd_size = le32(eocd + 12); /* Start of CD offset should be 0xffffffff */ assertEqualMem(eocd + 16, "\xff\xff\xff\xff", 4); @@ -450,8 +455,8 @@ DEFINE_TEST(test_write_format_zip_large) assertEqualMem(zip64_eocd + 14, "\055\0", 2); // Requires version: 45 assertEqualMem(zip64_eocd + 16, "\0\0\0\0", 4); // This disk assertEqualMem(zip64_eocd + 20, "\0\0\0\0", 4); // Total disks - assertEqualInt(17, le64(zip64_eocd + 24)); // Entries on this disk - assertEqualInt(17, le64(zip64_eocd + 32)); // Total entries + assertEqualInt(8, le64(zip64_eocd + 24)); // Entries on this disk + assertEqualInt(8, le64(zip64_eocd + 32)); // Total entries cd_size = le64(zip64_eocd + 40); cd_start = p - (fileblocks->filesize - le64(zip64_eocd + 48)); diff --git a/libarchive/test/test_write_format_zip_stream.c b/libarchive/test/test_write_format_zip_stream.c new file mode 100644 index 000000000000..aff6a31ae171 --- /dev/null +++ b/libarchive/test/test_write_format_zip_stream.c @@ -0,0 +1,247 @@ +/*- + * Copyright (c) 2003-2023 Tim Kientzle + * Copyright (c) 2008 Anselm Strauss + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test.h" + +/* + * Detailed byte-for-byte verification of the format of a zip archive + * written in streaming mode WITHOUT Zip64 extensions enabled. + */ + +static unsigned long +bitcrc32(unsigned long c, void *_p, size_t s) +{ + /* This is a drop-in replacement for crc32() from zlib. + * Libarchive should be able to correctly generate + * uncompressed zip archives (including correct CRCs) even + * when zlib is unavailable, and this function helps us verify + * that. Yes, this is very, very slow and unsuitable for + * production use, but it's correct, compact, and works well + * enough for this particular usage. Libarchive internally + * uses a much more efficient implementation. */ + const unsigned char *p = _p; + int bitctr; + + if (p == NULL) + return (0); + + for (; s > 0; --s) { + c ^= *p++; + for (bitctr = 8; bitctr > 0; --bitctr) { + if (c & 1) c = (c >> 1); + else c = (c >> 1) ^ 0xedb88320; + c ^= 0x80000000; + } + } + return (c); +} + +/* Quick and dirty: Read 2-byte and 4-byte integers from Zip file. */ +static unsigned i2(const unsigned char *p) { return ((p[0] & 0xff) | ((p[1] & 0xff) << 8)); } +static unsigned i4(const unsigned char *p) { return (i2(p) | (i2(p + 2) << 16)); } + +DEFINE_TEST(test_write_format_zip_stream) +{ + struct archive *a; + struct archive_entry *ae; + size_t used, buffsize = 1000000; + unsigned long crc; + unsigned long compressed_size = 0; + int file_perm = 00644; + int zip_version = 20; + int zip_compression = 8; + short file_uid = 10, file_gid = 20; + unsigned char *buff, *buffend, *p; + unsigned char *central_header, *local_header, *eocd, *eocd_record; + unsigned char *extension_start, *extension_end; + unsigned char *data_start, *data_end; + char file_data[] = {'1', '2', '3', '4', '5', '6', '7', '8'}; + const char *file_name = "file"; + +#ifndef HAVE_ZLIB_H + zip_compression = 0; +#endif + + buff = malloc(buffsize); + + /* Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:!zip64")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_open_memory(a, buff, buffsize, &used)); + + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, file_name); + archive_entry_set_mode(ae, AE_IFREG | file_perm); + archive_entry_set_uid(ae, file_uid); + archive_entry_set_gid(ae, file_gid); + archive_entry_set_mtime(ae, 0, 0); + assertEqualInt(0, archive_write_header(a, ae)); + archive_entry_free(ae); + assertEqualInt(8, archive_write_data(a, file_data, sizeof(file_data))); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_free(a)); + buffend = buff + used; + dumpfile("constructed.zip", buff, used); + + /* Verify "End of Central Directory" record. */ + /* Get address of end-of-central-directory record. */ + eocd_record = p = buffend - 22; /* Assumes there is no zip comment field. */ + failure("End-of-central-directory begins with PK\\005\\006 signature"); + assertEqualMem(p, "PK\005\006", 4); + failure("This must be disk 0"); + assertEqualInt(i2(p + 4), 0); + failure("Central dir must start on disk 0"); + assertEqualInt(i2(p + 6), 0); + failure("All central dir entries are on this disk"); + assertEqualInt(i2(p + 8), i2(p + 10)); + eocd = buff + i4(p + 12) + i4(p + 16); + failure("no zip comment"); + assertEqualInt(i2(p + 20), 0); + + /* Get address of first entry in central directory. */ + central_header = p = buff + i4(buffend - 6); + failure("Central file record at offset %d should begin with" + " PK\\001\\002 signature", + i4(buffend - 10)); + + /* Verify file entry in central directory. */ + assertEqualMem(p, "PK\001\002", 4); /* Signature */ + assertEqualInt(i2(p + 4), 3 * 256 + zip_version); /* Version made by */ + assertEqualInt(i2(p + 6), zip_version); /* Version needed to extract */ + assertEqualInt(i2(p + 8), 8); /* Flags */ + assertEqualInt(i2(p + 10), zip_compression); /* Compression method */ + assertEqualInt(i2(p + 12), 0); /* File time */ + assertEqualInt(i2(p + 14), 33); /* File date */ + crc = bitcrc32(0, file_data, sizeof(file_data)); + assertEqualInt(i4(p + 16), crc); /* CRC-32 */ + compressed_size = i4(p + 20); /* Compressed size */ + assertEqualInt(i4(p + 24), sizeof(file_data)); /* Uncompressed size */ + assertEqualInt(i2(p + 28), strlen(file_name)); /* Pathname length */ + /* assertEqualInt(i2(p + 30), 28); */ /* Extra field length: See below */ + assertEqualInt(i2(p + 32), 0); /* File comment length */ + assertEqualInt(i2(p + 34), 0); /* Disk number start */ + assertEqualInt(i2(p + 36), 0); /* Internal file attrs */ + assertEqualInt(i4(p + 38) >> 16 & 01777, file_perm); /* External file attrs */ + assertEqualInt(i4(p + 42), 0); /* Offset of local header */ + assertEqualMem(p + 46, file_name, strlen(file_name)); /* Pathname */ + p = extension_start = central_header + 46 + strlen(file_name); + extension_end = extension_start + i2(central_header + 30); + + assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2(p + 2), 11); /* 'ux' size */ + assertEqualInt(p[4], 1); /* 'ux' version */ + assertEqualInt(p[5], 4); /* 'ux' uid size */ + assertEqualInt(i4(p + 6), file_uid); /* 'Ux' UID */ + assertEqualInt(p[10], 4); /* 'ux' gid size */ + assertEqualInt(i4(p + 11), file_gid); /* 'Ux' GID */ + p += 4 + i2(p + 2); + + assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4(p + 5), 0); /* 'UT' mtime */ + p += 4 + i2(p + 2); + + /* Note: We don't expect to see zip64 extension in the central + * directory, since the writer knows the actual full size by + * the time it is ready to write the central directory and has + * no reason to insert it then. Info-Zip seems to do the same + * thing. */ + + /* Just in case: Report any extra extensions. */ + while (p < extension_end) { + failure("Unexpected extension 0x%04X", i2(p)); + assert(0); + p += 4 + i2(p + 2); + } + + /* Should have run exactly to end of extra data. */ + assert(p == extension_end); + + assert(p == eocd); + assert(p == eocd_record); + + /* Verify local header of file entry. */ + p = local_header = buff; + assertEqualMem(p, "PK\003\004", 4); /* Signature */ + assertEqualInt(i2(p + 4), zip_version); /* Version needed to extract */ + assertEqualInt(i2(p + 6), 8); /* Flags */ + assertEqualInt(i2(p + 8), zip_compression); /* Compression method */ + assertEqualInt(i2(p + 10), 0); /* File time */ + assertEqualInt(i2(p + 12), 33); /* File date */ + assertEqualInt(i4(p + 14), 0); /* CRC-32 */ + assertEqualInt(i4(p + 18), 0); /* Compressed size */ + assertEqualInt(i4(p + 22), 0); /* Uncompressed size */ + assertEqualInt(i2(p + 26), strlen(file_name)); /* Pathname length */ + assertEqualInt(i2(p + 28), 24); /* Extra field length */ + assertEqualMem(p + 30, file_name, strlen(file_name)); /* Pathname */ + p = extension_start = local_header + 30 + strlen(file_name); + extension_end = extension_start + i2(local_header + 28); + + assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2(p + 2), 11); /* 'ux' size */ + assertEqualInt(p[4], 1); /* 'ux' version */ + assertEqualInt(p[5], 4); /* 'ux' uid size */ + assertEqualInt(i4(p + 6), file_uid); /* 'Ux' UID */ + assertEqualInt(p[10], 4); /* 'ux' gid size */ + assertEqualInt(i4(p + 11), file_gid); /* 'Ux' GID */ + p += 4 + i2(p + 2); + + assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4(p + 5), 0); /* 'UT' mtime */ + p += 4 + i2(p + 2); + + /* Just in case: Report any extra extensions. */ + while (p < extension_end) { + failure("Unexpected extension 0x%04X", i2(p)); + assert(0); + p += 4 + i2(p + 2); + } + + /* Should have run exactly to end of extra data. */ + assert(p == extension_end); + data_start = p; + + /* Data descriptor should follow compressed data. */ + while (p < central_header && memcmp(p, "PK\007\010", 4) != 0) + ++p; + data_end = p; + assertEqualInt(data_end - data_start, compressed_size); + assertEqualMem(p, "PK\007\010", 4); + assertEqualInt(i4(p + 4), crc); /* CRC-32 */ + assertEqualInt(i4(p + 8), compressed_size); /* compressed size */ + assertEqualInt(i4(p + 12), sizeof(file_data)); /* uncompressed size */ + + /* Central directory should immediately follow the data descriptor. */ + assert(p + 16 == central_header); + + free(buff); +} diff --git a/libarchive/test/test_write_format_zip_zip64.c b/libarchive/test/test_write_format_zip_zip64.c index c5f00a2e5d8d..259cdc47d3ae 100644 --- a/libarchive/test/test_write_format_zip_zip64.c +++ b/libarchive/test/test_write_format_zip_zip64.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); static void verify_zip_filesize(uint64_t size, int expected) diff --git a/libarchive/test/test_write_open_memory.c b/libarchive/test/test_write_open_memory.c index 3dbed113e799..2ebe01e413e6 100644 --- a/libarchive/test/test_write_open_memory.c +++ b/libarchive/test/test_write_open_memory.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_open_memory.c 189308 2009-03-03 17:02:51Z kientzle $"); /* Try to force archive_write_open_memory.c to write past the end of an array. */ static unsigned char buff[16384]; diff --git a/libarchive/test/test_write_read_format_zip.c b/libarchive/test/test_write_read_format_zip.c index 4f39489b5b53..828b092c7b3f 100644 --- a/libarchive/test/test_write_read_format_zip.c +++ b/libarchive/test/test_write_read_format_zip.c @@ -29,7 +29,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_zip.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * These tests verify that our reader can read files @@ -288,8 +287,12 @@ verify_contents(struct archive *a, int seeking, int improved_streaming) if (seeking || improved_streaming) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); } - assertEqualInt(8, archive_entry_size(ae)); - assert(archive_entry_size_is_set(ae)); + if (seeking) { + assertEqualInt(8, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } assertEqualIntA(a, 8, archive_read_data(a, filedata, sizeof(filedata))); assertEqualMem(filedata, "12345678", 8); @@ -305,8 +308,12 @@ verify_contents(struct archive *a, int seeking, int improved_streaming) if (seeking || improved_streaming) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); } - assertEqualInt(4, archive_entry_size(ae)); - assert(archive_entry_size_is_set(ae)); + if (seeking) { + assertEqualInt(4, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } assertEqualIntA(a, 4, archive_read_data(a, filedata, sizeof(filedata))); assertEqualMem(filedata, "1234", 4); @@ -323,6 +330,7 @@ verify_contents(struct archive *a, int seeking, int improved_streaming) } if (seeking) { assertEqualInt(5, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); } else { assertEqualInt(0, archive_entry_size_is_set(ae)); } @@ -356,8 +364,9 @@ verify_contents(struct archive *a, int seeking, int improved_streaming) assertEqualInt(0, archive_entry_atime(ae)); assertEqualInt(0, archive_entry_ctime(ae)); assertEqualString("dir/", archive_entry_pathname(ae)); - if (seeking || improved_streaming) + if (seeking || improved_streaming) { assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae)); + } assertEqualInt(0, archive_entry_size(ae)); assert(archive_entry_size_is_set(ae)); assertEqualIntA(a, 0, archive_read_data(a, filedata, 10)); @@ -378,8 +387,12 @@ verify_contents(struct archive *a, int seeking, int improved_streaming) if (seeking || improved_streaming) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); } - assertEqualInt(8, archive_entry_size(ae)); - assert(archive_entry_size_is_set(ae)); + if (seeking) { + assertEqualInt(8, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } assertEqualIntA(a, 8, archive_read_data(a, filedata, sizeof(filedata))); assertEqualMem(filedata, "12345678", 8); @@ -395,8 +408,12 @@ verify_contents(struct archive *a, int seeking, int improved_streaming) if (seeking || improved_streaming) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); } - assertEqualInt(4, archive_entry_size(ae)); - assert(archive_entry_size_is_set(ae)); + if (seeking) { + assertEqualInt(4, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } assertEqualIntA(a, 4, archive_read_data(a, filedata, sizeof(filedata))); assertEqualMem(filedata, "1234", 4); @@ -413,6 +430,7 @@ verify_contents(struct archive *a, int seeking, int improved_streaming) } if (seeking) { assertEqualInt(5, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); } else { assertEqualInt(0, archive_entry_size_is_set(ae)); } @@ -468,9 +486,12 @@ verify_contents(struct archive *a, int seeking, int improved_streaming) if (seeking || improved_streaming) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); } - assert(archive_entry_size_is_set(ae)); - assert(archive_entry_size_is_set(ae)); - assertEqualInt(8, archive_entry_size(ae)); + if (seeking) { + assert(archive_entry_size_is_set(ae)); + assertEqualInt(8, archive_entry_size(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } assertEqualIntA(a, 8, archive_read_data(a, filedata, sizeof(filedata))); assertEqualMem(filedata, "12345678", 8); @@ -486,8 +507,12 @@ verify_contents(struct archive *a, int seeking, int improved_streaming) if (seeking || improved_streaming) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); } - assertEqualInt(4, archive_entry_size(ae)); - assert(archive_entry_size_is_set(ae)); + if (seeking) { + assertEqualInt(4, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } assertEqualIntA(a, 4, archive_read_data(a, filedata, sizeof(filedata))); assertEqualMem(filedata, "ACEG", 4); @@ -503,6 +528,7 @@ verify_contents(struct archive *a, int seeking, int improved_streaming) assertEqualInt(AE_IFREG | 0621, archive_entry_mode(ae)); if (seeking) { assertEqualInt(5, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); } else { assertEqualInt(0, archive_entry_size_is_set(ae)); } diff --git a/libarchive/test/test_xattr_platform.c b/libarchive/test/test_xattr_platform.c index df3f81a5b3fd..3f16cac34154 100644 --- a/libarchive/test/test_xattr_platform.c +++ b/libarchive/test/test_xattr_platform.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_xattr_platform) { diff --git a/libarchive/test/test_zip_filename_encoding.c b/libarchive/test/test_zip_filename_encoding.c index 54cd00630b8e..448fb9b1d4ef 100644 --- a/libarchive/test/test_zip_filename_encoding.c +++ b/libarchive/test/test_zip_filename_encoding.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #include <locale.h> @@ -71,7 +70,9 @@ DEFINE_TEST(test_zip_filename_encoding_UTF8) /* * Verify that UTF-8 filenames are correctly stored without * hdrcharset=UTF-8 option. + * Skip on Windows where we default to OEMCP */ +#if !defined(_WIN32) || defined(__CYGWIN__) a = archive_write_new(); assertEqualInt(ARCHIVE_OK, archive_write_set_format_zip(a)); assertEqualInt(ARCHIVE_OK, @@ -90,6 +91,7 @@ DEFINE_TEST(test_zip_filename_encoding_UTF8) * which indicates the filename charset is UTF-8. */ assertEqualInt(0x08, buff[7]); assertEqualMem(buff + 30, "\xD0\xBF\xD1\x80\xD0\xB8", 6); +#endif /* * Verify that A bit 11 of general purpose flag is not set diff --git a/libarchive/xxhash.c b/libarchive/xxhash.c index f96e9d93493e..beacd2391221 100644 --- a/libarchive/xxhash.c +++ b/libarchive/xxhash.c @@ -149,6 +149,10 @@ typedef struct _U32_S { U32 v; } _PACKED U32_S; #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) diff --git a/libarchive_fe/err.c b/libarchive_fe/err.c index 8c860350bc3e..f6dcf44af347 100644 --- a/libarchive_fe/err.c +++ b/libarchive_fe/err.c @@ -25,8 +25,6 @@ */ #include "lafe_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_STDARG_H #include <stdarg.h> #endif diff --git a/libarchive_fe/err.h b/libarchive_fe/err.h index c663103b0b44..bd9281539693 100644 --- a/libarchive_fe/err.h +++ b/libarchive_fe/err.h @@ -27,10 +27,12 @@ #define LAFE_ERR_H #if defined(__GNUC__) && (__GNUC__ > 2 || \ - (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) -#define __LA_DEAD __attribute__((__noreturn__)) + (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) +#define __LA_NORETURN __attribute__((__noreturn__)) +#elif defined(_MSC_VER) +#define __LA_NORETURN __declspec(noreturn) #else -#define __LA_DEAD +#define __LA_NORETURN #endif #if defined(__GNUC__) && (__GNUC__ > 2 || \ @@ -46,8 +48,7 @@ #endif void lafe_warnc(int code, const char *fmt, ...) __LA_PRINTFLIKE(2, 3); -void lafe_errc(int eval, int code, const char *fmt, ...) __LA_DEAD - __LA_PRINTFLIKE(3, 4); +__LA_NORETURN void lafe_errc(int eval, int code, const char *fmt, ...) __LA_PRINTFLIKE(3, 4); const char * lafe_getprogname(void); void lafe_setprogname(const char *name, const char *defaultname); diff --git a/libarchive_fe/lafe_platform.h b/libarchive_fe/lafe_platform.h index 557124b9f841..6de8f898a22f 100644 --- a/libarchive_fe/lafe_platform.h +++ b/libarchive_fe/lafe_platform.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/usr.bin/cpio/cpio_platform.h,v 1.2 2008/12/06 07:15:42 kientzle Exp $ */ /* @@ -42,14 +40,4 @@ #include "config.h" #endif -/* Get a real definition for __FBSDID if we can */ -#if HAVE_SYS_CDEFS_H -#include <sys/cdefs.h> -#endif - -/* If not, define it so as to avoid dangling semicolons. */ -#ifndef __FBSDID -#define __FBSDID(a) struct _undefined_hack -#endif - #endif diff --git a/libarchive_fe/line_reader.c b/libarchive_fe/line_reader.c index c7c4694eeb82..7f0429ece3cf 100644 --- a/libarchive_fe/line_reader.c +++ b/libarchive_fe/line_reader.c @@ -26,8 +26,6 @@ */ #include "lafe_platform.h" -__FBSDID("$FreeBSD$"); - #include <errno.h> #include <stdio.h> #include <stdlib.h> diff --git a/libarchive_fe/passphrase.c b/libarchive_fe/passphrase.c index edf72d147182..9d95d527067b 100644 --- a/libarchive_fe/passphrase.c +++ b/libarchive_fe/passphrase.c @@ -50,8 +50,6 @@ #include "lafe_platform.h" -__FBSDID("$FreeBSD$"); - #include <errno.h> #ifdef HAVE_STDLIB_H #include <stdlib.h> @@ -171,8 +169,10 @@ readpassphrase(const char *prompt, char *buf, size_t bufsiz, int flags) int input, output, save_errno, i, need_restart; char ch, *p, *end; struct termios term, oterm; +#ifdef HAVE_SIGACTION struct sigaction sa, savealrm, saveint, savehup, savequit, saveterm; struct sigaction savetstp, savettin, savettou, savepipe; +#endif /* I suppose we could alloc on demand in this case (XXX). */ if (bufsiz == 0) { @@ -221,6 +221,7 @@ restart: oterm.c_lflag |= ECHO; } +#ifdef HAVE_SIGACTION /* * Catch signals that would otherwise cause the user to end * up with echo turned off in the shell. Don't worry about @@ -239,6 +240,7 @@ restart: (void)sigaction(SIGTSTP, &sa, &savetstp); (void)sigaction(SIGTTIN, &sa, &savettin); (void)sigaction(SIGTTOU, &sa, &savettou); +#endif if (!(flags & RPP_STDIN)) { int r = write(output, prompt, strlen(prompt)); @@ -276,6 +278,7 @@ restart: continue; signo[SIGTTOU] = sigttou; } +#ifdef HAVE_SIGACTION (void)sigaction(SIGALRM, &savealrm, NULL); (void)sigaction(SIGHUP, &savehup, NULL); (void)sigaction(SIGINT, &saveint, NULL); @@ -285,6 +288,7 @@ restart: (void)sigaction(SIGTSTP, &savetstp, NULL); (void)sigaction(SIGTTIN, &savettin, NULL); (void)sigaction(SIGTTOU, &savettou, NULL); +#endif if (input != STDIN_FILENO) (void)close(input); @@ -325,7 +329,7 @@ lafe_readpassphrase(const char *prompt, char *buf, size_t bufsiz) break; default: lafe_errc(1, errno, "Couldn't read passphrase"); - break; + /* NOTREACHED */ } } return (p); diff --git a/tar/bsdtar.1 b/tar/bsdtar.1 index 63774216bd86..e570d2a48a01 100644 --- a/tar/bsdtar.1 +++ b/tar/bsdtar.1 @@ -23,9 +23,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" -.Dd January 31, 2020 +.Dd March 1, 2024 .Dt TAR 1 .Os .Sh NAME @@ -274,6 +272,15 @@ will be used instead. On create, this sets the group name that will be stored in the archive; the name will not be verified against the system group database. +.It Fl Fl group Ar name Ns Op : Ns Ar gid +Use the provided group, if +.Ar gid +is not provided, +.Ar name +can be either a group name or numeric id. +See the +.Fl Fl gname +option for details. .It Fl H (c and r modes only) Symbolic links named on the command line will be followed; the @@ -403,6 +410,8 @@ This is the reverse of and the default behavior in c, r, and u modes or if .Nm is run in x mode as root. +Currently supported only for pax formats +(including "pax restricted", the default tar format for bsdtar.) .It Fl n , Fl Fl norecurse , Fl Fl no-recursion Do not operate recursively on the content of directories. .It Fl Fl newer Ar date @@ -643,6 +652,59 @@ Specify the number of worker threads to use. Setting threads to a special value 0 makes .Xr zstd 1 use as many threads as there are CPU cores on the system. +.It Cm zstd:frame-per-file +Start a new compression frame at the beginning of each file in the +archive. +.It Cm zstd:min-frame-in Ns = Ns Ar N +In combination with +.Cm zstd:frame-per-file , +do not start a new compression frame unless the uncompressed size of +the current frame is at least +.Ar N +bytes. +The number may be followed by +.Li k / Li kB , +.Li M / Li MB , +or +.Li G / Li GB +to indicate kilobytes, megabytes or gigabytes respectively. +.It Cm zstd:min-frame-out Ns = Ns Ar N , Cm zstd:min-frame-size Ns = Ns Ar N +In combination with +.Cm zstd:frame-per-file , +do not start a new compression frame unless the compressed size of the +current frame is at least +.Ar N +bytes. +The number may be followed by +.Li k / Li kB , +.Li M / Li MB , +or +.Li G / Li GB +to indicate kilobytes, megabytes or gigabytes respectively. +.It Cm zstd:max-frame-in Ns = Ns Ar N , Cm zstd:max-frame-size Ns = Ns Ar N +Start a new compression frame as soon as possible after the +uncompressed size of the current frame exceeds +.Ar N +bytes. +The number may be followed by +.Li k / Li kB , +.Li M / Li MB , +or +.Li G / Li GB +to indicate kilobytes, megabytes or gigabytes respectively. +Values less than 1,024 will be rejected. +.It Cm zstd:max-frame-out Ns = Ns Ar N +Start a new compression frame as soon as possible after the compressed +size of the current frame exceeds +.Ar N +bytes. +The number may be followed by +.Li k / Li kB , +.Li M / Li MB , +or +.Li G / Li GB +to indicate kilobytes, megabytes or gigabytes respectively. +Values less than 1,024 will be rejected. .It Cm lzop:compression-level A decimal integer from 1 to 9 specifying the lzop compression level. .It Cm xz:compression-level @@ -761,7 +823,7 @@ This works similar to the conv=sparse option of dd. Modify file or archive member names according to .Pa pattern . The pattern has the format -.Ar /old/new/ Ns Op ghHprRsS +.Ar /old/new/ Ns Op bghHprRsS where .Ar old is a basic regular expression, @@ -783,6 +845,9 @@ of symbolic links. The optional trailing p specifies that after a successful substitution the original path name and the new path name should be printed to standard error. +The optional trailing b specifies that the substitution should be +matched from the beginning of the string rather than from right after the +position at which the previous matching substitution ended. Optional trailing H, R, or S characters suppress substitutions for hardlink targets, regular filenames, or symlink targets, respectively. @@ -888,6 +953,15 @@ the name is not verified against the system user database. Pipe the input (in x or t mode) or the output (in c mode) through .Pa program instead of using the builtin compression support. +.It Fl Fl owner Ar name Ns Op : Ns Ar uid +Use the provided user, if +.Ar uid +is not provided, +.Ar name +can be either an username or numeric id. +See the +.Fl Fl uname +option for details. .It Fl v , Fl Fl verbose Produce verbose output. In create and extract modes, @@ -953,7 +1027,7 @@ archives. .Sh ENVIRONMENT The following environment variables affect the execution of .Nm : -.Bl -tag -width ".Ev BLOCKSIZE" +.Bl -tag -width indent .It Ev TAR_READER_OPTIONS The default options for format readers and compression readers. The diff --git a/tar/bsdtar.c b/tar/bsdtar.c index 75249d1052c3..b070e0faeb66 100644 --- a/tar/bsdtar.c +++ b/tar/bsdtar.c @@ -24,7 +24,6 @@ */ #include "bsdtar_platform.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/bsdtar.c,v 1.93 2008/11/08 04:43:24 kientzle Exp $"); #ifdef HAVE_SYS_PARAM_H #include <sys/param.h> @@ -114,11 +113,11 @@ need_report(void) } #endif -static void long_help(void) __LA_DEAD; +static __LA_NORETURN void long_help(void); static void only_mode(struct bsdtar *, const char *opt, const char *valid); static void set_mode(struct bsdtar *, char opt); -static void version(void) __LA_DEAD; +static __LA_NORETURN void version(void); /* A basic set of security flags to request from libarchive. */ #define SECURITY \ @@ -155,7 +154,7 @@ main(int argc, char **argv) char compression, compression2; const char *compression_name, *compression2_name; const char *compress_program; - char *tptr; + char *tptr, *uptr; char possible_help_request; char buff[16]; @@ -382,6 +381,36 @@ main(int argc, char **argv) case OPTION_GNAME: /* cpio */ bsdtar->gname = bsdtar->argument; break; + case OPTION_GROUP: /* GNU tar */ + errno = 0; + tptr = NULL; + + uptr = strchr(bsdtar->argument, ':'); + if(uptr != NULL) { + if(uptr[1] == 0) { + lafe_errc(1, 0, "Invalid argument to --group (missing id after :)"); + } + uptr[0] = 0; + uptr++; + t = (int)strtol(uptr, &tptr, 10); + if (errno || t < 0 || *uptr == '\0' || + tptr == NULL || *tptr != '\0') { + lafe_errc(1, 0, "Invalid argument to --group (%s is not a number)", uptr); + } else { + bsdtar->gid = t; + } + bsdtar->gname = bsdtar->argument; + } else { + t = (int)strtol(bsdtar->argument, &tptr, 10); + if (errno || t < 0 || *(bsdtar->argument) == '\0' || + tptr == NULL || *tptr != '\0') { + bsdtar->gname = bsdtar->argument; + } else { + bsdtar->gid = t; + bsdtar->gname = ""; + } + } + break; case OPTION_GRZIP: if (compression != '\0') lafe_errc(1, 0, @@ -400,8 +429,7 @@ main(int argc, char **argv) break; case OPTION_HELP: /* GNU tar, others */ long_help(); - exit(0); - break; + /* NOTREACHED*/ case OPTION_HFS_COMPRESSION: /* Mac OS X v10.6 or later */ bsdtar->extract_flags |= ARCHIVE_EXTRACT_HFS_COMPRESSION_FORCED; @@ -626,8 +654,43 @@ main(int argc, char **argv) ARCHIVE_READDISK_NO_TRAVERSE_MOUNTS; break; case OPTION_OPTIONS: + if (bsdtar->option_options != NULL) { + lafe_warnc(0, + "Ignoring previous option '%s', separate multiple options with commas", + bsdtar->option_options); + } bsdtar->option_options = bsdtar->argument; break; + case OPTION_OWNER: /* GNU tar */ + errno = 0; + tptr = NULL; + + uptr = strchr(bsdtar->argument, ':'); + if(uptr != NULL) { + if(uptr[1] == 0) { + lafe_errc(1, 0, "Invalid argument to --owner (missing id after :)"); + } + uptr[0] = 0; + uptr++; + t = (int)strtol(uptr, &tptr, 10); + if (errno || t < 0 || *uptr == '\0' || + tptr == NULL || *tptr != '\0') { + lafe_errc(1, 0, "Invalid argument to --owner (%s is not a number)", uptr); + } else { + bsdtar->uid = t; + } + bsdtar->uname = bsdtar->argument; + } else { + t = (int)strtol(bsdtar->argument, &tptr, 10); + if (errno || t < 0 || *(bsdtar->argument) == '\0' || + tptr == NULL || *tptr != '\0') { + bsdtar->uname = bsdtar->argument; + } else { + bsdtar->uid = t; + bsdtar->uname = ""; + } + } + break; #if 0 /* * The common BSD -P option is not necessary, since @@ -670,7 +733,7 @@ main(int argc, char **argv) bsdtar->extract_flags |= ARCHIVE_EXTRACT_SPARSE; break; case 's': /* NetBSD pax-as-tar */ -#if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) +#if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) || defined(HAVE_PCRE2POSIX_H) add_substitution(bsdtar, bsdtar->argument); #else lafe_warnc(0, @@ -738,7 +801,7 @@ main(int argc, char **argv) break; case OPTION_VERSION: /* GNU convention */ version(); - break; + /* NOTREACHED */ #if 0 /* * The -W longopt feature is handled inside of @@ -804,7 +867,6 @@ main(int argc, char **argv) /* If no "real" mode was specified, treat -h as --help. */ if ((bsdtar->mode == '\0') && possible_help_request) { long_help(); - exit(0); } /* Otherwise, a mode is required. */ @@ -950,7 +1012,7 @@ main(int argc, char **argv) } archive_match_free(bsdtar->matching); -#if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) +#if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) || defined(HAVE_PCRE2POSIX_H) cleanup_substitution(bsdtar); #endif cset_free(bsdtar->cset); diff --git a/tar/bsdtar.h b/tar/bsdtar.h index 8f9f79ab176e..22056c7920c4 100644 --- a/tar/bsdtar.h +++ b/tar/bsdtar.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/usr.bin/tar/bsdtar.h,v 1.37 2008/12/06 07:37:14 kientzle Exp $ */ #ifndef BSDTAR_H_INCLUDED @@ -145,6 +143,7 @@ enum { OPTION_FORMAT, OPTION_GID, OPTION_GNAME, + OPTION_GROUP, OPTION_GRZIP, OPTION_HELP, OPTION_HFS_COMPRESSION, @@ -179,6 +178,7 @@ enum { OPTION_OLDER_MTIME_THAN, OPTION_ONE_FILE_SYSTEM, OPTION_OPTIONS, + OPTION_OWNER, OPTION_PASSPHRASE, OPTION_POSIX, OPTION_READ_SPARSE, @@ -208,10 +208,10 @@ void tar_mode_r(struct bsdtar *bsdtar); void tar_mode_t(struct bsdtar *bsdtar); void tar_mode_u(struct bsdtar *bsdtar); void tar_mode_x(struct bsdtar *bsdtar); -void usage(void) __LA_DEAD; +__LA_NORETURN void usage(void); int yes(const char *fmt, ...) __LA_PRINTF(1, 2); -#if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) +#if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) || defined(HAVE_PCRE2POSIX_H) void add_substitution(struct bsdtar *, const char *); int apply_substitution(struct bsdtar *, const char *, char **, int, int); void cleanup_substitution(struct bsdtar *); diff --git a/tar/bsdtar_platform.h b/tar/bsdtar_platform.h index e73f9828b3b0..a4f37d95e9b3 100644 --- a/tar/bsdtar_platform.h +++ b/tar/bsdtar_platform.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/usr.bin/tar/bsdtar_platform.h,v 1.26 2008/12/06 07:37:14 kientzle Exp $ */ /* @@ -46,16 +44,6 @@ #include "bsdtar_windows.h" #endif -/* Get a real definition for __FBSDID if we can */ -#if HAVE_SYS_CDEFS_H -#include <sys/cdefs.h> -#endif - -/* If not, define it so as to avoid dangling semicolons. */ -#ifndef __FBSDID -#define __FBSDID(a) struct _undefined_hack -#endif - #ifdef HAVE_LIBARCHIVE /* If we're using the platform libarchive, include system headers. */ #include <archive.h> @@ -121,12 +109,14 @@ /* How to mark functions that don't return. */ /* This facilitates use of some newer static code analysis tools. */ -#undef __LA_DEAD +#undef __LA_NORETURN #if defined(__GNUC__) && (__GNUC__ > 2 || \ - (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) -#define __LA_DEAD __attribute__((__noreturn__)) -#else -#define __LA_DEAD + (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) +#define __LA_NORETURN __attribute__((__noreturn__)) +#elif defined(_MSC_VER) +#define __LA_NORETURN __declspec(noreturn) +#else +#define __LA_NORETURN #endif #endif /* !BSDTAR_PLATFORM_H_INCLUDED */ diff --git a/tar/bsdtar_windows.c b/tar/bsdtar_windows.c index 41ce6eb78c8b..b40fea776d2e 100644 --- a/tar/bsdtar_windows.c +++ b/tar/bsdtar_windows.c @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #if defined(_WIN32) && !defined(__CYGWIN__) diff --git a/tar/bsdtar_windows.h b/tar/bsdtar_windows.h index 308ad1107bef..7ca649c2587e 100644 --- a/tar/bsdtar_windows.h +++ b/tar/bsdtar_windows.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #ifndef BSDTAR_WINDOWS_H diff --git a/tar/cmdline.c b/tar/cmdline.c index d49e5b0d16e7..72292e8f27f3 100644 --- a/tar/cmdline.c +++ b/tar/cmdline.c @@ -28,7 +28,6 @@ */ #include "bsdtar_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include <errno.h> @@ -94,6 +93,7 @@ static const struct bsdtar_option { { "format", 1, OPTION_FORMAT }, { "gid", 1, OPTION_GID }, { "gname", 1, OPTION_GNAME }, + { "group", 1, OPTION_GROUP }, { "grzip", 0, OPTION_GRZIP }, { "gunzip", 0, 'z' }, { "gzip", 0, 'z' }, @@ -142,6 +142,7 @@ static const struct bsdtar_option { { "older-than", 1, OPTION_OLDER_CTIME_THAN }, { "one-file-system", 0, OPTION_ONE_FILE_SYSTEM }, { "options", 1, OPTION_OPTIONS }, + { "owner", 1, OPTION_OWNER }, { "passphrase", 1, OPTION_PASSPHRASE }, { "posix", 0, OPTION_POSIX }, { "preserve-permissions", 0, 'p' }, diff --git a/tar/config_freebsd.h b/tar/config_freebsd.h index 37aa9dcae172..761f71cfbeca 100644 --- a/tar/config_freebsd.h +++ b/tar/config_freebsd.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/usr.bin/tar/config_freebsd.h,v 1.8 2008/11/29 20:06:53 kientzle Exp $ */ /* A default configuration for FreeBSD, used if there is no config.h. */ diff --git a/tar/creation_set.c b/tar/creation_set.c index cfc5a642aed3..5cd1232b764c 100644 --- a/tar/creation_set.c +++ b/tar/creation_set.c @@ -24,7 +24,6 @@ */ #include "bsdtar_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_STDLIB_H #include <stdlib.h> diff --git a/tar/read.c b/tar/read.c index b9599661967c..a7f14a07bb35 100644 --- a/tar/read.c +++ b/tar/read.c @@ -24,7 +24,6 @@ */ #include "bsdtar_platform.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/read.c,v 1.40 2008/08/21 06:41:14 kientzle Exp $"); #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> @@ -372,8 +371,9 @@ read_archive(struct bsdtar *bsdtar, char mode, struct archive *writer) if (r != ARCHIVE_OK) { if (!bsdtar->verbose) safe_fprintf(stderr, "%s", archive_entry_pathname(entry)); - fprintf(stderr, ": %s: ", archive_error_string(a)); - fprintf(stderr, "%s", strerror(errno)); + safe_fprintf(stderr, ": %s: %s", + archive_error_string(a), + strerror(archive_errno(a))); if (!bsdtar->verbose) fprintf(stderr, "\n"); bsdtar->return_value = 1; diff --git a/tar/subst.c b/tar/subst.c index 39c54acfd14f..9747abb906c4 100644 --- a/tar/subst.c +++ b/tar/subst.c @@ -24,14 +24,15 @@ */ #include "bsdtar_platform.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/subst.c,v 1.4 2008/06/15 10:08:16 kientzle Exp $"); -#if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) +#if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) || defined(HAVE_PCRE2POSIX_H) #include "bsdtar.h" #include <errno.h> -#ifdef HAVE_PCREPOSIX_H +#if defined(HAVE_PCREPOSIX_H) #include <pcreposix.h> +#elif defined(HAVE_PCRE2POSIX_H) +#include <pcre2posix.h> #else #include <regex.h> #endif @@ -48,7 +49,7 @@ struct subst_rule { struct subst_rule *next; regex_t re; char *result; - unsigned int global:1, print:1, regular:1, symlink:1, hardlink:1; + unsigned int global:1, print:1, regular:1, symlink:1, hardlink:1, from_begin:1; }; struct substitution { @@ -128,9 +129,14 @@ add_substitution(struct bsdtar *bsdtar, const char *rule_text) rule->regular = 1; /* Rewrite regular filenames. */ rule->symlink = 1; /* Rewrite symlink targets. */ rule->hardlink = 1; /* Rewrite hardlink targets. */ + rule->from_begin = 0; /* Don't match from start. */ while (*++end_pattern) { switch (*end_pattern) { + case 'b': + case 'B': + rule->from_begin = 1; + break; case 'g': case 'G': rule->global = 1; @@ -159,6 +165,7 @@ add_substitution(struct bsdtar *bsdtar, const char *rule_text) break; default: lafe_errc(1, 0, "Invalid replacement flag %c", *end_pattern); + /* NOTREACHED */ } } } @@ -212,6 +219,7 @@ apply_substitution(struct bsdtar *bsdtar, const char *name, char **result, { const char *path = name; regmatch_t matches[10]; + char* buffer = NULL; size_t i, j; struct subst_rule *rule; struct substitution *subst; @@ -237,6 +245,13 @@ apply_substitution(struct bsdtar *bsdtar, const char *name, char **result, continue; } + if (rule->from_begin && *result) { + realloc_strcat(result, name); + realloc_strcat(&buffer, *result); + name = buffer; + (*result)[0] = 0; + } + while (1) { if (regexec(&rule->re, name, 10, matches, 0)) break; @@ -276,6 +291,7 @@ apply_substitution(struct bsdtar *bsdtar, const char *name, char **result, case '9': realloc_strncat(result, rule->result + j, i - j - 1); if ((size_t)(c - '0') > (size_t)(rule->re.re_nsub)) { + free(buffer); free(*result); *result = NULL; return -1; @@ -302,6 +318,8 @@ apply_substitution(struct bsdtar *bsdtar, const char *name, char **result, if (got_match) realloc_strcat(result, name); + free(buffer); + if (print_match) fprintf(stderr, "%s >> %s\n", path, *result); @@ -320,8 +338,9 @@ cleanup_substitution(struct bsdtar *bsdtar) while ((rule = subst->first_rule) != NULL) { subst->first_rule = rule->next; free(rule->result); + regfree(&rule->re); free(rule); } free(subst); } -#endif /* defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) */ +#endif /* defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) || defined(HAVE_PCRE2POSIX_H) */ diff --git a/tar/test/CMakeLists.txt b/tar/test/CMakeLists.txt index 3b6675393d18..7808a8d1f2ba 100644 --- a/tar/test/CMakeLists.txt +++ b/tar/test/CMakeLists.txt @@ -43,6 +43,7 @@ IF(ENABLE_TAR AND ENABLE_TEST) test_option_exclude_vcs.c test_option_fflags.c test_option_gid_gname.c + test_option_group.c test_option_grzip.c test_option_ignore_zeros.c test_option_j.c @@ -56,6 +57,7 @@ IF(ENABLE_TAR AND ENABLE_TEST) test_option_newer_than.c test_option_nodump.c test_option_older_than.c + test_option_owner.c test_option_passphrase.c test_option_q.c test_option_r.c diff --git a/tar/test/test.h b/tar/test/test.h index 1e1bee80709c..549357b4e0fd 100644 --- a/tar/test/test.h +++ b/tar/test/test.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ /* Every test program should #include "test.h" as the first thing. */ diff --git a/tar/test/test_0.c b/tar/test/test_0.c index b73c7a3f4fab..7a3c2e46858f 100644 --- a/tar/test/test_0.c +++ b/tar/test/test_0.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_0.c,v 1.2 2008/05/26 17:10:10 kientzle Exp $"); /* * This first test does basic sanity checks on the environment. For diff --git a/tar/test/test_basic.c b/tar/test/test_basic.c index b1c49834a45f..a59236c92b55 100644 --- a/tar/test/test_basic.c +++ b/tar/test/test_basic.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_basic.c,v 1.2 2008/05/26 17:10:10 kientzle Exp $"); static const char * make_files(void) diff --git a/tar/test/test_copy.c b/tar/test/test_copy.c index d618e45ca36b..fd47a6d877e6 100644 --- a/tar/test/test_copy.c +++ b/tar/test/test_copy.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_copy.c,v 1.3 2008/08/15 06:12:02 kientzle Exp $"); #if defined(__CYGWIN__) # include <limits.h> @@ -160,21 +159,21 @@ create_tree(void) failure("Internal sanity check failed: i = %d", i); assert(filenames[i] != NULL); - sprintf(buff, "f/%s", filenames[i]); + snprintf(buff, sizeof(buff), "f/%s", filenames[i]); assertMakeFile(buff, 0777, buff); /* Create a link named "l/abcdef..." to the above. */ - sprintf(buff2, "l/%s", filenames[i]); + snprintf(buff2, sizeof(buff2), "l/%s", filenames[i]); assertMakeHardlink(buff2, buff); /* Create a link named "m/abcdef..." to the above. */ - sprintf(buff2, "m/%s", filenames[i]); + snprintf(buff2, sizeof(buff2), "m/%s", filenames[i]); assertMakeHardlink(buff2, buff); if (canSymlink()) { /* Create a symlink named "s/abcdef..." to the above. */ - sprintf(buff, "s/%s", filenames[i]); - sprintf(buff2, "../f/%s", filenames[i]); + snprintf(buff, sizeof(buff), "s/%s", filenames[i]); + snprintf(buff2, sizeof(buff2), "../f/%s", filenames[i]); failure("buff=\"%s\" buff2=\"%s\"", buff, buff2); assertMakeSymlink(buff, buff2, 0); } @@ -202,13 +201,13 @@ verify_tree(size_t limit) /* Generate the names we know should be there and verify them. */ for (i = 1; i < LOOP_MAX; i++) { /* Verify a file named "f/abcdef..." */ - sprintf(name1, "f/%s", filenames[i]); + snprintf(name1, sizeof(name1), "f/%s", filenames[i]); if (i <= limit) { assertFileExists(name1); assertFileContents(name1, (int)strlen(name1), name1); } - sprintf(name2, "l/%s", filenames[i]); + snprintf(name2, sizeof(name2), "l/%s", filenames[i]); if (i + 2 <= limit) { /* Verify hardlink "l/abcdef..." */ assertIsHardlink(name1, name2); @@ -219,14 +218,14 @@ verify_tree(size_t limit) if (canSymlink()) { /* Verify symlink "s/abcdef..." */ - sprintf(name1, "s/%s", filenames[i]); - sprintf(name2, "../f/%s", filenames[i]); + snprintf(name1, sizeof(name1), "s/%s", filenames[i]); + snprintf(name2, sizeof(name2), "../f/%s", filenames[i]); if (strlen(name2) <= limit) assertIsSymlink(name1, name2, 0); } /* Verify dir "d/abcdef...". */ - sprintf(name1, "d/%s", filenames[i]); + snprintf(name1, sizeof(name1), "d/%s", filenames[i]); if (i + 1 <= limit) { /* +1 for trailing slash */ if (assertIsDir(name1, -1)) { /* TODO: opendir/readdir this diff --git a/tar/test/test_empty_mtree.c b/tar/test/test_empty_mtree.c index 6f8a5e91aa1a..11cdfb56690a 100644 --- a/tar/test/test_empty_mtree.c +++ b/tar/test/test_empty_mtree.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Regression test: We used to get a bogus error message when we diff --git a/tar/test/test_extract_tar_Z.c b/tar/test/test_extract_tar_Z.c index 7c994b472a79..b03aca6d1da5 100644 --- a/tar/test/test_extract_tar_Z.c +++ b/tar/test/test_extract_tar_Z.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_Z) { diff --git a/tar/test/test_extract_tar_bz2.c b/tar/test/test_extract_tar_bz2.c index b734dd28ba74..02b3ee326d5b 100644 --- a/tar/test/test_extract_tar_bz2.c +++ b/tar/test/test_extract_tar_bz2.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_bz2) { diff --git a/tar/test/test_extract_tar_grz.c b/tar/test/test_extract_tar_grz.c index 9c0615e981f2..f0adf994dec6 100644 --- a/tar/test/test_extract_tar_grz.c +++ b/tar/test/test_extract_tar_grz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_grz) { diff --git a/tar/test/test_extract_tar_gz.c b/tar/test/test_extract_tar_gz.c index 2fdb4ba7cdff..b17d66f01529 100644 --- a/tar/test/test_extract_tar_gz.c +++ b/tar/test/test_extract_tar_gz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_gz) { diff --git a/tar/test/test_extract_tar_lrz.c b/tar/test/test_extract_tar_lrz.c index 56a0fb88231e..d6049809bb22 100644 --- a/tar/test/test_extract_tar_lrz.c +++ b/tar/test/test_extract_tar_lrz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_lrz) { diff --git a/tar/test/test_extract_tar_lz.c b/tar/test/test_extract_tar_lz.c index 5ec7e9a48f2f..3889138928d1 100644 --- a/tar/test/test_extract_tar_lz.c +++ b/tar/test/test_extract_tar_lz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_lz) { diff --git a/tar/test/test_extract_tar_lz4.c b/tar/test/test_extract_tar_lz4.c index 150d57d71551..f0e03ed3206e 100644 --- a/tar/test/test_extract_tar_lz4.c +++ b/tar/test/test_extract_tar_lz4.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_lz4) { diff --git a/tar/test/test_extract_tar_lzma.c b/tar/test/test_extract_tar_lzma.c index 2fa2af049446..fd9f547fb524 100644 --- a/tar/test/test_extract_tar_lzma.c +++ b/tar/test/test_extract_tar_lzma.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_lzma) { diff --git a/tar/test/test_extract_tar_lzo.c b/tar/test/test_extract_tar_lzo.c index 17b4295edf63..9c05e15a6b04 100644 --- a/tar/test/test_extract_tar_lzo.c +++ b/tar/test/test_extract_tar_lzo.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_lzo) { diff --git a/tar/test/test_extract_tar_xz.c b/tar/test/test_extract_tar_xz.c index 860bab75acf7..8684072d76f5 100644 --- a/tar/test/test_extract_tar_xz.c +++ b/tar/test/test_extract_tar_xz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_xz) { diff --git a/tar/test/test_extract_tar_zstd.c b/tar/test/test_extract_tar_zstd.c index d67170ce3433..1eced8817387 100644 --- a/tar/test/test_extract_tar_zstd.c +++ b/tar/test/test_extract_tar_zstd.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_zstd) { diff --git a/tar/test/test_format_newc.c b/tar/test/test_format_newc.c index 808fa4b49180..5357cc7cdae4 100644 --- a/tar/test/test_format_newc.c +++ b/tar/test/test_format_newc.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_format_newc) { diff --git a/tar/test/test_help.c b/tar/test/test_help.c index 3bb517d00cde..fd97a217b789 100644 --- a/tar/test/test_help.c +++ b/tar/test/test_help.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_help.c,v 1.2 2008/05/26 17:10:10 kientzle Exp $"); /* * Test that "--help", "-h", and "-W help" options all work and diff --git a/tar/test/test_leading_slash.c b/tar/test/test_leading_slash.c index 572c45e3cbb7..ca64ad154055 100644 --- a/tar/test/test_leading_slash.c +++ b/tar/test/test_leading_slash.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_leading_slash) { diff --git a/tar/test/test_missing_file.c b/tar/test/test_missing_file.c index 808e384e10b0..1cc40f3745e8 100644 --- a/tar/test/test_missing_file.c +++ b/tar/test/test_missing_file.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_missing_file) { diff --git a/tar/test/test_option_C_mtree.c b/tar/test/test_option_C_mtree.c index ccadc389974c..25679644af61 100644 --- a/tar/test/test_option_C_mtree.c +++ b/tar/test/test_option_C_mtree.c @@ -26,7 +26,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_C_mtree) { diff --git a/tar/test/test_option_C_upper.c b/tar/test/test_option_C_upper.c index 538890f58178..cadc924e1d47 100644 --- a/tar/test/test_option_C_upper.c +++ b/tar/test/test_option_C_upper.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_C_upper) { diff --git a/tar/test/test_option_H_upper.c b/tar/test/test_option_H_upper.c index 2c2ad33ce75b..097a9729d26f 100644 --- a/tar/test/test_option_H_upper.c +++ b/tar/test/test_option_H_upper.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_H_upper) { diff --git a/tar/test/test_option_L_upper.c b/tar/test/test_option_L_upper.c index 5697b0f293c2..fd1ed0a52c76 100644 --- a/tar/test/test_option_L_upper.c +++ b/tar/test/test_option_L_upper.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_L_upper) { diff --git a/tar/test/test_option_O_upper.c b/tar/test/test_option_O_upper.c index b9c8c0cad109..a5540dbe8417 100644 --- a/tar/test/test_option_O_upper.c +++ b/tar/test/test_option_O_upper.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static const char *test4out[] = {"file1", "file2", NULL}; static const char *test5err[] = {"file1", "file2", NULL}; diff --git a/tar/test/test_option_T_upper.c b/tar/test/test_option_T_upper.c index f2b65d7bdc23..c64767fcfb84 100644 --- a/tar/test/test_option_T_upper.c +++ b/tar/test/test_option_T_upper.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_option_T.c,v 1.3 2008/08/15 06:12:02 kientzle Exp $"); static int tryMakeFile(const char *fn) diff --git a/tar/test/test_option_U_upper.c b/tar/test/test_option_U_upper.c index d864e13c4f6b..4518a5f9fd8e 100644 --- a/tar/test/test_option_U_upper.c +++ b/tar/test/test_option_U_upper.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_U_upper) { diff --git a/tar/test/test_option_X_upper.c b/tar/test/test_option_X_upper.c index 4916af2970e8..b5ea98b9a0d7 100644 --- a/tar/test/test_option_X_upper.c +++ b/tar/test/test_option_X_upper.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_X_upper) { diff --git a/tar/test/test_option_a.c b/tar/test/test_option_a.c index d9eed8777ff2..52797411c751 100644 --- a/tar/test/test_option_a.c +++ b/tar/test/test_option_a.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_a) { diff --git a/tar/test/test_option_acls.c b/tar/test/test_option_acls.c index f7451c8eb36b..333ac2e4fb47 100644 --- a/tar/test/test_option_acls.c +++ b/tar/test/test_option_acls.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #if ARCHIVE_ACL_FREEBSD || ARCHIVE_ACL_DARWIN || ARCHIVE_ACL_LIBACL static const acl_perm_t acl_perms[] = { diff --git a/tar/test/test_option_b.c b/tar/test/test_option_b.c index 0eee80d86f49..d7e0f399c297 100644 --- a/tar/test/test_option_b.c +++ b/tar/test/test_option_b.c @@ -23,22 +23,23 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #define USTAR_OPT " --format=ustar" DEFINE_TEST(test_option_b) { char *testprog_ustar; + size_t testprog_ustar_len; assertMakeFile("file1", 0644, "file1"); if (systemf("cat file1 > test_cat.out 2> test_cat.err") != 0) { skipping("This test requires a `cat` program"); return; } - testprog_ustar = malloc(strlen(testprog) + sizeof(USTAR_OPT) + 1); - strcpy(testprog_ustar, testprog); - strcat(testprog_ustar, USTAR_OPT); + testprog_ustar_len = strlen(testprog) + sizeof(USTAR_OPT) + 1; + testprog_ustar = malloc(testprog_ustar_len); + strncpy(testprog_ustar, testprog, testprog_ustar_len); + strncat(testprog_ustar, USTAR_OPT, testprog_ustar_len); /* * Bsdtar does not pad if the output is going directly to a disk file. diff --git a/tar/test/test_option_b64encode.c b/tar/test/test_option_b64encode.c index 1d0420430e09..b9a2b809ea4a 100644 --- a/tar/test/test_option_b64encode.c +++ b/tar/test/test_option_b64encode.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_b64encode) { diff --git a/tar/test/test_option_exclude.c b/tar/test/test_option_exclude.c index 1345f70aa160..b21ec624aec2 100644 --- a/tar/test/test_option_exclude.c +++ b/tar/test/test_option_exclude.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_exclude) { diff --git a/tar/test/test_option_exclude_vcs.c b/tar/test/test_option_exclude_vcs.c index 202151139996..ec4dc5594f5c 100644 --- a/tar/test/test_option_exclude_vcs.c +++ b/tar/test/test_option_exclude_vcs.c @@ -23,10 +23,10 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_exclude_vcs) { + assertUmask(0); assertMakeDir("in", 0755); assertChdir("in"); assertMakeFile("file", 0644, ""); diff --git a/tar/test/test_option_fflags.c b/tar/test/test_option_fflags.c index f223feb19069..045c780edefc 100644 --- a/tar/test/test_option_fflags.c +++ b/tar/test/test_option_fflags.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__BORLANDC__) #define chmod _chmod diff --git a/tar/test/test_option_gid_gname.c b/tar/test/test_option_gid_gname.c index 4e5f51c8f486..a4cff1ab2f64 100644 --- a/tar/test/test_option_gid_gname.c +++ b/tar/test/test_option_gid_gname.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_gid_gname) { diff --git a/tar/test/test_option_group.c b/tar/test/test_option_group.c new file mode 100644 index 000000000000..d429ddab9f9f --- /dev/null +++ b/tar/test/test_option_group.c @@ -0,0 +1,84 @@ +/*- + * Copyright (c) 2003-2010 Tim Kientzle + * Copyright (c) 2024 Haelwenn (lanodan) Monnier + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +DEFINE_TEST(test_option_group) +{ + char *reference, *data; + size_t s; + + assertUmask(0); + assertMakeFile("file", 0644, "1234567890"); + + /* Create archive with no special options. */ + failure("Error invoking %s c", testprog); + assertEqualInt(0, + systemf("%s cf archive1 --format=ustar file >stdout1.txt 2>stderr1.txt", + testprog)); + assertEmptyFile("stdout1.txt"); + assertEmptyFile("stderr1.txt"); + reference = slurpfile(&s, "archive1"); + + /* Create archive with --group (numeric) */ + failure("Error invoking %s c", testprog); + assertEqualInt(0, + systemf("%s cf archive2 --group=17 --format=ustar file >stdout2.txt 2>stderr2.txt", + testprog)); + assertEmptyFile("stdout2.txt"); + assertEmptyFile("stderr2.txt"); + data = slurpfile(&s, "archive2"); + assertEqualMem(data + 116, "000021 \0", 8); + /* Gname field in ustar header should be empty. */ + assertEqualMem(data + 297, "\0", 1); + free(data); + + /* Again with --group (name) */ + failure("Error invoking %s c", testprog); + assertEqualInt(0, + systemf("%s cf archive3 --group=foofoofoo --format=ustar file >stdout3.txt 2>stderr3.txt", + testprog)); + assertEmptyFile("stdout3.txt"); + assertEmptyFile("stderr3.txt"); + data = slurpfile(&s, "archive3"); + /* Gid should be unchanged from original reference. */ + assertEqualMem(data + 116, reference + 116, 8); + assertEqualMem(data + 297, "foofoofoo\0", 10); + free(data); + + /* Again with --group (name:id) */ + failure("Error invoking %s c", testprog); + assertEqualInt(0, + systemf("%s cf archive4 --group=foofoofoo:17 --format=ustar file >stdout4.txt 2>stderr4.txt", + testprog)); + assertEmptyFile("stdout4.txt"); + assertEmptyFile("stderr4.txt"); + data = slurpfile(&s, "archive4"); + assertEqualMem(data + 116, "000021 \0", 8); + assertEqualMem(data + 297, "foofoofoo\0", 10); + free(data); + + free(reference); +} diff --git a/tar/test/test_option_grzip.c b/tar/test/test_option_grzip.c index fbff252421d1..d898e4408151 100644 --- a/tar/test/test_option_grzip.c +++ b/tar/test/test_option_grzip.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_grzip) { diff --git a/tar/test/test_option_ignore_zeros.c b/tar/test/test_option_ignore_zeros.c index 26c9320e3008..985ad3082fce 100644 --- a/tar/test/test_option_ignore_zeros.c +++ b/tar/test/test_option_ignore_zeros.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static int make_files(void) diff --git a/tar/test/test_option_j.c b/tar/test/test_option_j.c index 838234a2aeb5..cf4d91d0afac 100644 --- a/tar/test/test_option_j.c +++ b/tar/test/test_option_j.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_j) { diff --git a/tar/test/test_option_k.c b/tar/test/test_option_k.c index e57cc274cfc4..873a1209b0a9 100644 --- a/tar/test/test_option_k.c +++ b/tar/test/test_option_k.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_k) { diff --git a/tar/test/test_option_keep_newer_files.c b/tar/test/test_option_keep_newer_files.c index 089898cc27e0..2572a98c5812 100644 --- a/tar/test/test_option_keep_newer_files.c +++ b/tar/test/test_option_keep_newer_files.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_keep_newer_files) { diff --git a/tar/test/test_option_lrzip.c b/tar/test/test_option_lrzip.c index 11e9827e0405..8bf4633f643e 100644 --- a/tar/test/test_option_lrzip.c +++ b/tar/test/test_option_lrzip.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_lrzip) { diff --git a/tar/test/test_option_lz4.c b/tar/test/test_option_lz4.c index 70fdaac3600f..1b766d04969f 100644 --- a/tar/test/test_option_lz4.c +++ b/tar/test/test_option_lz4.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_lz4) { diff --git a/tar/test/test_option_lzma.c b/tar/test/test_option_lzma.c index a618ff8a3403..1d8697b53ee8 100644 --- a/tar/test/test_option_lzma.c +++ b/tar/test/test_option_lzma.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_lzma) { @@ -44,6 +43,7 @@ DEFINE_TEST(test_option_lzma) if (strstr(p, "Unsupported compression") != NULL) { skipping("This version of bsdtar was compiled " "without lzma support"); + free(p); return; } failure("--lzma option is broken"); diff --git a/tar/test/test_option_lzop.c b/tar/test/test_option_lzop.c index 20ef06c5c8a0..d96a14f08fea 100644 --- a/tar/test/test_option_lzop.c +++ b/tar/test/test_option_lzop.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_lzop) { diff --git a/tar/test/test_option_n.c b/tar/test/test_option_n.c index f36658ef1656..a6bda0599e16 100644 --- a/tar/test/test_option_n.c +++ b/tar/test/test_option_n.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_WAIT_H #include <sys/wait.h> diff --git a/tar/test/test_option_newer_than.c b/tar/test/test_option_newer_than.c index 2a5fe04e6968..a250a4c8d8c6 100644 --- a/tar/test/test_option_newer_than.c +++ b/tar/test/test_option_newer_than.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_newer_than) { diff --git a/tar/test/test_option_nodump.c b/tar/test/test_option_nodump.c index 815b08ed9251..6a5b66e3215a 100644 --- a/tar/test/test_option_nodump.c +++ b/tar/test/test_option_nodump.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_nodump) { diff --git a/tar/test/test_option_older_than.c b/tar/test/test_option_older_than.c index 4bdd2edfe0bd..d57c4d414b8f 100644 --- a/tar/test/test_option_older_than.c +++ b/tar/test/test_option_older_than.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_older_than) { diff --git a/tar/test/test_option_owner.c b/tar/test/test_option_owner.c new file mode 100644 index 000000000000..04c86cc0e8d4 --- /dev/null +++ b/tar/test/test_option_owner.c @@ -0,0 +1,84 @@ +/*- + * Copyright (c) 2003-2010 Tim Kientzle + * Copyright (c) 2024 Haelwenn (lanodan) Monnier + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +DEFINE_TEST(test_option_owner) +{ + char *reference, *data; + size_t s; + + assertUmask(0); + assertMakeFile("file", 0644, "1234567890"); + + /* Create archive with no special options. */ + failure("Error invoking %s c", testprog); + assertEqualInt(0, + systemf("%s cf archive1 --format=ustar file >stdout1.txt 2>stderr1.txt", + testprog)); + assertEmptyFile("stdout1.txt"); + assertEmptyFile("stderr1.txt"); + reference = slurpfile(&s, "archive1"); + + /* Create archive with --owner (numeric) */ + failure("Error invoking %s c", testprog); + assertEqualInt(0, + systemf("%s cf archive2 --owner=65123 --format=ustar file >stdout2.txt 2>stderr2.txt", + testprog)); + assertEmptyFile("stdout2.txt"); + assertEmptyFile("stderr2.txt"); + data = slurpfile(&s, "archive2"); + assertEqualMem(data + 108, "177143 \0", 8); + /* Uname field in ustar header should be empty. */ + assertEqualMem(data + 265, "\0", 1); + free(data); + + /* Again with just --owner (name) */ + failure("Error invoking %s c", testprog); + assertEqualInt(0, + systemf("%s cf archive3 --owner=foofoofoo --format=ustar file >stdout3.txt 2>stderr3.txt", + testprog)); + assertEmptyFile("stdout3.txt"); + assertEmptyFile("stderr3.txt"); + data = slurpfile(&s, "archive3"); + /* Uid should be unchanged from original reference. */ + assertEqualMem(data + 108, reference + 108, 8); + assertEqualMem(data + 265, "foofoofoo\0", 10); + free(data); + + /* Again with just --owner (name:id) */ + failure("Error invoking %s c", testprog); + assertEqualInt(0, + systemf("%s cf archive4 --owner=foofoofoo:65123 --format=ustar file >stdout4.txt 2>stderr4.txt", + testprog)); + assertEmptyFile("stdout4.txt"); + assertEmptyFile("stderr4.txt"); + data = slurpfile(&s, "archive4"); + assertEqualMem(data + 108, "177143 \0", 8); + assertEqualMem(data + 265, "foofoofoo\0", 10); + free(data); + + free(reference); +} diff --git a/tar/test/test_option_passphrase.c b/tar/test/test_option_passphrase.c index 337292c95bfc..74f3d3d5d031 100644 --- a/tar/test/test_option_passphrase.c +++ b/tar/test/test_option_passphrase.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_passphrase) { diff --git a/tar/test/test_option_q.c b/tar/test/test_option_q.c index 287e67afa518..fd4b55e545ae 100644 --- a/tar/test/test_option_q.c +++ b/tar/test/test_option_q.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_option_q.c,v 1.3 2008/08/22 01:35:08 kientzle Exp $"); DEFINE_TEST(test_option_q) { diff --git a/tar/test/test_option_r.c b/tar/test/test_option_r.c index 287e80939adf..655b973ad1e2 100644 --- a/tar/test/test_option_r.c +++ b/tar/test/test_option_r.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Also see test_option_q for additional validation of -r support. diff --git a/tar/test/test_option_s.c b/tar/test/test_option_s.c index fa799a295d01..564793b97d5e 100644 --- a/tar/test/test_option_s.c +++ b/tar/test/test_option_s.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_option_T.c,v 1.3 2008/08/15 06:12:02 kientzle Exp $"); DEFINE_TEST(test_option_s) { @@ -89,6 +88,17 @@ DEFINE_TEST(test_option_s) assertFileContents("bar", 3, "test4/in/d1/baz"); /* + * Test 4b: Multiple substitutions behavior with option b). + */ + assertMakeDir("test4b", 0755); + systemf("%s -cf test4b.tar in/d1/foo in/d1/bar", + testprog); + systemf("%s -xf test4b.tar -s /oo/ar/ -s }ar}az}b -C test4b", + testprog); + assertFileContents("foo", 3, "test4b/in/d1/faz"); + assertFileContents("bar", 3, "test4b/in/d1/baz"); + + /* * Test 5: Name-switching substitutions when extracting archive. */ assertMakeDir("test5", 0755); diff --git a/tar/test/test_option_safe_writes.c b/tar/test/test_option_safe_writes.c index 7b42e8f62253..d1e36cfd4736 100644 --- a/tar/test/test_option_safe_writes.c +++ b/tar/test/test_option_safe_writes.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_safe_writes) { diff --git a/tar/test/test_option_uid_uname.c b/tar/test/test_option_uid_uname.c index 80c061961488..261e3b86565b 100644 --- a/tar/test/test_option_uid_uname.c +++ b/tar/test/test_option_uid_uname.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_uid_uname) { diff --git a/tar/test/test_option_uuencode.c b/tar/test/test_option_uuencode.c index a28a8e3407a3..4bb6e0898c2b 100644 --- a/tar/test/test_option_uuencode.c +++ b/tar/test/test_option_uuencode.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_uuencode) { diff --git a/tar/test/test_option_xattrs.c b/tar/test/test_option_xattrs.c index 79dfff528303..eef6c779bb52 100644 --- a/tar/test/test_option_xattrs.c +++ b/tar/test/test_option_xattrs.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_xattrs) { diff --git a/tar/test/test_option_xz.c b/tar/test/test_option_xz.c index 91da0730ac94..45163e735f19 100644 --- a/tar/test/test_option_xz.c +++ b/tar/test/test_option_xz.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_xz) { diff --git a/tar/test/test_option_z.c b/tar/test/test_option_z.c index 59744999fc5c..8e10e37ba22e 100644 --- a/tar/test/test_option_z.c +++ b/tar/test/test_option_z.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_z) { diff --git a/tar/test/test_option_zstd.c b/tar/test/test_option_zstd.c index 73965e33f3af..f9983670249c 100644 --- a/tar/test/test_option_zstd.c +++ b/tar/test/test_option_zstd.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_zstd) { diff --git a/tar/test/test_patterns.c b/tar/test/test_patterns.c index e1449008b6e1..64f8fffe90f9 100644 --- a/tar/test/test_patterns.c +++ b/tar/test/test_patterns.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_patterns.c,v 1.6 2008/08/21 22:28:00 kientzle Exp $"); DEFINE_TEST(test_patterns) { diff --git a/tar/test/test_print_longpath.c b/tar/test/test_print_longpath.c index 4bac1679cc97..a21651fa15eb 100644 --- a/tar/test/test_print_longpath.c +++ b/tar/test/test_print_longpath.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_print_longpath) { diff --git a/tar/test/test_stdio.c b/tar/test/test_stdio.c index d6650a5eb20a..d046727a2dd3 100644 --- a/tar/test/test_stdio.c +++ b/tar/test/test_stdio.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_stdio.c,v 1.2 2008/05/26 17:10:10 kientzle Exp $"); DEFINE_TEST(test_stdio) { diff --git a/tar/test/test_strip_components.c b/tar/test/test_strip_components.c index 090fb0dbf913..9bf79ab7cf20 100644 --- a/tar/test/test_strip_components.c +++ b/tar/test/test_strip_components.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_strip_components.c,v 1.2 2008/11/10 05:24:13 kientzle Exp $"); DEFINE_TEST(test_strip_components) { diff --git a/tar/test/test_symlink_dir.c b/tar/test/test_symlink_dir.c index 5836647c1a23..4c5666204388 100644 --- a/tar/test/test_symlink_dir.c +++ b/tar/test/test_symlink_dir.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_symlink_dir.c,v 1.1 2008/09/14 02:16:04 kientzle Exp $"); /* * tar -x -P should follow existing symlinks for dirs, but not other diff --git a/tar/util.c b/tar/util.c index 8ebec64c48d9..37c3a23231bd 100644 --- a/tar/util.c +++ b/tar/util.c @@ -24,7 +24,6 @@ */ #include "bsdtar_platform.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/util.c,v 1.23 2008/12/15 06:00:25 kientzle Exp $"); #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> @@ -63,7 +62,7 @@ __FBSDID("$FreeBSD: src/usr.bin/tar/util.c,v 1.23 2008/12/15 06:00:25 kientzle E #include "err.h" #include "passphrase.h" -static size_t bsdtar_expand_char(char *, size_t, char); +static size_t bsdtar_expand_char(char *, size_t, size_t, char); static const char *strip_components(const char *path, int elements); #if defined(_WIN32) && !defined(__CYGWIN__) @@ -173,12 +172,12 @@ safe_fprintf(FILE *f, const char *fmt, ...) /* Not printable, format the bytes. */ while (n-- > 0) i += (unsigned)bsdtar_expand_char( - outbuff, i, *p++); + outbuff, sizeof(outbuff), i, *p++); } } else { /* After any conversion failure, don't bother * trying to convert the rest. */ - i += (unsigned)bsdtar_expand_char(outbuff, i, *p++); + i += (unsigned)bsdtar_expand_char(outbuff, sizeof(outbuff), i, *p++); try_wc = 0; } @@ -200,7 +199,7 @@ safe_fprintf(FILE *f, const char *fmt, ...) * Render an arbitrary sequence of bytes into printable ASCII characters. */ static size_t -bsdtar_expand_char(char *buff, size_t offset, char c) +bsdtar_expand_char(char *buff, size_t buffsize, size_t offset, char c) { size_t i = offset; @@ -221,7 +220,7 @@ bsdtar_expand_char(char *buff, size_t offset, char c) case '\v': buff[i++] = 'v'; break; case '\\': buff[i++] = '\\'; break; default: - sprintf(buff + i, "%03o", 0xFF & (int)c); + snprintf(buff + i, buffsize - i, "%03o", 0xFF & (int)c); i += 3; } } @@ -309,11 +308,12 @@ set_chdir(struct bsdtar *bsdtar, const char *newdir) /* The -C /foo -C bar case; concatenate */ char *old_pending = bsdtar->pending_chdir; size_t old_len = strlen(old_pending); - bsdtar->pending_chdir = malloc(old_len + strlen(newdir) + 2); + size_t new_len = old_len + strlen(newdir) + 2; + bsdtar->pending_chdir = malloc(new_len); if (old_pending[old_len - 1] == '/') old_pending[old_len - 1] = '\0'; if (bsdtar->pending_chdir != NULL) - sprintf(bsdtar->pending_chdir, "%s/%s", + snprintf(bsdtar->pending_chdir, new_len, "%s/%s", old_pending, newdir); free(old_pending); } @@ -470,7 +470,7 @@ edit_pathname(struct bsdtar *bsdtar, struct archive_entry *entry) const char *original_name = name; const char *hardlinkname = archive_entry_hardlink(entry); const char *original_hardlinkname = hardlinkname; -#if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) +#if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) || defined(HAVE_PCRE2POSIX_H) char *subst_name; int r; @@ -667,13 +667,9 @@ list_item_verbose(struct bsdtar *bsdtar, FILE *out, struct archive_entry *entry) time_t tim; static time_t now; 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 /* * We avoid collecting the entire list in memory at once by @@ -695,7 +691,7 @@ list_item_verbose(struct bsdtar *bsdtar, FILE *out, struct archive_entry *entry) /* Use uname if it's present, else uid. */ p = archive_entry_uname(entry); if ((p == NULL) || (*p == '\0')) { - sprintf(tmp, "%lu ", + snprintf(tmp, sizeof(tmp), "%lu ", (unsigned long)archive_entry_uid(entry)); p = tmp; } @@ -710,7 +706,7 @@ list_item_verbose(struct bsdtar *bsdtar, FILE *out, struct archive_entry *entry) fprintf(out, "%s", p); w = strlen(p); } else { - sprintf(tmp, "%lu", + snprintf(tmp, sizeof(tmp), "%lu", (unsigned long)archive_entry_gid(entry)); w = strlen(tmp); fprintf(out, "%s", tmp); @@ -723,7 +719,7 @@ list_item_verbose(struct bsdtar *bsdtar, FILE *out, struct archive_entry *entry) */ if (archive_entry_filetype(entry) == AE_IFCHR || archive_entry_filetype(entry) == AE_IFBLK) { - sprintf(tmp, "%lu,%lu", + snprintf(tmp, sizeof(tmp), "%lu,%lu", (unsigned long)archive_entry_rdevmajor(entry), (unsigned long)archive_entry_rdevminor(entry)); } else { @@ -745,15 +741,10 @@ list_item_verbose(struct bsdtar *bsdtar, FILE *out, struct archive_entry *entry) fmt = bsdtar->day_first ? DAY_FMT " %b %Y" : "%b " DAY_FMT " %Y"; else fmt = bsdtar->day_first ? DAY_FMT " %b %H:%M" : "%b " DAY_FMT " %H:%M"; -#if defined(HAVE_LOCALTIME_R) +#if defined(HAVE_LOCALTIME_S) + ltime = localtime_s(&tmbuf, &tim) ? NULL : &tmbuf; +#elif defined(HAVE_LOCALTIME_R) ltime = localtime_r(&tim, &tmbuf); -#elif defined(HAVE__LOCALTIME64_S) - tmptime = tim; - terr = _localtime64_s(&tmbuf, &tmptime); - if (terr) - ltime = NULL; - else - ltime = &tmbuf; #else ltime = localtime(&tim); #endif diff --git a/tar/write.c b/tar/write.c index f2fb1c356c13..5c7b13ae682f 100644 --- a/tar/write.c +++ b/tar/write.c @@ -25,7 +25,6 @@ */ #include "bsdtar_platform.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/write.c,v 1.79 2008/11/27 05:49:52 kientzle Exp $"); #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> @@ -694,6 +693,8 @@ append_archive(struct bsdtar *bsdtar, struct archive *a, struct archive *ina) while (ARCHIVE_OK == (e = archive_read_next_header(ina, &in_entry))) { if (archive_match_excluded(bsdtar->matching, in_entry)) continue; + if(edit_pathname(bsdtar, in_entry)) + continue; if ((bsdtar->flags & OPTFLAG_INTERACTIVE) && !yes("copy '%s'", archive_entry_pathname(in_entry))) continue; diff --git a/test_utils/test_common.h b/test_utils/test_common.h index 6250235c6ca9..8e1ec82436f8 100644 --- a/test_utils/test_common.h +++ b/test_utils/test_common.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #ifndef TEST_COMMON_H @@ -134,16 +132,6 @@ #include <stdint.h> #endif -/* Get a real definition for __FBSDID if we can */ -#if HAVE_SYS_CDEFS_H -#include <sys/cdefs.h> -#endif - -/* If not, define it so as to avoid dangling semicolons. */ -#ifndef __FBSDID -#define __FBSDID(a) struct _undefined_hack -#endif - #ifndef O_BINARY #define O_BINARY 0 #endif @@ -178,6 +166,8 @@ /* Assert two integers are the same. Reports value of each one if not. */ #define assertEqualInt(v1,v2) \ assertion_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL) +#define assertEqualAddress(v1,v2) \ + assertion_equal_address(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL) /* Assert two strings are the same. Reports value of each one if not. */ #define assertEqualString(v1,v2) \ assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL, 0) @@ -291,6 +281,7 @@ int assertion_compare_fflags(const char *, int, const char *, const char *, int assertion_empty_file(const char *, int, const char *); int assertion_equal_file(const char *, int, const char *, const char *); int assertion_equal_int(const char *, int, long long, const char *, long long, const char *, void *); +int assertion_equal_address(const char *, int, const void *, const char *, const void *, const char *, void *); int assertion_equal_mem(const char *, int, const void *, const char *, const void *, const char *, size_t, const char *, void *); int assertion_memory_filled_with(const char *, int, const void *, const char *, size_t, const char *, char, const char *, void *); int assertion_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *, int); diff --git a/test_utils/test_main.c b/test_utils/test_main.c index 116da2315439..6617732a335b 100644 --- a/test_utils/test_main.c +++ b/test_utils/test_main.c @@ -327,7 +327,7 @@ my_GetFileInformationByName(const char *path, BY_HANDLE_FILE_INFORMATION *bhfi) int r; memset(bhfi, 0, sizeof(*bhfi)); - h = CreateFile(path, FILE_READ_ATTRIBUTES, 0, NULL, + h = CreateFileA(path, FILE_READ_ATTRIBUTES, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if (h == INVALID_HANDLE_VALUE) return (0); @@ -426,7 +426,7 @@ failure(const char *fmt, ...) nextmsg = NULL; } else { va_start(ap, fmt); - vsprintf(msgbuff, fmt, ap); + vsnprintf(msgbuff, sizeof(msgbuff), fmt, ap); va_end(ap); nextmsg = msgbuff; } @@ -551,7 +551,7 @@ test_skipping(const char *fmt, ...) va_list ap; va_start(ap, fmt); - vsprintf(buff, fmt, ap); + vsnprintf(buff, sizeof(buff), fmt, ap); va_end(ap); /* Use failure() message if set. */ msg = nextmsg; @@ -625,6 +625,21 @@ assertion_equal_int(const char *file, int line, return (0); } +/* Verify two pointers are equal. */ +int +assertion_equal_address(const char *file, int line, + const void *v1, const char *e1, const void *v2, const char *e2, void *extra) +{ + assertion_count(file, line); + if (v1 == v2) + return (1); + failure_start(file, line, "%s != %s", e1, e2); + logprintf(" %s=0x%llx\n", e1, (unsigned long long)(uintptr_t)v1); + logprintf(" %s=0x%llx\n", e2, (unsigned long long)(uintptr_t)v2); + failure_finish(extra); + return (0); +} + /* * Utility to convert a single UTF-8 sequence. */ @@ -1245,7 +1260,7 @@ assertion_file_contains_lines_any_order(const char *file, int line, c = *p; } if (actual_count) { - actual = calloc(sizeof(char *), actual_count); + actual = calloc(actual_count, sizeof(char *)); if (actual == NULL) { failure_start(pathname, line, "Can't allocate memory"); failure_finish(NULL); @@ -1432,7 +1447,7 @@ assertion_file_time(const char *file, int line, /* Note: FILE_FLAG_BACKUP_SEMANTICS applies to open * a directory file. If not, CreateFile() will fail when * the pathname is a directory. */ - h = CreateFile(pathname, FILE_READ_ATTRIBUTES, 0, NULL, + h = CreateFileA(pathname, FILE_READ_ATTRIBUTES, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if (h == INVALID_HANDLE_VALUE) { failure_start(file, line, "Can't access %s\n", pathname); @@ -1970,7 +1985,12 @@ assertion_make_file(const char *file, int line, failure_finish(NULL); return (0); } - if (0 != chmod(path, mode)) { +#ifdef HAVE_FCHMOD + if (0 != fchmod(fd, mode)) +#else + if (0 != chmod(path, mode)) +#endif + { failure_start(file, line, "Could not chmod %s", path); failure_finish(NULL); close(fd); @@ -2340,7 +2360,7 @@ static void assert_version_id(char **qq, size_t *ss) q += 3; s -= 3; } - + /* Skip a single trailing a,b,c, or d. */ if (*q == 'a' || *q == 'b' || *q == 'c' || *q == 'd') ++q; @@ -2386,7 +2406,7 @@ void assertVersion(const char *prog, const char *base) /* Version message should start with name of program, then space. */ assert(s > prog_len + 1); - + failure("Version must start with '%s': ``%s''", base, p); if (!assertEqualMem(q, base, prog_len)) { free(p); @@ -2724,7 +2744,7 @@ canNodump(void) /* Get extended attribute value from a path */ void * getXattr(const char *path, const char *name, size_t *sizep) -{ +{ void *value = NULL; #if ARCHIVE_XATTR_SUPPORT ssize_t size; @@ -3065,7 +3085,7 @@ systemf(const char *fmt, ...) int r; va_start(ap, fmt); - vsprintf(buff, fmt, ap); + vsnprintf(buff, sizeof(buff), fmt, ap); if (verbosity > VERBOSITY_FULL) logprintf("Cmd: %s\n", buff); r = system(buff); @@ -3090,7 +3110,7 @@ slurpfile(size_t * sizep, const char *fmt, ...) int r; va_start(ap, fmt); - vsprintf(filename, fmt, ap); + vsnprintf(filename, sizeof(filename), fmt, ap); va_end(ap); f = fopen(filename, "rb"); @@ -3157,7 +3177,7 @@ extract_reference_file(const char *name) char buff[1024]; FILE *in, *out; - sprintf(buff, "%s/%s.uu", refdir, name); + snprintf(buff, sizeof(buff), "%s/%s.uu", refdir, name); in = fopen(buff, "r"); failure("Couldn't open reference file %s", buff); assert(in != NULL); @@ -3185,14 +3205,12 @@ extract_reference_file(const char *name) while (bytes > 0) { int n = 0; /* Write out 1-3 bytes from that. */ - if (bytes > 0) { - assert(VALID_UUDECODE(p[0])); - assert(VALID_UUDECODE(p[1])); - n = UUDECODE(*p++) << 18; - n |= UUDECODE(*p++) << 12; - fputc(n >> 16, out); - --bytes; - } + assert(VALID_UUDECODE(p[0])); + assert(VALID_UUDECODE(p[1])); + n = UUDECODE(*p++) << 18; + n |= UUDECODE(*p++) << 12; + fputc(n >> 16, out); + --bytes; if (bytes > 0) { assert(VALID_UUDECODE(p[0])); n |= UUDECODE(*p++) << 6; @@ -3218,7 +3236,7 @@ copy_reference_file(const char *name) FILE *in, *out; size_t rbytes; - sprintf(buff, "%s/%s", refdir, name); + snprintf(buff, sizeof(buff), "%s/%s", refdir, name); in = fopen(buff, "rb"); failure("Couldn't open reference file %s", buff); assert(in != NULL); @@ -3545,7 +3563,7 @@ test_run(int i, const char *tmpdir) exit(1); } /* Create a log file for this test. */ - sprintf(logfilename, "%s.log", tests[i].name); + snprintf(logfilename, sizeof(logfilename), "%s.log", tests[i].name); logfile = fopen(logfilename, "w"); fprintf(logfile, "%s\n\n", tests[i].name); /* Chdir() to a work dir for this specific test. */ @@ -3859,7 +3877,15 @@ main(int argc, char **argv) static const int limit = sizeof(tests) / sizeof(tests[0]); int test_set[sizeof(tests) / sizeof(tests[0])]; int i = 0, j = 0, tests_run = 0, tests_failed = 0, option; + int testprogdir_len; +#ifdef PROGRAM + int tmp2_len; +#endif time_t now; + struct tm *tmptr; +#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S) + struct tm tmbuf; +#endif char *refdir_alloc = NULL; const char *progname; char **saved_argv; @@ -3895,12 +3921,13 @@ main(int argc, char **argv) * tree. */ progname = p = argv[0]; - if ((testprogdir = (char *)malloc(strlen(progname) + 1)) == NULL) + testprogdir_len = strlen(progname) + 1; + if ((testprogdir = (char *)malloc(testprogdir_len)) == NULL) { fprintf(stderr, "ERROR: Out of memory."); exit(1); } - strcpy(testprogdir, progname); + strncpy(testprogdir, progname, testprogdir_len); while (*p != '\0') { /* Support \ or / dir separators for Windows compat. */ if (*p == '/' || *p == '\\') @@ -4042,20 +4069,21 @@ main(int argc, char **argv) #ifdef PROGRAM if (testprogfile == NULL) { - if ((tmp2 = (char *)malloc(strlen(testprogdir) + 1 + - strlen(PROGRAM) + 1)) == NULL) + tmp2_len = strlen(testprogdir) + 1 + strlen(PROGRAM) + 1; + if ((tmp2 = (char *)malloc(tmp2_len)) == NULL) { fprintf(stderr, "ERROR: Out of memory."); exit(1); } - strcpy(tmp2, testprogdir); - strcat(tmp2, "/"); - strcat(tmp2, PROGRAM); + strncpy(tmp2, testprogdir, tmp2_len); + strncat(tmp2, "/", tmp2_len); + strncat(tmp2, PROGRAM, tmp2_len); testprogfile = tmp2; } { char *testprg; + int testprg_len; #if defined(_WIN32) && !defined(__CYGWIN__) /* Command.com sometimes rejects '/' separators. */ testprg = strdup(testprogfile); @@ -4066,10 +4094,11 @@ main(int argc, char **argv) testprogfile = testprg; #endif /* Quote the name that gets put into shell command lines. */ - testprg = malloc(strlen(testprogfile) + 3); - strcpy(testprg, "\""); - strcat(testprg, testprogfile); - strcat(testprg, "\""); + testprg_len = strlen(testprogfile) + 3; + testprg = malloc(testprg_len); + strncpy(testprg, "\"", testprg_len); + strncat(testprg, testprogfile, testprg_len); + strncat(testprg, "\"", testprg_len); testprog = testprg; } #endif @@ -4091,9 +4120,15 @@ main(int argc, char **argv) */ now = time(NULL); for (i = 0; ; i++) { +#if defined(HAVE_LOCALTIME_S) + tmptr = localtime_s(&tmbuf, &now) ? NULL : &tmbuf; +#elif defined(HAVE_LOCALTIME_R) + tmptr = localtime_r(&now, &tmbuf); +#else + tmptr = localtime(&now); +#endif strftime(tmpdir_timestamp, sizeof(tmpdir_timestamp), - "%Y-%m-%dT%H.%M.%S", - localtime(&now)); + "%Y-%m-%dT%H.%M.%S", tmptr); if ((strlen(tmp) + 1 + strlen(progname) + 1 + strlen(tmpdir_timestamp) + 1 + 3) > (sizeof(tmpdir) / sizeof(char))) { @@ -4155,7 +4190,6 @@ main(int argc, char **argv) free(refdir_alloc); free(testprogdir); usage(progname); - return (1); } for (i = 0; i < test_num; i++) { tests_run++; diff --git a/unzip/CMakeLists.txt b/unzip/CMakeLists.txt new file mode 100644 index 000000000000..150eb2c6b05d --- /dev/null +++ b/unzip/CMakeLists.txt @@ -0,0 +1,41 @@ +############################################ +# +# How to build bsdunzip +# +############################################ +IF(ENABLE_UNZIP) + + SET(bsdunzip_SOURCES + bsdunzip.c + bsdunzip.h + bsdunzip_platform.h + cmdline.c + la_getline.c + la_queue.h + ../libarchive_fe/err.c + ../libarchive_fe/err.h + ../libarchive_fe/lafe_platform.h + ../libarchive_fe/passphrase.c + ../libarchive_fe/passphrase.h + ) + INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../libarchive_fe) + + # bsdunzip documentation + SET(bsdunzip_MANS bsdunzip.1) + + # How to build bsdunzip + ADD_EXECUTABLE(bsdunzip ${bsdunzip_SOURCES}) + IF(ENABLE_UNZIP_SHARED) + TARGET_LINK_LIBRARIES(bsdunzip archive ${ADDITIONAL_LIBS}) + ELSE(ENABLE_UNZIP_SHARED) + TARGET_LINK_LIBRARIES(bsdunzip archive_static ${ADDITIONAL_LIBS}) + SET_TARGET_PROPERTIES(bsdunzip PROPERTIES COMPILE_DEFINITIONS + LIBARCHIVE_STATIC) + ENDIF(ENABLE_UNZIP_SHARED) + + # Installation rules + INSTALL(TARGETS bsdunzip RUNTIME DESTINATION bin) + INSTALL_MAN(${bsdunzip_MANS}) +ENDIF(ENABLE_UNZIP) + +add_subdirectory(test) diff --git a/unzip/bsdunzip.1 b/unzip/bsdunzip.1 new file mode 100644 index 000000000000..a67ca2327066 --- /dev/null +++ b/unzip/bsdunzip.1 @@ -0,0 +1,218 @@ +.\"- +.\" Copyright (c) 2007-2008 Dag-Erling Smørgrav +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.Dd June 27, 2023 +.Dt BSDUNZIP 1 +.Os +.Sh NAME +.Nm bsdunzip +.Nd extract files from a ZIP archive +.Sh SYNOPSIS +.Nm +.Op Fl aCcfjLlnopqtuvy +.Op { Fl O | Fl I No } Ar encoding +.Op Fl d Ar dir +.Op Fl x Ar pattern +.Op Fl P Ar password +.Ar zipfile +.Op Ar member ... +.Sh DESCRIPTION +.\" ... +The following options are available: +.Bl -tag -width Fl +.It Fl a +When extracting a text file, convert DOS-style line endings to +Unix-style line endings. +.It Fl C +Match file names case-insensitively. +.It Fl c +Extract to stdout/screen. +When extracting files from the zipfile, they are written to stdout. +This is similar to +.Fl p , +but does not suppress normal output. +.It Fl d Ar dir +Extract files into the specified directory rather than the current +directory. +.It Fl f +Update existing. +Extract only files from the zipfile if a file with the same name +already exists on disk and is older than the former. +Otherwise, the file is silently skipped. +.It Fl I Ar encoding +.It Fl O Ar encoding +Convert filenames from the specified encoding. +.It Fl j +Ignore directories stored in the zipfile; instead, extract all files +directly into the extraction directory. +.It Fl L +Convert the names of the extracted files and directories to lowercase. +.It Fl l +List, rather than extract, the contents of the zipfile. +.It Fl n +No overwrite. +When extracting a file from the zipfile, if a file with the same name +already exists on disk, the file is silently skipped. +.It Fl o +Overwrite. +When extracting a file from the zipfile, if a file with the same name +already exists on disk, the existing file is replaced with the file +from the zipfile. +.It Fl p +Extract to stdout. +When extracting files from the zipfile, they are written to stdout. +The normal output is suppressed as if +.Fl q +was specified. +.It Fl P Ar password +Extract encrypted files using a password. +Putting a password on the command line using this option can be +insecure. +.It Fl q +Quiet: print less information while extracting. +.It Fl t +Test: do not extract anything, but verify the checksum of every file +in the archive. +.It Fl u +Update. +When extracting a file from the zipfile, if a file with the same name +already exists on disk, the existing file is replaced with the file +from the zipfile if and only if the latter is newer than the former. +Otherwise, the file is silently skipped. +.It Fl v +List verbosely, rather than extract, the contents of the zipfile. +This differs from +.Fl l +by using the long listing. +Note that most of the data is currently fake and does not reflect the +content of the archive. +.It Fl x Ar pattern +Exclude files matching the pattern +.Ar pattern . +.It Fl y +Print four digit years in listings instead of two. +.It Fl Z Ar mode +Emulate +.Xr zipinfo 1L +mode. +Enabling +.Xr zipinfo 1L +mode changes the way in which additional arguments are parsed. +Currently only +.Xr zipinfo 1L +mode 1 is supported, which lists the file names one per line. +.It Ar [member ...] +Optional list of members to extract from the zipfile. +Can include patterns, e.g., +.Ar 'memberdir/*' +will extract all files and dirs below memberdir. +.El +.Pp +Note that only one of +.Fl n , +.Fl o , +and +.Fl u +may be specified. +If specified filename is +.Qq - , +then data is read from +.Va stdin . +.Sh ENVIRONMENT +If the +.Ev UNZIP_DEBUG +environment variable is defined, the +.Fl q +command-line option has no effect, and additional debugging +information will be printed to +.Va stderr . +.Sh COMPATIBILITY +The +.Nm +utility aims to be sufficiently compatible with other implementations +to serve as a drop-in replacement in the context of the +.Xr ports 7 +system. +No attempt has been made to replicate functionality which is not +required for that purpose. +.Pp +For compatibility reasons, command-line options will be recognized if +they are listed not only before but also after the name of the +zipfile. +.Pp +Normally, the +.Fl a +option should only affect files which are marked as text files in the +zipfile's central directory. +Since the +.Xr archive 3 +library does not provide access to that information, it is not available +to the +.Nm +utility. +Instead, the +.Nm +utility will assume that a file is a text file if no non-ASCII +characters are present within the first block of data decompressed for +that file. +If non-ASCII characters appear in subsequent blocks of data, a warning +will be issued. +.Pp +The +.Nm +utility is only able to process ZIP archives handled by +.Xr libarchive 3 . +Depending on the installed version of +.Xr libarchive 3 , +this may or may not include self-extracting or ZIPX archives. +.Sh SEE ALSO +.Xr libarchive 3 +.Sh HISTORY +The +.Nm +utility appeared in +.Fx 8.0 . +.Sh AUTHORS +The +.Nm +utility and this manual page were written by +.An Dag-Erling Sm\(/orgrav Aq Mt des@FreeBSD.org . +It uses the +.Xr archive 3 +library developed by +.An Tim Kientzle Aq Mt kientzle@FreeBSD.org . +.Sh CAVEATS +The +.Nm +utility performs two scans of the command-line for arguments before +and after the archive name, so as to maintain compatibility with +Info-ZIP unzip. +As a result, the POSIX +.Ql -- +double-dash string used to separate options from arguments will need to +be repeated. +For example, to extract a "-a.jpg" from "-b.zip" with overwrite, one +would need to invoke +.Dl bsdunzip -o -- -a.jpg -- -b.zip diff --git a/unzip/bsdunzip.c b/unzip/bsdunzip.c new file mode 100644 index 000000000000..af3fb14c3636 --- /dev/null +++ b/unzip/bsdunzip.c @@ -0,0 +1,1290 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2009, 2010 Joerg Sonnenberger <joerg@NetBSD.org> + * Copyright (c) 2007-2008 Dag-Erling Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file would be much shorter if we didn't care about command-line + * compatibility with Info-ZIP's UnZip, which requires us to duplicate + * parts of libarchive in order to gain more detailed control of its + * behaviour for the purpose of implementing the -n, -o, -L and -a + * options. + */ + +#include "bsdunzip_platform.h" + +#ifdef HAVE_SYS_QUEUE_H +#include <sys/queue.h> +#else +#include "la_queue.h" +#endif +#ifdef HAVE_SYS_STAT_H +#include <sys/stat.h> +#endif + +#ifdef HAVE_CTYPE_H +#include <ctype.h> +#endif +#ifdef HAVE_ERRNO_H +#include <errno.h> +#endif +#ifdef HAVE_FCNTL_H +#include <fcntl.h> +#endif +#ifdef HAVE_FNMATCH_H +#include <fnmatch.h> +#endif +#ifdef HAVE_LOCALE_H +#include <locale.h> +#endif +#ifdef HAVE_STDARG_H +#include <stdarg.h> +#endif +#include <stdio.h> +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif +#ifdef HAVE_STRING_H +#include <string.h> +#endif +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#if ((!defined(HAVE_UTIMENSAT) && defined(HAVE_LUTIMES)) || \ + (!defined(HAVE_FUTIMENS) && defined(HAVE_FUTIMES))) +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#endif +#ifdef HAVE_GETOPT_OPTRESET +#include <getopt.h> +#endif + +#include "bsdunzip.h" +#include "passphrase.h" +#include "err.h" + +/* command-line options */ +static int a_opt; /* convert EOL */ +static int C_opt; /* match case-insensitively */ +static int c_opt; /* extract to stdout */ +static const char *d_arg; /* directory */ +static int f_opt; /* update existing files only */ +static const char *O_arg; /* encoding */ +static int j_opt; /* junk directories */ +static int L_opt; /* lowercase names */ +static int n_opt; /* never overwrite */ +static int o_opt; /* always overwrite */ +static int p_opt; /* extract to stdout, quiet */ +static const char *P_arg; /* passphrase */ +static int q_opt; /* quiet */ +static int t_opt; /* test */ +static int u_opt; /* update */ +static int v_opt; /* verbose/list */ +static const char *y_str = ""; /* 4 digit year */ +static int Z1_opt; /* zipinfo mode list files only */ +static int version_opt; /* version string */ + +/* debug flag */ +static int unzip_debug; + +/* zipinfo mode */ +static int zipinfo_mode; + +/* running on tty? */ +static int tty; + +/* processing exclude list */ +static int unzip_exclude_mode = 0; + +int bsdunzip_optind; + +/* convenience macro */ +/* XXX should differentiate between ARCHIVE_{WARN,FAIL,RETRY} */ +#define ac(call) \ + do { \ + int acret = (call); \ + if (acret != ARCHIVE_OK) \ + errorx("%s", archive_error_string(a)); \ + } while (0) + +/* + * Indicates that last info() did not end with EOL. This helps error() et + * al. avoid printing an error message on the same line as an incomplete + * informational message. + */ +static int noeol; + +/* for an interactive passphrase input */ +static char *passphrase_buf; + +/* fatal error message + errno */ +static void +error(const char *fmt, ...) +{ + va_list ap; + + if (noeol) + fprintf(stdout, "\n"); + fflush(stdout); + fprintf(stderr, "unzip: "); + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + fprintf(stderr, ": %s\n", strerror(errno)); + exit(EXIT_FAILURE); +} + +/* fatal error message, no errno */ +static void +errorx(const char *fmt, ...) +{ + va_list ap; + + if (noeol) + fprintf(stdout, "\n"); + fflush(stdout); + fprintf(stderr, "unzip: "); + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + fprintf(stderr, "\n"); + exit(EXIT_FAILURE); +} + +/* non-fatal error message + errno */ +static void +warning(const char *fmt, ...) +{ + va_list ap; + + if (noeol) + fprintf(stdout, "\n"); + fflush(stdout); + fprintf(stderr, "unzip: "); + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + fprintf(stderr, ": %s\n", strerror(errno)); +} + +/* non-fatal error message, no errno */ +static void +warningx(const char *fmt, ...) +{ + va_list ap; + + if (noeol) + fprintf(stdout, "\n"); + fflush(stdout); + fprintf(stderr, "unzip: "); + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + fprintf(stderr, "\n"); +} + +/* informational message (if not -q) */ +static void +info(const char *fmt, ...) +{ + va_list ap; + + if (q_opt && !unzip_debug) + return; + va_start(ap, fmt); + vfprintf(stdout, fmt, ap); + va_end(ap); + fflush(stdout); + + if (*fmt == '\0') + noeol = 1; + else + noeol = fmt[strlen(fmt) - 1] != '\n'; +} + +/* debug message (if unzip_debug) */ +static void +debug(const char *fmt, ...) +{ + va_list ap; + + if (!unzip_debug) + return; + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + fflush(stderr); + + if (*fmt == '\0') + noeol = 1; + else + noeol = fmt[strlen(fmt) - 1] != '\n'; +} + +/* duplicate a path name, possibly converting to lower case */ +static char * +pathdup(const char *path) +{ + char *str; + size_t i, len; + + if (path == NULL || path[0] == '\0') + return (NULL); + + len = strlen(path); + while (len && path[len - 1] == '/') + len--; + if ((str = malloc(len + 1)) == NULL) { + errno = ENOMEM; + error("malloc()"); + } + if (L_opt) { + for (i = 0; i < len; ++i) + str[i] = tolower((unsigned char)path[i]); + } else { + memcpy(str, path, len); + } + str[len] = '\0'; + + return (str); +} + +/* concatenate two path names */ +static char * +pathcat(const char *prefix, const char *path) +{ + char *str; + size_t prelen, len; + + prelen = prefix ? strlen(prefix) + 1 : 0; + len = strlen(path) + 1; + if ((str = malloc(prelen + len)) == NULL) { + errno = ENOMEM; + error("malloc()"); + } + if (prefix) { + memcpy(str, prefix, prelen); /* includes zero */ + str[prelen - 1] = '/'; /* splat zero */ + } + memcpy(str + prelen, path, len); /* includes zero */ + + return (str); +} + +/* + * Pattern lists for include / exclude processing + */ +struct pattern { + STAILQ_ENTRY(pattern) link; + char pattern[]; +}; + +STAILQ_HEAD(pattern_list, pattern); +static struct pattern_list include = STAILQ_HEAD_INITIALIZER(include); +static struct pattern_list exclude = STAILQ_HEAD_INITIALIZER(exclude); + +/* + * Add an entry to a pattern list + */ +static void +add_pattern(struct pattern_list *list, const char *pattern) +{ + struct pattern *entry; + size_t len; + + debug("adding pattern '%s'\n", pattern); + len = strlen(pattern); + if ((entry = malloc(sizeof *entry + len + 1)) == NULL) { + errno = ENOMEM; + error("malloc()"); + } + memcpy(entry->pattern, pattern, len + 1); + STAILQ_INSERT_TAIL(list, entry, link); +} + +/* + * Match a string against a list of patterns + */ +static int +match_pattern(struct pattern_list *list, const char *str) +{ + struct pattern *entry; + + STAILQ_FOREACH(entry, list, link) { +#ifdef HAVE_FNMATCH + if (fnmatch(entry->pattern, str, C_opt ? FNM_CASEFOLD : 0) == 0) + return (1); +#else +#error "Unsupported platform: fnmatch() is required" +#endif + } + return (0); +} + +/* + * Verify that a given pathname is in the include list and not in the + * exclude list. + */ +static int +accept_pathname(const char *pathname) +{ + + if (!STAILQ_EMPTY(&include) && !match_pattern(&include, pathname)) + return (0); + if (!STAILQ_EMPTY(&exclude) && match_pattern(&exclude, pathname)) + return (0); + return (1); +} + +/* + * Create the specified directory with the specified mode, taking certain + * precautions on they way. + */ +static void +make_dir(const char *path, int mode) +{ + struct stat sb; + + if (lstat(path, &sb) == 0) { + if (S_ISDIR(sb.st_mode)) + return; + /* + * Normally, we should either ask the user about removing + * the non-directory of the same name as a directory we + * wish to create, or respect the -n or -o command-line + * options. However, this may lead to a later failure or + * even compromise (if this non-directory happens to be a + * symlink to somewhere unsafe), so we don't. + */ + + /* + * Don't check unlink() result; failure will cause mkdir() + * to fail later, which we will catch. + */ + (void)unlink(path); + } + if (mkdir(path, mode) != 0 && errno != EEXIST) + error("mkdir('%s')", path); +} + +/* + * Ensure that all directories leading up to (but not including) the + * specified path exist. + * + * XXX inefficient + modifies the file in-place + */ +static void +make_parent(char *path) +{ + struct stat sb; + char *sep; + + sep = strrchr(path, '/'); + if (sep == NULL || sep == path) + return; + *sep = '\0'; + if (lstat(path, &sb) == 0) { + if (S_ISDIR(sb.st_mode)) { + *sep = '/'; + return; + } + unlink(path); + } + make_parent(path); + mkdir(path, 0755); + *sep = '/'; + +#if 0 + for (sep = path; (sep = strchr(sep, '/')) != NULL; sep++) { + /* root in case of absolute d_arg */ + if (sep == path) + continue; + *sep = '\0'; + make_dir(path, 0755); + *sep = '/'; + } +#endif +} + +/* + * Extract a directory. + */ +static void +extract_dir(struct archive *a, struct archive_entry *e, const char *path) +{ + int mode; + + /* + * Dropbox likes to create '/' directory entries, just ignore + * such junk. + */ + if (*path == '\0') + return; + + mode = archive_entry_mode(e) & 0777; + if (mode == 0) + mode = 0755; + + /* + * Some zipfiles contain directories with weird permissions such + * as 0644 or 0444. This can cause strange issues such as being + * unable to extract files into the directory we just created, or + * the user being unable to remove the directory later without + * first manually changing its permissions. Therefore, we whack + * the permissions into shape, assuming that the user wants full + * access and that anyone who gets read access also gets execute + * access. + */ + mode |= 0700; + if (mode & 0040) + mode |= 0010; + if (mode & 0004) + mode |= 0001; + + info(" creating: %s/\n", path); + make_dir(path, mode); + ac(archive_read_data_skip(a)); +} + +static unsigned char buffer[8192]; +static char spinner[] = { '|', '/', '-', '\\' }; + +static int +handle_existing_file(char **path) +{ + size_t alen; + ssize_t len; + char buf[4]; + + for (;;) { + fprintf(stderr, + "replace %s? [y]es, [n]o, [A]ll, [N]one, [r]ename: ", + *path); + if (fgets(buf, sizeof(buf), stdin) == NULL) { + clearerr(stdin); + printf("NULL\n(EOF or read error, " + "treating as \"[N]one\"...)\n"); + n_opt = 1; + return -1; + } + switch (*buf) { + case 'A': + o_opt = 1; + /* FALLTHROUGH */ + case 'y': + case 'Y': + (void)unlink(*path); + return 1; + case 'N': + n_opt = 1; + /* FALLTHROUGH */ + case 'n': + return -1; + case 'r': + case 'R': + printf("New name: "); + fflush(stdout); + free(*path); + *path = NULL; + alen = 0; + len = getline(path, &alen, stdin); + if ((*path)[len - 1] == '\n') + (*path)[len - 1] = '\0'; + return 0; + default: + break; + } + } +} + +/* + * Detect binary files by a combination of character white list and + * black list. NUL bytes and other control codes without use in text files + * result directly in switching the file to binary mode. Otherwise, at least + * one white-listed byte has to be found. + * + * Black-listed: 0..6, 14..25, 28..31 + * 0xf3ffc07f = 11110011111111111100000001111111b + * White-listed: 9..10, 13, >= 32 + * 0x00002600 = 00000000000000000010011000000000b + * + * See the proginfo/txtvsbin.txt in the zip sources for a detailed discussion. + */ +#define BYTE_IS_BINARY(x) ((x) < 32 && (0xf3ffc07fU & (1U << (x)))) +#define BYTE_IS_TEXT(x) ((x) >= 32 || (0x00002600U & (1U << (x)))) + +static int +check_binary(const unsigned char *buf, size_t len) +{ + int rv; + for (rv = 1; len--; ++buf) { + if (BYTE_IS_BINARY(*buf)) + return 1; + if (BYTE_IS_TEXT(*buf)) + rv = 0; + } + + return rv; +} + +/* + * Extract to a file descriptor + */ +static int +extract2fd(struct archive *a, char *pathname, int fd) +{ + int cr, text, warn; + ssize_t len; + unsigned char *p, *q, *end; + + text = a_opt; + warn = 0; + cr = 0; + + /* loop over file contents and write to fd */ + for (int n = 0; ; n++) { + if (fd != STDOUT_FILENO) + if (tty && (n % 4) == 0) + info(" %c\b\b", spinner[(n / 4) % sizeof spinner]); + + len = archive_read_data(a, buffer, sizeof buffer); + + if (len < 0) + ac(len); + + /* left over CR from previous buffer */ + if (a_opt && cr) { + if (len == 0 || buffer[0] != '\n') + if (write(fd, "\r", 1) != 1) + error("write('%s')", pathname); + cr = 0; + } + + /* EOF */ + if (len == 0) + break; + end = buffer + len; + + /* + * Detect whether this is a text file. The correct way to + * do this is to check the least significant bit of the + * "internal file attributes" field of the corresponding + * file header in the central directory, but libarchive + * does not provide access to this field, so we have to + * guess by looking for non-ASCII characters in the + * buffer. Hopefully we won't guess wrong. If we do + * guess wrong, we print a warning message later. + */ + if (a_opt && n == 0) { + if (check_binary(buffer, len)) + text = 0; + } + + /* simple case */ + if (!a_opt || !text) { + if (write(fd, buffer, len) != len) + error("write('%s')", pathname); + continue; + } + + /* hard case: convert \r\n to \n (sigh...) */ + for (p = buffer; p < end; p = q + 1) { + for (q = p; q < end; q++) { + if (!warn && BYTE_IS_BINARY(*q)) { + warningx("%s may be corrupted due" + " to weak text file detection" + " heuristic", pathname); + warn = 1; + } + if (q[0] != '\r') + continue; + if (&q[1] == end) { + cr = 1; + break; + } + if (q[1] == '\n') + break; + } + if (write(fd, p, q - p) != q - p) + error("write('%s')", pathname); + } + } + + return text; +} + +/* + * Extract a regular file. + */ +static void +extract_file(struct archive *a, struct archive_entry *e, char **path) +{ + int mode; + struct timespec mtime; + struct stat sb; + int fd, check, text; + const char *linkname; +#if defined(HAVE_UTIMENSAT) || defined(HAVE_FUTIMENS) + struct timespec ts[2]; +#endif +#if ((!defined(HAVE_UTIMENSAT) && defined(HAVE_LUTIMES)) || \ + (!defined(HAVE_FUTIMENS) && defined(HAVE_FUTIMES))) + struct timeval times[2]; +#endif + + mode = archive_entry_mode(e) & 0777; + if (mode == 0) + mode = 0644; + mtime.tv_sec = archive_entry_mtime(e); + mtime.tv_nsec = archive_entry_mtime_nsec(e); + + /* look for existing file of same name */ +recheck: + if (lstat(*path, &sb) == 0) { + if (u_opt || f_opt) { + /* check if up-to-date */ + if (S_ISREG(sb.st_mode) && ( +#if HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC + sb.st_mtimespec.tv_sec > mtime.tv_sec || + (sb.st_mtimespec.tv_sec == mtime.tv_sec && + sb.st_mtimespec.tv_nsec >= mtime.tv_nsec) +#elif HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC + sb.st_mtim.tv_sec > mtime.tv_sec || + (sb.st_mtim.tv_sec == mtime.tv_sec && + sb.st_mtim.tv_nsec >= mtime.tv_nsec) +#elif HAVE_STRUCT_STAT_ST_MTIME_N + sb.st_mtime > mtime.tv_sec || + (sb.st_mtime == mtime.tv_sec && + sb.st_mtime_n => mtime.tv_nsec) +#elif HAVE_STRUCT_STAT_ST_MTIME_USEC + sb.st_mtime > mtime.tv_sec || + (sb.st_mtime == mtime.tv_sec && + sb.st_mtime_usec => mtime.tv_nsec / 1000) +#else + sb.st_mtime > mtime.tv_sec +#endif + )) + return; + (void)unlink(*path); + } else if (o_opt) { + /* overwrite */ + (void)unlink(*path); + } else if (n_opt) { + /* do not overwrite */ + return; + } else { + check = handle_existing_file(path); + if (check == 0) + goto recheck; + if (check == -1) + return; /* do not overwrite */ + } + } else { + if (f_opt) + return; + } + +#if defined(HAVE_UTIMENSAT) || defined(HAVE_FUTIMENS) + ts[0].tv_sec = 0; + ts[0].tv_nsec = UTIME_NOW; + ts[1] = mtime; +#endif +#if ((!defined(HAVE_UTIMENSAT) && defined(HAVE_LUTIMES)) || \ + (!defined(HAVE_FUTIMENS) && defined(HAVE_FUTIMES))) + times[0].tv_sec = 0; + times[0].tv_usec = -1; + times[1].tv_sec = mtime.tv_sec; + times[1].tv_usec = mtime.tv_nsec / 1000; +#endif + + /* process symlinks */ + linkname = archive_entry_symlink(e); + if (linkname != NULL) { + if (symlink(linkname, *path) != 0) + error("symlink('%s')", *path); + info(" extracting: %s -> %s\n", *path, linkname); +#ifdef HAVE_LCHMOD + if (lchmod(*path, mode) != 0) + warning("Cannot set mode for '%s'", *path); +#endif + /* set access and modification time */ +#if defined(HAVE_UTIMENSAT) + if (utimensat(AT_FDCWD, *path, ts, AT_SYMLINK_NOFOLLOW) != 0) + warning("utimensat('%s')", *path); +#elif defined(HAVE_LUTIMES) + gettimeofday(×[0], NULL); + if (lutimes(*path, times) != 0) + warning("lutimes('%s')", *path); +#endif + return; + } + + if ((fd = open(*path, O_RDWR|O_CREAT|O_TRUNC, mode)) < 0) + error("open('%s')", *path); + + info(" extracting: %s", *path); + + text = extract2fd(a, *path, fd); + + if (tty) + info(" \b\b"); + if (text) + info(" (text)"); + info("\n"); + + /* set access and modification time */ +#if defined(HAVE_FUTIMENS) + if (futimens(fd, ts) != 0) + error("futimens('%s')", *path); +#elif defined(HAVE_FUTIMES) + gettimeofday(×[0], NULL); + if (futimes(fd, times) != 0) + error("futimes('%s')", *path); +#endif + if (close(fd) != 0) + error("close('%s')", *path); +} + +/* + * Extract a zipfile entry: first perform some sanity checks to ensure + * that it is either a directory or a regular file and that the path is + * not absolute and does not try to break out of the current directory; + * then call either extract_dir() or extract_file() as appropriate. + * + * This is complicated a bit by the various ways in which we need to + * manipulate the path name. Case conversion (if requested by the -L + * option) happens first, but the include / exclude patterns are applied + * to the full converted path name, before the directory part of the path + * is removed in accordance with the -j option. Sanity checks are + * intentionally done earlier than they need to be, so the user will get a + * warning about insecure paths even for files or directories which + * wouldn't be extracted anyway. + */ +static void +extract(struct archive *a, struct archive_entry *e) +{ + char *pathname, *realpathname; + mode_t filetype; + char *p, *q; + + if ((pathname = pathdup(archive_entry_pathname(e))) == NULL) { + warningx("skipping empty or unreadable filename entry"); + ac(archive_read_data_skip(a)); + return; + } + filetype = archive_entry_filetype(e); + + /* sanity checks */ + if (pathname[0] == '/' || + strncmp(pathname, "../", 3) == 0 || + strstr(pathname, "/../") != NULL) { + warningx("skipping insecure entry '%s'", pathname); + ac(archive_read_data_skip(a)); + free(pathname); + return; + } + + /* I don't think this can happen in a zipfile.. */ + if (!S_ISDIR(filetype) && !S_ISREG(filetype) && !S_ISLNK(filetype)) { + warningx("skipping non-regular entry '%s'", pathname); + ac(archive_read_data_skip(a)); + free(pathname); + return; + } + + /* skip directories in -j case */ + if (S_ISDIR(filetype) && j_opt) { + ac(archive_read_data_skip(a)); + free(pathname); + return; + } + + /* apply include / exclude patterns */ + if (!accept_pathname(pathname)) { + ac(archive_read_data_skip(a)); + free(pathname); + return; + } + + /* apply -j and -d */ + if (j_opt) { + for (p = q = pathname; *p; ++p) + if (*p == '/') + q = p + 1; + realpathname = pathcat(d_arg, q); + } else { + realpathname = pathcat(d_arg, pathname); + } + + /* ensure that parent directory exists */ + make_parent(realpathname); + + if (S_ISDIR(filetype)) + extract_dir(a, e, realpathname); + else + extract_file(a, e, &realpathname); + + free(realpathname); + free(pathname); +} + +static void +extract_stdout(struct archive *a, struct archive_entry *e) +{ + char *pathname; + mode_t filetype; + + if ((pathname = pathdup(archive_entry_pathname(e))) == NULL) { + warningx("skipping empty or unreadable filename entry"); + ac(archive_read_data_skip(a)); + return; + } + filetype = archive_entry_filetype(e); + + /* I don't think this can happen in a zipfile.. */ + if (!S_ISDIR(filetype) && !S_ISREG(filetype) && !S_ISLNK(filetype)) { + warningx("skipping non-regular entry '%s'", pathname); + ac(archive_read_data_skip(a)); + free(pathname); + return; + } + + /* skip directories in -j case */ + if (S_ISDIR(filetype)) { + ac(archive_read_data_skip(a)); + free(pathname); + return; + } + + /* apply include / exclude patterns */ + if (!accept_pathname(pathname)) { + ac(archive_read_data_skip(a)); + free(pathname); + return; + } + + if (c_opt) + info("x %s\n", pathname); + + (void)extract2fd(a, pathname, STDOUT_FILENO); + + free(pathname); +} + +/* + * Print the name of an entry to stdout. + */ +static void +list(struct archive *a, struct archive_entry *e) +{ + char buf[20]; + time_t mtime; + struct tm *tm; + + mtime = archive_entry_mtime(e); + tm = localtime(&mtime); + if (*y_str) + strftime(buf, sizeof(buf), "%m-%d-%G %R", tm); + else + strftime(buf, sizeof(buf), "%m-%d-%g %R", tm); + + if (!zipinfo_mode) { + if (v_opt == 1) { + printf(" %8ju %s %s\n", + (uintmax_t)archive_entry_size(e), + buf, archive_entry_pathname(e)); + } else if (v_opt == 2) { + printf("%8ju Stored %7ju 0%% %s %08x %s\n", + (uintmax_t)archive_entry_size(e), + (uintmax_t)archive_entry_size(e), + buf, + 0U, + archive_entry_pathname(e)); + } + } else { + if (Z1_opt) + printf("%s\n",archive_entry_pathname(e)); + } + ac(archive_read_data_skip(a)); +} + +/* + * Extract to memory to check CRC + */ +static int +test(struct archive *a, struct archive_entry *e) +{ + ssize_t len; + int error_count; + + error_count = 0; + if (S_ISDIR(archive_entry_filetype(e))) + return 0; + + info(" testing: %s\t", archive_entry_pathname(e)); + while ((len = archive_read_data(a, buffer, sizeof buffer)) > 0) + /* nothing */; + if (len < 0) { + info(" %s\n", archive_error_string(a)); + ++error_count; + } else { + info(" OK\n"); + } + + /* shouldn't be necessary, but it doesn't hurt */ + ac(archive_read_data_skip(a)); + + return error_count; +} + +/* + * Callback function for reading passphrase. + * Originally from cpio.c and passphrase.c, libarchive. + */ +#define PPBUFF_SIZE 1024 +static const char * +passphrase_callback(struct archive *a, void *_client_data) +{ + char *p; + + (void)a; /* UNUSED */ + (void)_client_data; /* UNUSED */ + + if (passphrase_buf == NULL) { + passphrase_buf = malloc(PPBUFF_SIZE); + if (passphrase_buf == NULL) { + errno = ENOMEM; + error("malloc()"); + } + } + + p = lafe_readpassphrase("\nEnter password: ", passphrase_buf, + PPBUFF_SIZE); + + if (p == NULL && errno != EINTR) + error("Error reading password"); + + return p; +} + +/* + * Main loop: open the zipfile, iterate over its contents and decide what + * to do with each entry. + */ +static void +unzip(const char *fn) +{ + struct archive *a; + struct archive_entry *e; + int ret; + uintmax_t total_size, file_count, error_count; + + if ((a = archive_read_new()) == NULL) + error("archive_read_new failed"); + + ac(archive_read_support_format_zip(a)); + + if (O_arg) + ac(archive_read_set_format_option(a, "zip", "hdrcharset", O_arg)); + + if (P_arg) + archive_read_add_passphrase(a, P_arg); + else + archive_read_set_passphrase_callback(a, NULL, + &passphrase_callback); + + ac(archive_read_open_filename(a, fn, 8192)); + + if (!zipinfo_mode) { + if (!p_opt && !q_opt) + printf("Archive: %s\n", fn); + if (v_opt == 1) { + printf(" Length %sDate Time Name\n", y_str); + printf(" -------- %s---- ---- ----\n", y_str); + } else if (v_opt == 2) { + printf(" Length Method Size Ratio %sDate Time CRC-32 Name\n", y_str); + printf("-------- ------ ------- ----- %s---- ---- ------ ----\n", y_str); + } + } + + total_size = 0; + file_count = 0; + error_count = 0; + for (;;) { + ret = archive_read_next_header(a, &e); + if (ret == ARCHIVE_EOF) + break; + ac(ret); + if (!zipinfo_mode) { + if (t_opt) + error_count += test(a, e); + else if (v_opt) + list(a, e); + else if (p_opt || c_opt) + extract_stdout(a, e); + else + extract(a, e); + } else { + if (Z1_opt) + list(a, e); + } + + total_size += archive_entry_size(e); + ++file_count; + } + + if (zipinfo_mode) { + if (v_opt == 1) { + printf(" -------- %s-------\n", y_str); + printf(" %8ju %s%ju file%s\n", + total_size, y_str, file_count, file_count != 1 ? "s" : ""); + } else if (v_opt == 2) { + printf("-------- ------- --- %s-------\n", y_str); + printf("%8ju %7ju 0%% %s%ju file%s\n", + total_size, total_size, y_str, file_count, + file_count != 1 ? "s" : ""); + } + } + + ac(archive_read_free(a)); + + if (passphrase_buf != NULL) { + memset(passphrase_buf, 0, PPBUFF_SIZE); + free(passphrase_buf); + } + + if (t_opt) { + if (error_count > 0) { + errorx("%ju checksum error(s) found.", error_count); + } + else { + printf("No errors detected in compressed data of %s.\n", + fn); + } + } +} + +static void +usage(void) +{ + + fprintf(stderr, +"Usage: unzip [-aCcfjLlnopqtuvyZ1] [{-O|-I} encoding] [-d dir] [-x pattern] [-P password] zipfile\n" +" [member ...]\n"); + exit(EXIT_FAILURE); +} + +static void +version(void) +{ + printf("bsdunzip %s - %s \n", + BSDUNZIP_VERSION_STRING, + archive_version_details()); + exit(0); +} + +static int +getopts(int argc, char *argv[]) +{ + struct bsdunzip *bsdunzip, bsdunzip_storage; + int opt; + bsdunzip_optind = 1; + + bsdunzip = &bsdunzip_storage; + memset(bsdunzip, 0, sizeof(*bsdunzip)); + + bsdunzip->argv = argv; + bsdunzip->argc = argc; + + while ((opt = bsdunzip_getopt(bsdunzip)) != -1) { + unzip_exclude_mode = 0; + switch (opt) { + case 'a': + a_opt = 1; + break; + case 'C': + C_opt = 1; + break; + case 'c': + c_opt = 1; + break; + case 'd': + d_arg = bsdunzip->argument; + break; + case 'f': + f_opt = 1; + break; + case 'I': + case 'O': + O_arg = bsdunzip->argument; + break; + case 'j': + j_opt = 1; + break; + case 'L': + L_opt = 1; + break; + case 'l': + if (v_opt == 0) + v_opt = 1; + break; + case 'n': + n_opt = 1; + break; + case 'o': + o_opt = 1; + q_opt = 1; + break; + case 'p': + p_opt = 1; + break; + case 'P': + P_arg = bsdunzip->argument; + break; + case 'q': + q_opt = 1; + break; + case 't': + t_opt = 1; + break; + case 'u': + u_opt = 1; + break; + case 'v': + v_opt = 2; + break; + case 'x': + add_pattern(&exclude, bsdunzip->argument); + unzip_exclude_mode = 1; + break; + case 'y': + y_str = " "; + break; + case 'Z': + zipinfo_mode = 1; + if (bsdunzip->argument != NULL && + strcmp(bsdunzip->argument, "1") == 0) { + Z1_opt = 1; + } + break; + case OPTION_VERSION: + version_opt = 1; + break; + case OPTION_NONE: + break; + default: + usage(); + } + if (opt == OPTION_NONE) + break; + } + return (bsdunzip_optind); +} + +int +main(int argc, char *argv[]) +{ + const char *zipfile; + int nopts; + + lafe_setprogname(*argv, "bsdunzip"); + +#if HAVE_SETLOCALE + if (setlocale(LC_ALL, "") == NULL) + lafe_warnc(0, "Failed to set default locale"); +#endif + + if (isatty(STDOUT_FILENO)) + tty = 1; + + if (getenv("UNZIP_DEBUG") != NULL) + unzip_debug = 1; + for (int i = 0; i < argc; ++i) + debug("%s%c", argv[i], (i < argc - 1) ? ' ' : '\n'); + +#ifdef __GLIBC__ + /* Prevent GNU getopt(3) from rearranging options. */ + setenv("POSIXLY_CORRECT", "", 1); +#endif + /* + * Info-ZIP's unzip(1) expects certain options to come before the + * zipfile name, and others to come after - though it does not + * enforce this. For simplicity, we accept *all* options both + * before and after the zipfile name. + */ + nopts = getopts(argc, argv); + + if (version_opt == 1) + version(); + + /* + * When more of the zipinfo mode options are implemented, this + * will need to change. + */ + if (zipinfo_mode && !Z1_opt) { + printf("Zipinfo mode needs additional options\n"); + exit(EXIT_FAILURE); + } + + if (argc <= nopts) + usage(); + zipfile = argv[nopts++]; + + if (strcmp(zipfile, "-") == 0) + zipfile = NULL; /* STDIN */ + + unzip_exclude_mode = 0; + + while (nopts < argc && *argv[nopts] != '-') + add_pattern(&include, argv[nopts++]); + + nopts--; /* fake argv[0] */ + nopts += getopts(argc - nopts, argv + nopts); + + /* + * For compatibility with Info-ZIP's unzip(1) we need to treat + * non-option arguments following an -x after the zipfile as + * exclude list members. + */ + if (unzip_exclude_mode) { + while (nopts < argc && *argv[nopts] != '-') + add_pattern(&exclude, argv[nopts++]); + nopts--; /* fake argv[0] */ + nopts += getopts(argc - nopts, argv + nopts); + } + + /* There may be residual arguments if we encountered -- */ + while (nopts < argc) + add_pattern(&include, argv[nopts++]); + + if (n_opt + o_opt + u_opt > 1) + errorx("-n, -o and -u are contradictory"); + + unzip(zipfile); + + exit(EXIT_SUCCESS); +} diff --git a/unzip/bsdunzip.h b/unzip/bsdunzip.h new file mode 100644 index 000000000000..ab81e3930ec2 --- /dev/null +++ b/unzip/bsdunzip.h @@ -0,0 +1,60 @@ +/*- + * Copyright (c) 2023, Martin Matuska + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef BSDUNZIP_H_INCLUDED +#define BSDUNZIP_H_INCLUDED + +#if defined(PLATFORM_CONFIG_H) +/* Use hand-built config.h in environments that need it. */ +#include PLATFORM_CONFIG_H +#else +/* Not having a config.h of some sort is a serious problem. */ +#include "config.h" +#endif + +#include <archive.h> +#include <archive_entry.h> + +struct bsdunzip { + /* Option parser state */ + int getopt_state; + char *getopt_word; + + /* Miscellaneous state information */ + int argc; + char **argv; + const char *argument; +}; + +enum { + OPTION_NONE, + OPTION_VERSION +}; + +int bsdunzip_getopt(struct bsdunzip *); + +extern int bsdunzip_optind; + +#endif diff --git a/unzip/bsdunzip_platform.h b/unzip/bsdunzip_platform.h new file mode 100644 index 000000000000..d4fcbb1aeab4 --- /dev/null +++ b/unzip/bsdunzip_platform.h @@ -0,0 +1,65 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * This header is the first thing included in any of the bsdtar + * source files. As far as possible, platform-specific issues should + * be dealt with here and not within individual source files. + */ + +#ifndef BSDUNZIP_PLATFORM_H_INCLUDED +#define BSDUNZIP_PLATFORM_H_INCLUDED + +#if defined(PLATFORM_CONFIG_H) +/* Use hand-built config.h in environments that need it. */ +#include PLATFORM_CONFIG_H +#else +/* Not having a config.h of some sort is a serious problem. */ +#include "config.h" +#endif + +#ifdef HAVE_LIBARCHIVE +/* If we're using the platform libarchive, include system headers. */ +#include <archive.h> +#include <archive_entry.h> +#else +/* Otherwise, include user headers. */ +#include "archive.h" +#include "archive_entry.h" +#endif + +/* How to mark functions that don't return. */ +/* This facilitates use of some newer static code analysis tools. */ +#undef __LA_NORETURN +#if defined(__GNUC__) && (__GNUC__ > 2 || \ + (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) +#define __LA_NORETURN __attribute__((__noreturn__)) +#elif defined(_MSC_VER) +#define __LA_NORETURN __declspec(noreturn) +#else +#define __LA_NORETURN +#endif + +#endif /* !BSDUNZIP_PLATFORM_H_INCLUDED */ diff --git a/unzip/cmdline.c b/unzip/cmdline.c new file mode 100644 index 000000000000..ab1aeb31fe18 --- /dev/null +++ b/unzip/cmdline.c @@ -0,0 +1,247 @@ +/*- + * Copyright (c) 2003-2008 Tim Kientzle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Command line parser for bsdunzip. + */ + +#include "bsdunzip_platform.h" +#ifdef HAVE_ERRNO_H +#include <errno.h> +#endif +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif +#ifdef HAVE_STRING_H +#include <string.h> +#endif + +#include "bsdunzip.h" +#include "err.h" + +/* + * Short options for bsdunzip. Please keep this sorted. + */ +static const char *short_options + = "aCcd:fI:jLlnO:opP:qtuvx:yZ:"; + +/* + * Long options for bsdunzip. Please keep this list sorted. + * + * The symbolic names for options that lack a short equivalent are + * defined in bsdunzip.h. Also note that so far I've found no need + * to support optional arguments to long options. That would be + * a small change to the code below. + */ + +static const struct bsdunzip_option { + const char *name; + int required; /* 1 if this option requires an argument. */ + int equivalent; /* Equivalent short option. */ +} bsdunzip_longopts[] = { + { "version", 0, OPTION_VERSION }, + { NULL, 0, 0 } +}; + +/* + * This getopt implementation has two key features that common + * getopt_long() implementations lack. Apart from those, it's a + * straightforward option parser, considerably simplified by not + * needing to support the wealth of exotic getopt_long() features. It + * has, of course, been shamelessly tailored for bsdunzip. (If you're + * looking for a generic getopt_long() implementation for your + * project, I recommend Gregory Pietsch's public domain getopt_long() + * implementation.) The two additional features are: + */ + +int +bsdunzip_getopt(struct bsdunzip *bsdunzip) +{ + enum { state_start = 0, state_next_word, state_short, state_long }; + + const struct bsdunzip_option *popt, *match = NULL, *match2 = NULL; + const char *p, *long_prefix = "--"; + size_t optlength; + int opt = OPTION_NONE; + int required = 0; + + bsdunzip->argument = NULL; + + /* First time through, initialize everything. */ + if (bsdunzip->getopt_state == state_start) { + /* Skip program name. */ + ++bsdunzip->argv; + --bsdunzip->argc; + if (*bsdunzip->argv == NULL) + return (-1); + bsdunzip->getopt_state = state_next_word; + } + + /* + * We're ready to look at the next word in argv. + */ + if (bsdunzip->getopt_state == state_next_word) { + /* No more arguments, so no more options. */ + if (bsdunzip->argv[0] == NULL) + return (-1); + /* Doesn't start with '-', so no more options. */ + if (bsdunzip->argv[0][0] != '-') + return (-1); + /* "--" marks end of options; consume it and return. */ + if (strcmp(bsdunzip->argv[0], "--") == 0) { + ++bsdunzip->argv; + --bsdunzip->argc; + bsdunzip_optind++; + return (-1); + } + /* Get next word for parsing. */ + bsdunzip->getopt_word = *bsdunzip->argv++; + --bsdunzip->argc; + bsdunzip_optind++; + if (bsdunzip->getopt_word[1] == '-') { + /* Set up long option parser. */ + bsdunzip->getopt_state = state_long; + bsdunzip->getopt_word += 2; /* Skip leading '--' */ + } else { + /* Set up short option parser. */ + bsdunzip->getopt_state = state_short; + ++bsdunzip->getopt_word; /* Skip leading '-' */ + } + } + + /* + * We're parsing a group of POSIX-style single-character options. + */ + if (bsdunzip->getopt_state == state_short) { + /* Peel next option off of a group of short options. */ + opt = *bsdunzip->getopt_word++; + if (opt == '\0') { + /* End of this group; recurse to get next option. */ + bsdunzip->getopt_state = state_next_word; + return bsdunzip_getopt(bsdunzip); + } + + /* Does this option take an argument? */ + p = strchr(short_options, opt); + if (p == NULL) + return ('?'); + if (p[1] == ':') + required = 1; + + /* If it takes an argument, parse that. */ + if (required) { + /* If arg is run-in, bsdunzip->getopt_word already points to it. */ + if (bsdunzip->getopt_word[0] == '\0') { + /* Otherwise, pick up the next word. */ + bsdunzip->getopt_word = *bsdunzip->argv; + if (bsdunzip->getopt_word == NULL) { + lafe_warnc(0, + "Option -%c requires an argument", + opt); + return ('?'); + } + ++bsdunzip->argv; + --bsdunzip->argc; + bsdunzip_optind++; + } + bsdunzip->getopt_state = state_next_word; + bsdunzip->argument = bsdunzip->getopt_word; + } + } + + /* We're reading a long option */ + if (bsdunzip->getopt_state == state_long) { + /* After this long option, we'll be starting a new word. */ + bsdunzip->getopt_state = state_next_word; + + /* Option name ends at '=' if there is one. */ + p = strchr(bsdunzip->getopt_word, '='); + if (p != NULL) { + optlength = (size_t)(p - bsdunzip->getopt_word); + bsdunzip->argument = (char *)(uintptr_t)(p + 1); + } else { + optlength = strlen(bsdunzip->getopt_word); + } + + /* Search the table for an unambiguous match. */ + for (popt = bsdunzip_longopts; popt->name != NULL; popt++) { + /* Short-circuit if first chars don't match. */ + if (popt->name[0] != bsdunzip->getopt_word[0]) + continue; + /* If option is a prefix of name in table, record it.*/ + if (strncmp(bsdunzip->getopt_word, popt->name, optlength) == 0) { + match2 = match; /* Record up to two matches. */ + match = popt; + /* If it's an exact match, we're done. */ + if (strlen(popt->name) == optlength) { + match2 = NULL; /* Forget the others. */ + break; + } + } + } + + /* Fail if there wasn't a unique match. */ + if (match == NULL) { + lafe_warnc(0, + "Option %s%s is not supported", + long_prefix, bsdunzip->getopt_word); + return ('?'); + } + if (match2 != NULL) { + lafe_warnc(0, + "Ambiguous option %s%s (matches --%s and --%s)", + long_prefix, bsdunzip->getopt_word, match->name, match2->name); + return ('?'); + } + + /* We've found a unique match; does it need an argument? */ + if (match->required) { + /* Argument required: get next word if necessary. */ + if (bsdunzip->argument == NULL) { + bsdunzip->argument = *bsdunzip->argv; + if (bsdunzip->argument == NULL) { + lafe_warnc(0, + "Option %s%s requires an argument", + long_prefix, match->name); + return ('?'); + } + ++bsdunzip->argv; + --bsdunzip->argc; + bsdunzip_optind++; + } + } else { + /* Argument forbidden: fail if there is one. */ + if (bsdunzip->argument != NULL) { + lafe_warnc(0, + "Option %s%s does not allow an argument", + long_prefix, match->name); + return ('?'); + } + } + return (match->equivalent); + } + + return (opt); +} diff --git a/unzip/la_getline.c b/unzip/la_getline.c new file mode 100644 index 000000000000..79a6bc010214 --- /dev/null +++ b/unzip/la_getline.c @@ -0,0 +1,99 @@ +/* $NetBSD: getline.c,v 1.2 2014/09/16 17:23:50 christos Exp $ */ + +/*- + * Copyright (c) 2011 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "bsdunzip_platform.h" +#ifndef HAVE_GETLINE + +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif +#ifdef HAVE_STDIO_H +#include <stdio.h> +#endif +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#ifdef HAVE_ERRNO_H +#include <errno.h> +#endif +#ifdef HAVE_STRING_H +#include <string.h> +#endif + +static ssize_t +la_getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp) +{ + char *ptr, *eptr; + + + if (*buf == NULL || *bufsiz == 0) { + *bufsiz = BUFSIZ; + if ((*buf = malloc(*bufsiz)) == NULL) + return -1; + } + + for (ptr = *buf, eptr = *buf + *bufsiz;;) { + int c = fgetc(fp); + if (c == -1) { + if (feof(fp)) { + ssize_t diff = (ssize_t)(ptr - *buf); + if (diff != 0) { + *ptr = '\0'; + return diff; + } + } + return -1; + } + *ptr++ = c; + if (c == delimiter) { + *ptr = '\0'; + return ptr - *buf; + } + if (ptr + 2 >= eptr) { + char *nbuf; + size_t nbufsiz = *bufsiz * 2; + ssize_t d = ptr - *buf; + if ((nbuf = realloc(*buf, nbufsiz)) == NULL) + return -1; + *buf = nbuf; + *bufsiz = nbufsiz; + eptr = nbuf + nbufsiz; + ptr = nbuf + d; + } + } +} + +ssize_t +getline(char **buf, size_t *bufsiz, FILE *fp) +{ + return la_getdelim(buf, bufsiz, '\n', fp); +} +#endif diff --git a/unzip/la_queue.h b/unzip/la_queue.h new file mode 100644 index 000000000000..917526531b2a --- /dev/null +++ b/unzip/la_queue.h @@ -0,0 +1,840 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + */ + +#ifndef _SYS_QUEUE_H_ +#define _SYS_QUEUE_H_ + +/* + * This file defines four types of data structures: singly-linked lists, + * singly-linked tail queues, lists and tail queues. + * + * A singly-linked list is headed by a single forward pointer. The elements + * are singly linked for minimum space and pointer manipulation overhead at + * the expense of O(n) removal for arbitrary elements. New elements can be + * added to the list after an existing element or at the head of the list. + * Elements being removed from the head of the list should use the explicit + * macro for this purpose for optimum efficiency. A singly-linked list may + * only be traversed in the forward direction. Singly-linked lists are ideal + * for applications with large datasets and few or no removals or for + * implementing a LIFO queue. + * + * A singly-linked tail queue is headed by a pair of pointers, one to the + * head of the list and the other to the tail of the list. The elements are + * singly linked for minimum space and pointer manipulation overhead at the + * expense of O(n) removal for arbitrary elements. New elements can be added + * to the list after an existing element, at the head of the list, or at the + * end of the list. Elements being removed from the head of the tail queue + * should use the explicit macro for this purpose for optimum efficiency. + * A singly-linked tail queue may only be traversed in the forward direction. + * Singly-linked tail queues are ideal for applications with large datasets + * and few or no removals or for implementing a FIFO queue. + * + * A list is headed by a single forward pointer (or an array of forward + * pointers for a hash table header). The elements are doubly linked + * so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before + * or after an existing element or at the head of the list. A list + * may be traversed in either direction. + * + * A tail queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or + * after an existing element, at the head of the list, or at the end of + * the list. A tail queue may be traversed in either direction. + * + * For details on the use of these macros, see the queue(3) manual page. + * + * Below is a summary of implemented functions where: + * + means the macro is available + * - means the macro is not available + * s means the macro is available but is slow (runs in O(n) time) + * + * SLIST LIST STAILQ TAILQ + * _HEAD + + + + + * _CLASS_HEAD + + + + + * _HEAD_INITIALIZER + + + + + * _ENTRY + + + + + * _CLASS_ENTRY + + + + + * _INIT + + + + + * _EMPTY + + + + + * _FIRST + + + + + * _NEXT + + + + + * _PREV - + - + + * _LAST - - + + + * _LAST_FAST - - - + + * _FOREACH + + + + + * _FOREACH_FROM + + + + + * _FOREACH_SAFE + + + + + * _FOREACH_FROM_SAFE + + + + + * _FOREACH_REVERSE - - - + + * _FOREACH_REVERSE_FROM - - - + + * _FOREACH_REVERSE_SAFE - - - + + * _FOREACH_REVERSE_FROM_SAFE - - - + + * _INSERT_HEAD + + + + + * _INSERT_BEFORE - + - + + * _INSERT_AFTER + + + + + * _INSERT_TAIL - - + + + * _CONCAT s s + + + * _REMOVE_AFTER + - + - + * _REMOVE_HEAD + - + - + * _REMOVE s + s + + * _SWAP + + + + + */ +#ifdef QUEUE_MACRO_DEBUG +#warn Use QUEUE_MACRO_DEBUG_TRACE and/or QUEUE_MACRO_DEBUG_TRASH +#define QUEUE_MACRO_DEBUG_TRACE +#define QUEUE_MACRO_DEBUG_TRASH +#endif + +#ifdef QUEUE_MACRO_DEBUG_TRACE +/* Store the last 2 places the queue element or head was altered */ +struct qm_trace { + unsigned long lastline; + unsigned long prevline; + const char *lastfile; + const char *prevfile; +}; + +#define TRACEBUF struct qm_trace trace; +#define TRACEBUF_INITIALIZER { __LINE__, 0, __FILE__, NULL } , + +#define QMD_TRACE_HEAD(head) do { \ + (head)->trace.prevline = (head)->trace.lastline; \ + (head)->trace.prevfile = (head)->trace.lastfile; \ + (head)->trace.lastline = __LINE__; \ + (head)->trace.lastfile = __FILE__; \ +} while (0) + +#define QMD_TRACE_ELEM(elem) do { \ + (elem)->trace.prevline = (elem)->trace.lastline; \ + (elem)->trace.prevfile = (elem)->trace.lastfile; \ + (elem)->trace.lastline = __LINE__; \ + (elem)->trace.lastfile = __FILE__; \ +} while (0) + +#else /* !QUEUE_MACRO_DEBUG_TRACE */ +#define QMD_TRACE_ELEM(elem) +#define QMD_TRACE_HEAD(head) +#define TRACEBUF +#define TRACEBUF_INITIALIZER +#endif /* QUEUE_MACRO_DEBUG_TRACE */ + +#ifdef QUEUE_MACRO_DEBUG_TRASH +#define QMD_SAVELINK(name, link) void **name = (void *)&(link) +#define TRASHIT(x) do {(x) = (void *)-1;} while (0) +#define QMD_IS_TRASHED(x) ((x) == (void *)(intptr_t)-1) +#else /* !QUEUE_MACRO_DEBUG_TRASH */ +#define QMD_SAVELINK(name, link) +#define TRASHIT(x) +#define QMD_IS_TRASHED(x) 0 +#endif /* QUEUE_MACRO_DEBUG_TRASH */ + +#ifdef __cplusplus +/* + * In C++ there can be structure lists and class lists: + */ +#define QUEUE_TYPEOF(type) type +#else +#define QUEUE_TYPEOF(type) struct type +#endif + +/* + * Singly-linked List declarations. + */ +#define SLIST_HEAD(name, type) \ +struct name { \ + struct type *slh_first; /* first element */ \ +} + +#define SLIST_CLASS_HEAD(name, type) \ +struct name { \ + class type *slh_first; /* first element */ \ +} + +#define SLIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define SLIST_ENTRY(type) \ +struct { \ + struct type *sle_next; /* next element */ \ +} + +#define SLIST_CLASS_ENTRY(type) \ +struct { \ + class type *sle_next; /* next element */ \ +} + +/* + * Singly-linked List functions. + */ +#if (defined(_KERNEL) && defined(INVARIANTS)) +#define QMD_SLIST_CHECK_PREVPTR(prevp, elm) do { \ + if (*(prevp) != (elm)) \ + panic("Bad prevptr *(%p) == %p != %p", \ + (prevp), *(prevp), (elm)); \ +} while (0) +#else +#define QMD_SLIST_CHECK_PREVPTR(prevp, elm) +#endif + +#define SLIST_CONCAT(head1, head2, type, field) do { \ + QUEUE_TYPEOF(type) *curelm = SLIST_FIRST(head1); \ + if (curelm == NULL) { \ + if ((SLIST_FIRST(head1) = SLIST_FIRST(head2)) != NULL) \ + SLIST_INIT(head2); \ + } else if (SLIST_FIRST(head2) != NULL) { \ + while (SLIST_NEXT(curelm, field) != NULL) \ + curelm = SLIST_NEXT(curelm, field); \ + SLIST_NEXT(curelm, field) = SLIST_FIRST(head2); \ + SLIST_INIT(head2); \ + } \ +} while (0) + +#define SLIST_EMPTY(head) ((head)->slh_first == NULL) + +#define SLIST_FIRST(head) ((head)->slh_first) + +#define SLIST_FOREACH(var, head, field) \ + for ((var) = SLIST_FIRST((head)); \ + (var); \ + (var) = SLIST_NEXT((var), field)) + +#define SLIST_FOREACH_FROM(var, head, field) \ + for ((var) = ((var) ? (var) : SLIST_FIRST((head))); \ + (var); \ + (var) = SLIST_NEXT((var), field)) + +#define SLIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = SLIST_FIRST((head)); \ + (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define SLIST_FOREACH_FROM_SAFE(var, head, field, tvar) \ + for ((var) = ((var) ? (var) : SLIST_FIRST((head))); \ + (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define SLIST_FOREACH_PREVPTR(var, varp, head, field) \ + for ((varp) = &SLIST_FIRST((head)); \ + ((var) = *(varp)) != NULL; \ + (varp) = &SLIST_NEXT((var), field)) + +#define SLIST_INIT(head) do { \ + SLIST_FIRST((head)) = NULL; \ +} while (0) + +#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ + SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \ + SLIST_NEXT((slistelm), field) = (elm); \ +} while (0) + +#define SLIST_INSERT_HEAD(head, elm, field) do { \ + SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \ + SLIST_FIRST((head)) = (elm); \ +} while (0) + +#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) + +#define SLIST_REMOVE(head, elm, type, field) do { \ + QMD_SAVELINK(oldnext, (elm)->field.sle_next); \ + if (SLIST_FIRST((head)) == (elm)) { \ + SLIST_REMOVE_HEAD((head), field); \ + } \ + else { \ + QUEUE_TYPEOF(type) *curelm = SLIST_FIRST(head); \ + while (SLIST_NEXT(curelm, field) != (elm)) \ + curelm = SLIST_NEXT(curelm, field); \ + SLIST_REMOVE_AFTER(curelm, field); \ + } \ + TRASHIT(*oldnext); \ +} while (0) + +#define SLIST_REMOVE_AFTER(elm, field) do { \ + SLIST_NEXT(elm, field) = \ + SLIST_NEXT(SLIST_NEXT(elm, field), field); \ +} while (0) + +#define SLIST_REMOVE_HEAD(head, field) do { \ + SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \ +} while (0) + +#define SLIST_REMOVE_PREVPTR(prevp, elm, field) do { \ + QMD_SLIST_CHECK_PREVPTR(prevp, elm); \ + *(prevp) = SLIST_NEXT(elm, field); \ + TRASHIT((elm)->field.sle_next); \ +} while (0) + +#define SLIST_SWAP(head1, head2, type) do { \ + QUEUE_TYPEOF(type) *swap_first = SLIST_FIRST(head1); \ + SLIST_FIRST(head1) = SLIST_FIRST(head2); \ + SLIST_FIRST(head2) = swap_first; \ +} while (0) + +/* + * Singly-linked Tail queue declarations. + */ +#define STAILQ_HEAD(name, type) \ +struct name { \ + struct type *stqh_first;/* first element */ \ + struct type **stqh_last;/* addr of last next element */ \ +} + +#define STAILQ_CLASS_HEAD(name, type) \ +struct name { \ + class type *stqh_first; /* first element */ \ + class type **stqh_last; /* addr of last next element */ \ +} + +#define STAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).stqh_first } + +#define STAILQ_ENTRY(type) \ +struct { \ + struct type *stqe_next; /* next element */ \ +} + +#define STAILQ_CLASS_ENTRY(type) \ +struct { \ + class type *stqe_next; /* next element */ \ +} + +/* + * Singly-linked Tail queue functions. + */ +#define STAILQ_CONCAT(head1, head2) do { \ + if (!STAILQ_EMPTY((head2))) { \ + *(head1)->stqh_last = (head2)->stqh_first; \ + (head1)->stqh_last = (head2)->stqh_last; \ + STAILQ_INIT((head2)); \ + } \ +} while (0) + +#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) + +#define STAILQ_FIRST(head) ((head)->stqh_first) + +#define STAILQ_FOREACH(var, head, field) \ + for((var) = STAILQ_FIRST((head)); \ + (var); \ + (var) = STAILQ_NEXT((var), field)) + +#define STAILQ_FOREACH_FROM(var, head, field) \ + for ((var) = ((var) ? (var) : STAILQ_FIRST((head))); \ + (var); \ + (var) = STAILQ_NEXT((var), field)) + +#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = STAILQ_FIRST((head)); \ + (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define STAILQ_FOREACH_FROM_SAFE(var, head, field, tvar) \ + for ((var) = ((var) ? (var) : STAILQ_FIRST((head))); \ + (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define STAILQ_INIT(head) do { \ + STAILQ_FIRST((head)) = NULL; \ + (head)->stqh_last = &STAILQ_FIRST((head)); \ +} while (0) + +#define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \ + if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ + STAILQ_NEXT((tqelm), field) = (elm); \ +} while (0) + +#define STAILQ_INSERT_HEAD(head, elm, field) do { \ + if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ + STAILQ_FIRST((head)) = (elm); \ +} while (0) + +#define STAILQ_INSERT_TAIL(head, elm, field) do { \ + STAILQ_NEXT((elm), field) = NULL; \ + *(head)->stqh_last = (elm); \ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ +} while (0) + +#define STAILQ_LAST(head, type, field) \ + (STAILQ_EMPTY((head)) ? NULL : \ + __containerof((head)->stqh_last, \ + QUEUE_TYPEOF(type), field.stqe_next)) + +#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) + +#define STAILQ_REMOVE(head, elm, type, field) do { \ + QMD_SAVELINK(oldnext, (elm)->field.stqe_next); \ + if (STAILQ_FIRST((head)) == (elm)) { \ + STAILQ_REMOVE_HEAD((head), field); \ + } \ + else { \ + QUEUE_TYPEOF(type) *curelm = STAILQ_FIRST(head); \ + while (STAILQ_NEXT(curelm, field) != (elm)) \ + curelm = STAILQ_NEXT(curelm, field); \ + STAILQ_REMOVE_AFTER(head, curelm, field); \ + } \ + TRASHIT(*oldnext); \ +} while (0) + +#define STAILQ_REMOVE_AFTER(head, elm, field) do { \ + if ((STAILQ_NEXT(elm, field) = \ + STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL) \ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ +} while (0) + +#define STAILQ_REMOVE_HEAD(head, field) do { \ + if ((STAILQ_FIRST((head)) = \ + STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \ + (head)->stqh_last = &STAILQ_FIRST((head)); \ +} while (0) + +#define STAILQ_SWAP(head1, head2, type) do { \ + QUEUE_TYPEOF(type) *swap_first = STAILQ_FIRST(head1); \ + QUEUE_TYPEOF(type) **swap_last = (head1)->stqh_last; \ + STAILQ_FIRST(head1) = STAILQ_FIRST(head2); \ + (head1)->stqh_last = (head2)->stqh_last; \ + STAILQ_FIRST(head2) = swap_first; \ + (head2)->stqh_last = swap_last; \ + if (STAILQ_EMPTY(head1)) \ + (head1)->stqh_last = &STAILQ_FIRST(head1); \ + if (STAILQ_EMPTY(head2)) \ + (head2)->stqh_last = &STAILQ_FIRST(head2); \ +} while (0) + + +/* + * List declarations. + */ +#define LIST_HEAD(name, type) \ +struct name { \ + struct type *lh_first; /* first element */ \ +} + +#define LIST_CLASS_HEAD(name, type) \ +struct name { \ + class type *lh_first; /* first element */ \ +} + +#define LIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define LIST_ENTRY(type) \ +struct { \ + struct type *le_next; /* next element */ \ + struct type **le_prev; /* address of previous next element */ \ +} + +#define LIST_CLASS_ENTRY(type) \ +struct { \ + class type *le_next; /* next element */ \ + class type **le_prev; /* address of previous next element */ \ +} + +/* + * List functions. + */ + +#if (defined(_KERNEL) && defined(INVARIANTS)) +/* + * QMD_LIST_CHECK_HEAD(LIST_HEAD *head, LIST_ENTRY NAME) + * + * If the list is non-empty, validates that the first element of the list + * points back at 'head.' + */ +#define QMD_LIST_CHECK_HEAD(head, field) do { \ + if (LIST_FIRST((head)) != NULL && \ + LIST_FIRST((head))->field.le_prev != \ + &LIST_FIRST((head))) \ + panic("Bad list head %p first->prev != head", (head)); \ +} while (0) + +/* + * QMD_LIST_CHECK_NEXT(TYPE *elm, LIST_ENTRY NAME) + * + * If an element follows 'elm' in the list, validates that the next element + * points back at 'elm.' + */ +#define QMD_LIST_CHECK_NEXT(elm, field) do { \ + if (LIST_NEXT((elm), field) != NULL && \ + LIST_NEXT((elm), field)->field.le_prev != \ + &((elm)->field.le_next)) \ + panic("Bad link elm %p next->prev != elm", (elm)); \ +} while (0) + +/* + * QMD_LIST_CHECK_PREV(TYPE *elm, LIST_ENTRY NAME) + * + * Validates that the previous element (or head of the list) points to 'elm.' + */ +#define QMD_LIST_CHECK_PREV(elm, field) do { \ + if (*(elm)->field.le_prev != (elm)) \ + panic("Bad link elm %p prev->next != elm", (elm)); \ +} while (0) +#else +#define QMD_LIST_CHECK_HEAD(head, field) +#define QMD_LIST_CHECK_NEXT(elm, field) +#define QMD_LIST_CHECK_PREV(elm, field) +#endif /* (_KERNEL && INVARIANTS) */ + +#define LIST_CONCAT(head1, head2, type, field) do { \ + QUEUE_TYPEOF(type) *curelm = LIST_FIRST(head1); \ + if (curelm == NULL) { \ + if ((LIST_FIRST(head1) = LIST_FIRST(head2)) != NULL) { \ + LIST_FIRST(head2)->field.le_prev = \ + &LIST_FIRST((head1)); \ + LIST_INIT(head2); \ + } \ + } else if (LIST_FIRST(head2) != NULL) { \ + while (LIST_NEXT(curelm, field) != NULL) \ + curelm = LIST_NEXT(curelm, field); \ + LIST_NEXT(curelm, field) = LIST_FIRST(head2); \ + LIST_FIRST(head2)->field.le_prev = &LIST_NEXT(curelm, field); \ + LIST_INIT(head2); \ + } \ +} while (0) + +#define LIST_EMPTY(head) ((head)->lh_first == NULL) + +#define LIST_FIRST(head) ((head)->lh_first) + +#define LIST_FOREACH(var, head, field) \ + for ((var) = LIST_FIRST((head)); \ + (var); \ + (var) = LIST_NEXT((var), field)) + +#define LIST_FOREACH_FROM(var, head, field) \ + for ((var) = ((var) ? (var) : LIST_FIRST((head))); \ + (var); \ + (var) = LIST_NEXT((var), field)) + +#define LIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = LIST_FIRST((head)); \ + (var) && ((tvar) = LIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define LIST_FOREACH_FROM_SAFE(var, head, field, tvar) \ + for ((var) = ((var) ? (var) : LIST_FIRST((head))); \ + (var) && ((tvar) = LIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define LIST_INIT(head) do { \ + LIST_FIRST((head)) = NULL; \ +} while (0) + +#define LIST_INSERT_AFTER(listelm, elm, field) do { \ + QMD_LIST_CHECK_NEXT(listelm, field); \ + if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\ + LIST_NEXT((listelm), field)->field.le_prev = \ + &LIST_NEXT((elm), field); \ + LIST_NEXT((listelm), field) = (elm); \ + (elm)->field.le_prev = &LIST_NEXT((listelm), field); \ +} while (0) + +#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ + QMD_LIST_CHECK_PREV(listelm, field); \ + (elm)->field.le_prev = (listelm)->field.le_prev; \ + LIST_NEXT((elm), field) = (listelm); \ + *(listelm)->field.le_prev = (elm); \ + (listelm)->field.le_prev = &LIST_NEXT((elm), field); \ +} while (0) + +#define LIST_INSERT_HEAD(head, elm, field) do { \ + QMD_LIST_CHECK_HEAD((head), field); \ + if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL) \ + LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\ + LIST_FIRST((head)) = (elm); \ + (elm)->field.le_prev = &LIST_FIRST((head)); \ +} while (0) + +#define LIST_NEXT(elm, field) ((elm)->field.le_next) + +#define LIST_PREV(elm, head, type, field) \ + ((elm)->field.le_prev == &LIST_FIRST((head)) ? NULL : \ + __containerof((elm)->field.le_prev, \ + QUEUE_TYPEOF(type), field.le_next)) + +#define LIST_REMOVE(elm, field) do { \ + QMD_SAVELINK(oldnext, (elm)->field.le_next); \ + QMD_SAVELINK(oldprev, (elm)->field.le_prev); \ + QMD_LIST_CHECK_NEXT(elm, field); \ + QMD_LIST_CHECK_PREV(elm, field); \ + if (LIST_NEXT((elm), field) != NULL) \ + LIST_NEXT((elm), field)->field.le_prev = \ + (elm)->field.le_prev; \ + *(elm)->field.le_prev = LIST_NEXT((elm), field); \ + TRASHIT(*oldnext); \ + TRASHIT(*oldprev); \ +} while (0) + +#define LIST_SWAP(head1, head2, type, field) do { \ + QUEUE_TYPEOF(type) *swap_tmp = LIST_FIRST(head1); \ + LIST_FIRST((head1)) = LIST_FIRST((head2)); \ + LIST_FIRST((head2)) = swap_tmp; \ + if ((swap_tmp = LIST_FIRST((head1))) != NULL) \ + swap_tmp->field.le_prev = &LIST_FIRST((head1)); \ + if ((swap_tmp = LIST_FIRST((head2))) != NULL) \ + swap_tmp->field.le_prev = &LIST_FIRST((head2)); \ +} while (0) + +/* + * Tail queue declarations. + */ +#define TAILQ_HEAD(name, type) \ +struct name { \ + struct type *tqh_first; /* first element */ \ + struct type **tqh_last; /* addr of last next element */ \ + TRACEBUF \ +} + +#define TAILQ_CLASS_HEAD(name, type) \ +struct name { \ + class type *tqh_first; /* first element */ \ + class type **tqh_last; /* addr of last next element */ \ + TRACEBUF \ +} + +#define TAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).tqh_first, TRACEBUF_INITIALIZER } + +#define TAILQ_ENTRY(type) \ +struct { \ + struct type *tqe_next; /* next element */ \ + struct type **tqe_prev; /* address of previous next element */ \ + TRACEBUF \ +} + +#define TAILQ_CLASS_ENTRY(type) \ +struct { \ + class type *tqe_next; /* next element */ \ + class type **tqe_prev; /* address of previous next element */ \ + TRACEBUF \ +} + +/* + * Tail queue functions. + */ +#if (defined(_KERNEL) && defined(INVARIANTS)) +/* + * QMD_TAILQ_CHECK_HEAD(TAILQ_HEAD *head, TAILQ_ENTRY NAME) + * + * If the tailq is non-empty, validates that the first element of the tailq + * points back at 'head.' + */ +#define QMD_TAILQ_CHECK_HEAD(head, field) do { \ + if (!TAILQ_EMPTY(head) && \ + TAILQ_FIRST((head))->field.tqe_prev != \ + &TAILQ_FIRST((head))) \ + panic("Bad tailq head %p first->prev != head", (head)); \ +} while (0) + +/* + * QMD_TAILQ_CHECK_TAIL(TAILQ_HEAD *head, TAILQ_ENTRY NAME) + * + * Validates that the tail of the tailq is a pointer to pointer to NULL. + */ +#define QMD_TAILQ_CHECK_TAIL(head, field) do { \ + if (*(head)->tqh_last != NULL) \ + panic("Bad tailq NEXT(%p->tqh_last) != NULL", (head)); \ +} while (0) + +/* + * QMD_TAILQ_CHECK_NEXT(TYPE *elm, TAILQ_ENTRY NAME) + * + * If an element follows 'elm' in the tailq, validates that the next element + * points back at 'elm.' + */ +#define QMD_TAILQ_CHECK_NEXT(elm, field) do { \ + if (TAILQ_NEXT((elm), field) != NULL && \ + TAILQ_NEXT((elm), field)->field.tqe_prev != \ + &((elm)->field.tqe_next)) \ + panic("Bad link elm %p next->prev != elm", (elm)); \ +} while (0) + +/* + * QMD_TAILQ_CHECK_PREV(TYPE *elm, TAILQ_ENTRY NAME) + * + * Validates that the previous element (or head of the tailq) points to 'elm.' + */ +#define QMD_TAILQ_CHECK_PREV(elm, field) do { \ + if (*(elm)->field.tqe_prev != (elm)) \ + panic("Bad link elm %p prev->next != elm", (elm)); \ +} while (0) +#else +#define QMD_TAILQ_CHECK_HEAD(head, field) +#define QMD_TAILQ_CHECK_TAIL(head, headname) +#define QMD_TAILQ_CHECK_NEXT(elm, field) +#define QMD_TAILQ_CHECK_PREV(elm, field) +#endif /* (_KERNEL && INVARIANTS) */ + +#define TAILQ_CONCAT(head1, head2, field) do { \ + if (!TAILQ_EMPTY(head2)) { \ + *(head1)->tqh_last = (head2)->tqh_first; \ + (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ + (head1)->tqh_last = (head2)->tqh_last; \ + TAILQ_INIT((head2)); \ + QMD_TRACE_HEAD(head1); \ + QMD_TRACE_HEAD(head2); \ + } \ +} while (0) + +#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) + +#define TAILQ_FIRST(head) ((head)->tqh_first) + +#define TAILQ_FOREACH(var, head, field) \ + for ((var) = TAILQ_FIRST((head)); \ + (var); \ + (var) = TAILQ_NEXT((var), field)) + +#define TAILQ_FOREACH_FROM(var, head, field) \ + for ((var) = ((var) ? (var) : TAILQ_FIRST((head))); \ + (var); \ + (var) = TAILQ_NEXT((var), field)) + +#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = TAILQ_FIRST((head)); \ + (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define TAILQ_FOREACH_FROM_SAFE(var, head, field, tvar) \ + for ((var) = ((var) ? (var) : TAILQ_FIRST((head))); \ + (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ + for ((var) = TAILQ_LAST((head), headname); \ + (var); \ + (var) = TAILQ_PREV((var), headname, field)) + +#define TAILQ_FOREACH_REVERSE_FROM(var, head, headname, field) \ + for ((var) = ((var) ? (var) : TAILQ_LAST((head), headname)); \ + (var); \ + (var) = TAILQ_PREV((var), headname, field)) + +#define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar) \ + for ((var) = TAILQ_LAST((head), headname); \ + (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1); \ + (var) = (tvar)) + +#define TAILQ_FOREACH_REVERSE_FROM_SAFE(var, head, headname, field, tvar) \ + for ((var) = ((var) ? (var) : TAILQ_LAST((head), headname)); \ + (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1); \ + (var) = (tvar)) + +#define TAILQ_INIT(head) do { \ + TAILQ_FIRST((head)) = NULL; \ + (head)->tqh_last = &TAILQ_FIRST((head)); \ + QMD_TRACE_HEAD(head); \ +} while (0) + +#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ + QMD_TAILQ_CHECK_NEXT(listelm, field); \ + if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\ + TAILQ_NEXT((elm), field)->field.tqe_prev = \ + &TAILQ_NEXT((elm), field); \ + else { \ + (head)->tqh_last = &TAILQ_NEXT((elm), field); \ + QMD_TRACE_HEAD(head); \ + } \ + TAILQ_NEXT((listelm), field) = (elm); \ + (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \ + QMD_TRACE_ELEM(&(elm)->field); \ + QMD_TRACE_ELEM(&(listelm)->field); \ +} while (0) + +#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ + QMD_TAILQ_CHECK_PREV(listelm, field); \ + (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ + TAILQ_NEXT((elm), field) = (listelm); \ + *(listelm)->field.tqe_prev = (elm); \ + (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \ + QMD_TRACE_ELEM(&(elm)->field); \ + QMD_TRACE_ELEM(&(listelm)->field); \ +} while (0) + +#define TAILQ_INSERT_HEAD(head, elm, field) do { \ + QMD_TAILQ_CHECK_HEAD(head, field); \ + if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \ + TAILQ_FIRST((head))->field.tqe_prev = \ + &TAILQ_NEXT((elm), field); \ + else \ + (head)->tqh_last = &TAILQ_NEXT((elm), field); \ + TAILQ_FIRST((head)) = (elm); \ + (elm)->field.tqe_prev = &TAILQ_FIRST((head)); \ + QMD_TRACE_HEAD(head); \ + QMD_TRACE_ELEM(&(elm)->field); \ +} while (0) + +#define TAILQ_INSERT_TAIL(head, elm, field) do { \ + QMD_TAILQ_CHECK_TAIL(head, field); \ + TAILQ_NEXT((elm), field) = NULL; \ + (elm)->field.tqe_prev = (head)->tqh_last; \ + *(head)->tqh_last = (elm); \ + (head)->tqh_last = &TAILQ_NEXT((elm), field); \ + QMD_TRACE_HEAD(head); \ + QMD_TRACE_ELEM(&(elm)->field); \ +} while (0) + +#define TAILQ_LAST(head, headname) \ + (*(((struct headname *)((head)->tqh_last))->tqh_last)) + +/* + * The FAST function is fast in that it causes no data access other + * then the access to the head. The standard LAST function above + * will cause a data access of both the element you want and + * the previous element. FAST is very useful for instances when + * you may want to prefetch the last data element. + */ +#define TAILQ_LAST_FAST(head, type, field) \ + (TAILQ_EMPTY(head) ? NULL : __containerof((head)->tqh_last, QUEUE_TYPEOF(type), field.tqe_next)) + +#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) + +#define TAILQ_PREV(elm, headname, field) \ + (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) + +#define TAILQ_PREV_FAST(elm, head, type, field) \ + ((elm)->field.tqe_prev == &(head)->tqh_first ? NULL : \ + __containerof((elm)->field.tqe_prev, QUEUE_TYPEOF(type), field.tqe_next)) + +#define TAILQ_REMOVE(head, elm, field) do { \ + QMD_SAVELINK(oldnext, (elm)->field.tqe_next); \ + QMD_SAVELINK(oldprev, (elm)->field.tqe_prev); \ + QMD_TAILQ_CHECK_NEXT(elm, field); \ + QMD_TAILQ_CHECK_PREV(elm, field); \ + if ((TAILQ_NEXT((elm), field)) != NULL) \ + TAILQ_NEXT((elm), field)->field.tqe_prev = \ + (elm)->field.tqe_prev; \ + else { \ + (head)->tqh_last = (elm)->field.tqe_prev; \ + QMD_TRACE_HEAD(head); \ + } \ + *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \ + TRASHIT(*oldnext); \ + TRASHIT(*oldprev); \ + QMD_TRACE_ELEM(&(elm)->field); \ +} while (0) + +#define TAILQ_SWAP(head1, head2, type, field) do { \ + QUEUE_TYPEOF(type) *swap_first = (head1)->tqh_first; \ + QUEUE_TYPEOF(type) **swap_last = (head1)->tqh_last; \ + (head1)->tqh_first = (head2)->tqh_first; \ + (head1)->tqh_last = (head2)->tqh_last; \ + (head2)->tqh_first = swap_first; \ + (head2)->tqh_last = swap_last; \ + if ((swap_first = (head1)->tqh_first) != NULL) \ + swap_first->field.tqe_prev = &(head1)->tqh_first; \ + else \ + (head1)->tqh_last = &(head1)->tqh_first; \ + if ((swap_first = (head2)->tqh_first) != NULL) \ + swap_first->field.tqe_prev = &(head2)->tqh_first; \ + else \ + (head2)->tqh_last = &(head2)->tqh_first; \ +} while (0) + +#endif /* !_SYS_QUEUE_H_ */ diff --git a/unzip/test/CMakeLists.txt b/unzip/test/CMakeLists.txt new file mode 100644 index 000000000000..f269c25f85e6 --- /dev/null +++ b/unzip/test/CMakeLists.txt @@ -0,0 +1,83 @@ +############################################ +# +# How to build bsdunzip_test +# +############################################ +IF(ENABLE_UNZIP AND ENABLE_TEST) + SET(bsdunzip_test_SOURCES + ../../libarchive_fe/err.c + ../../test_utils/test_utils.c + ../../test_utils/test_main.c + test.h + test_0.c + test_basic.c + test_doubledash.c + test_glob.c + test_singlefile.c + test_C.c + test_p.c + test_d.c + test_j.c + test_L.c + test_n.c + test_o.c + test_q.c + test_t.c + test_t_bad.c + test_version.c + test_x.c + test_Z1.c + test_P_encryption.c + test_I.c + ) + + # + # Register target + # + ADD_EXECUTABLE(bsdunzip_test ${bsdunzip_test_SOURCES}) + IF(ENABLE_ACL) + SET(TEST_ACL_LIBS "") + IF(HAVE_LIBACL) + LIST(APPEND TEST_ACL_LIBS ${ACL_LIBRARY}) + ENDIF(HAVE_LIBACL) + IF(HAVE_LIBRICHACL) + LIST(APPEND TEST_ACL_LIBS ${RICHACL_LIBRARY}) + ENDIF(HAVE_LIBRICHACL) + TARGET_LINK_LIBRARIES(bsdunzip_test ${TEST_ACL_LIBS}) + ENDIF(ENABLE_ACL) + SET_PROPERTY(TARGET bsdunzip_test PROPERTY COMPILE_DEFINITIONS LIST_H) + + # + # Generate list.h by grepping DEFINE_TEST() lines out of the C sources. + # + GENERATE_LIST_H(${CMAKE_CURRENT_BINARY_DIR}/list.h + ${CMAKE_CURRENT_LIST_FILE} ${bsdunzip_test_SOURCES}) + SET_PROPERTY(DIRECTORY APPEND PROPERTY INCLUDE_DIRECTORIES + ${CMAKE_CURRENT_BINARY_DIR}) + + # list.h has a line DEFINE_TEST(testname) for every + # test. We can use that to define the tests for cmake by + # defining a DEFINE_TEST macro and reading list.h in. + MACRO (DEFINE_TEST _testname) + ADD_TEST( + NAME bsdunzip_${_testname} + COMMAND bsdunzip_test -vv + -p $<TARGET_FILE:bsdunzip> + -r ${CMAKE_CURRENT_SOURCE_DIR} + ${_testname}) + ENDMACRO (DEFINE_TEST _testname) + + INCLUDE(${CMAKE_CURRENT_BINARY_DIR}/list.h) + INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) + INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/test_utils) + INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/unzip/test) + + # Experimental new test handling + ADD_CUSTOM_TARGET(run_bsdunzip_test + COMMAND bsdunzip_test -p $<TARGET_FILE:bsdunzip> + -r ${CMAKE_CURRENT_SOURCE_DIR} + -vv) + ADD_DEPENDENCIES(run_bsdunzip_test bsdunzip) + ADD_DEPENDENCIES(run_all_tests run_bsdunzip_test) +ENDIF(ENABLE_UNZIP AND ENABLE_TEST) + diff --git a/unzip/test/test.h b/unzip/test/test.h new file mode 100644 index 000000000000..822c3f08133f --- /dev/null +++ b/unzip/test/test.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2003-2017 Tim Kientzle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* Every test program should #include "test.h" as the first thing. */ + +#define KNOWNREF "test_basic.zip.uu" +#define ENVBASE "BSDUNZIP" /* Prefix for environment variables. */ +#define PROGRAM "bsdunzip" /* Name of program being tested. */ +#define PROGRAM_ALIAS "unzip" /* Generic alias for program */ +#undef LIBRARY /* Not testing a library. */ +#undef EXTRA_DUMP /* How to dump extra data */ +#undef EXTRA_ERRNO /* How to dump errno */ +/* How to generate extra version info. */ +#define EXTRA_VERSION (systemf("%s --version", testprog) ? "" : "") + +#include "test_common.h" diff --git a/unzip/test/test_0.c b/unzip/test/test_0.c new file mode 100644 index 000000000000..41279d388b1f --- /dev/null +++ b/unzip/test/test_0.c @@ -0,0 +1,58 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* + * This first test does basic sanity checks on the environment. For + * most of these, we just exit on failure. + */ +#if !defined(_WIN32) || defined(__CYGWIN__) +#define DEV_NULL "/dev/null" +#else +#define DEV_NULL "NUL" +#endif + +DEFINE_TEST(test_0) +{ + struct stat st; + + failure("File %s does not exist?!", testprog); + if (!assertEqualInt(0, stat(testprogfile, &st))) { + fprintf(stderr, + "\nFile %s does not exist; aborting test.\n\n", + testprog); + exit(1); + } + + failure("%s is not executable?!", testprog); + if (!assert((st.st_mode & 0111) != 0)) { + fprintf(stderr, + "\nFile %s not executable; aborting test.\n\n", + testprog); + exit(1); + } + + /* TODO: Ensure that our reference files are available. */ +} diff --git a/unzip/test/test_C.c b/unzip/test/test_C.c new file mode 100644 index 000000000000..fc11b970c2f3 --- /dev/null +++ b/unzip/test/test_C.c @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2023 Adrian Vovk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* Test C arg - match case-insensitive */ +DEFINE_TEST(test_C) +{ + const char *reffile = "test_basic.zip"; + int r; + + extract_reference_file(reffile); + r = systemf("%s -C %s test_basic/caps >test.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertNonEmptyFile("test.out"); + assertEmptyFile("test.err"); + + assertTextFileContents("contents CAPS\n", "test_basic/CAPS"); +} diff --git a/unzip/test/test_I.c b/unzip/test/test_I.c new file mode 100644 index 000000000000..a6bad85a011f --- /dev/null +++ b/unzip/test/test_I.c @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2023 Aaron Lindros + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* Test I arg - file name encoding */ +DEFINE_TEST(test_I) +{ + const char *reffile = "test_I.zip"; + int r; + + extract_reference_file(reffile); + r = systemf("%s -I UTF-8 %s >test.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertNonEmptyFile("test.out"); + assertEmptyFile("test.err"); + + assertTextFileContents("Hello, World!\n", "Γειά σου Κόσμε.txt"); +} diff --git a/unzip/test/test_I.zip.uu b/unzip/test/test_I.zip.uu new file mode 100644 index 000000000000..8a1e7afa5b92 --- /dev/null +++ b/unzip/test/test_I.zip.uu @@ -0,0 +1,8 @@ +begin 644 test_I.zip +M4$L#!`H```@``&@)AU>$GNBT#@````X````>`!P`SI/.M<ZYSJP@SX/.O\^% +M(,Z:SXS/@\Z\SK4N='AT550)``,#8G%E"6)Q975X"P`!!.@#```$Z`,``$AE +M;&QO+"!7;W)L9"$*4$L!`AX#"@``"```:`F'5X2>Z+0.````#@```!X`&``` +M`````````*2!`````,Z3SK7.N<ZL(,^#SK_/A2#.FL^,SX/.O,ZU+G1X=%54 +L!0`#`V)Q975X"P`!!.@#```$Z`,``%!+!08``````0`!`&0```!F```````` +` +end diff --git a/unzip/test/test_L.c b/unzip/test/test_L.c new file mode 100644 index 000000000000..4815cb2b139d --- /dev/null +++ b/unzip/test/test_L.c @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2023 Adrian Vovk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* Test L arg - make names lowercase */ +DEFINE_TEST(test_L) +{ + const char *reffile = "test_basic.zip"; + int r; + + extract_reference_file(reffile); + r = systemf("%s -L %s >test.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertNonEmptyFile("test.out"); + assertEmptyFile("test.err"); + + assertTextFileContents("contents a\n", "test_basic/a"); + assertTextFileContents("contents b\n", "test_basic/b"); + assertTextFileContents("contents c\n", "test_basic/c"); + assertTextFileContents("contents CAPS\n", "test_basic/caps"); +} diff --git a/unzip/test/test_P_encryption.c b/unzip/test/test_P_encryption.c new file mode 100644 index 000000000000..beabbaa646ee --- /dev/null +++ b/unzip/test/test_P_encryption.c @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2023 Adrian Vovk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* Test P arg - password protected */ +DEFINE_TEST(test_P) +{ + const char *reffile = "test_encrypted.zip"; + int r; + + extract_reference_file(reffile); + r = systemf("%s -P password %s >test.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertNonEmptyFile("test.out"); + assertEmptyFile("test.err"); + + assertTextFileContents("plaintext\n", "encrypted/file.txt"); +} diff --git a/unzip/test/test_Z1.c b/unzip/test/test_Z1.c new file mode 100644 index 000000000000..58dc750030dd --- /dev/null +++ b/unzip/test/test_Z1.c @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2023 Adrian Vovk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* Test -Z1 arg - List filenames */ +DEFINE_TEST(test_Z1) +{ + const char *reffile = "test_basic.zip"; + int r; + + extract_reference_file(reffile); + r = systemf("%s -Z1 %s >test.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertNonEmptyFile("test.out"); + assertTextFileContents("test_basic/\ntest_basic/a\ntest_basic/b\ntest_basic/c\ntest_basic/CAPS\n", "test.out"); + assertEmptyFile("test.err"); +} diff --git a/unzip/test/test_basic.c b/unzip/test/test_basic.c new file mode 100644 index 000000000000..e997755e7e57 --- /dev/null +++ b/unzip/test/test_basic.c @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2023 Adrian Vovk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* This test just does a basic zip decompression */ +DEFINE_TEST(test_basic) +{ + const char *reffile = "test_basic.zip"; + int r; + + extract_reference_file(reffile); + r = systemf("%s %s >test.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertNonEmptyFile("test.out"); + assertEmptyFile("test.err"); + + assertTextFileContents("contents a\n", "test_basic/a"); + assertTextFileContents("contents b\n", "test_basic/b"); + assertTextFileContents("contents c\n", "test_basic/c"); + assertTextFileContents("contents CAPS\n", "test_basic/CAPS"); +} diff --git a/unzip/test/test_basic.zip.uu b/unzip/test/test_basic.zip.uu new file mode 100644 index 000000000000..b55aca950327 --- /dev/null +++ b/unzip/test/test_basic.zip.uu @@ -0,0 +1,25 @@ +begin 644 test_basic.zip +M4$L#!!0``````,J0MU8````````````````+`"``=&5S=%]B87-I8R]55`T` +M!]PX;63U.6UDW#AM9'5X"P`!!.@#```$Z`,``%!+`P04``@`"``)C;=6```` +M```````+````#``@`'1E<W1?8F%S:6,O8554#0`'PS)M9/HY;603.&UD=7@+ +M``$$Z`,```3H`P``2\[/*TG-*RE62.0"`%!+!PAY:C`$#0````L```!02P,$ +M%``(``@`#HVW5@``````````"P````P`(`!T97-T7V)A<VEC+V)55`T`!\TR +M;63Z.6UD.SAM9'5X"P`!!.@#```$Z`,``$O.SRM)S2LI5DCB`@!02P<(NCD= +M+PT````+````4$L#!!0`"``(`%*-MU8```````````L````,`"``=&5S=%]B +M87-I8R]C550-``=,,VUDTSAM9,\X;61U>`L``03H`P``!.@#``!+SL\K2<TK +M*59(Y@(`4$L'"/L(!C8-````"P```%!+`P04``@`"`#*D+=6```````````. +M````#P`@`'1E<W1?8F%S:6,O0T%04U54#0`'W#AM9/HY;63<.&UD=7@+``$$ +MZ`,```3H`P``2\[/*TG-*RE6<'8,".8"`%!+!P@I4T'W$`````X```!02P$" +M%`,4``````#*D+=6````````````````"P`@````````````[4$`````=&5S +M=%]B87-I8R]55`T`!]PX;63U.6UDW#AM9'5X"P`!!.@#```$Z`,``%!+`0(4 +M`Q0`"``(``F-MU9Y:C`$#0````L````,`"````````````"D@4D```!T97-T +M7V)A<VEC+V%55`T`!\,R;63Z.6UD$SAM9'5X"P`!!.@#```$Z`,``%!+`0(4 +M`Q0`"``(``Z-MU:Z.1TO#0````L````,`"````````````"D@;````!T97-T +M7V)A<VEC+V)55`T`!\TR;63Z.6UD.SAM9'5X"P`!!.@#```$Z`,``%!+`0(4 +M`Q0`"``(`%*-MU;["`8V#0````L````,`"````````````"D@1<!``!T97-T +M7V)A<VEC+V-55`T`!TPS;633.&UDSSAM9'5X"P`!!.@#```$Z`,``%!+`0(4 +M`Q0`"``(`,J0MU8I4T'W$`````X````/`"````````````"D@7X!``!T97-T +M7V)A<VEC+T-!4%-55`T`!]PX;63Z.6UDW#AM9'5X"P`!!.@#```$Z`,``%!+ +4!08`````!0`%`,0!``#K`0`````` +` +end diff --git a/unzip/test/test_d.c b/unzip/test/test_d.c new file mode 100644 index 000000000000..01ab9b8caaa3 --- /dev/null +++ b/unzip/test/test_d.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2023 Adrian Vovk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* Test d arg - extract to target dir - before zipfile argument */ +DEFINE_TEST(test_d_before_zipfile) +{ + const char *reffile = "test_basic.zip"; + int r; + + extract_reference_file(reffile); + r = systemf("%s -d foobar %s >test.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertNonEmptyFile("test.out"); + assertEmptyFile("test.err"); + + assertTextFileContents("contents a\n", "foobar/test_basic/a"); + assertTextFileContents("contents b\n", "foobar/test_basic/b"); + assertTextFileContents("contents c\n", "foobar/test_basic/c"); + assertTextFileContents("contents CAPS\n", "foobar/test_basic/CAPS"); +} + +/* Test d arg - extract to target dir - after zipfile argument */ +DEFINE_TEST(test_d_after_zipfile) +{ + const char *reffile = "test_basic.zip"; + int r; + + extract_reference_file(reffile); + r = systemf("%s %s -d foobar >test.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertNonEmptyFile("test.out"); + assertEmptyFile("test.err"); + + assertTextFileContents("contents a\n", "foobar/test_basic/a"); + assertTextFileContents("contents b\n", "foobar/test_basic/b"); + assertTextFileContents("contents c\n", "foobar/test_basic/c"); + assertTextFileContents("contents CAPS\n", "foobar/test_basic/CAPS"); +} diff --git a/unzip/test/test_doubledash.c b/unzip/test/test_doubledash.c new file mode 100644 index 000000000000..eb7d34e4f6cc --- /dev/null +++ b/unzip/test/test_doubledash.c @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2023 Adrian Vovk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* Test double dash arg - swallow "--" and use next argument as file name */ +DEFINE_TEST(test_doubledash) +{ + const char *reffile = "test_basic.zip"; + int r; + + extract_reference_file(reffile); + r = systemf("%s -- %s >test.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertNonEmptyFile("test.out"); + assertEmptyFile("test.err"); + + assertTextFileContents("contents a\n", "test_basic/a"); + assertTextFileContents("contents b\n", "test_basic/b"); + assertTextFileContents("contents c\n", "test_basic/c"); + assertTextFileContents("contents CAPS\n", "test_basic/CAPS"); +} diff --git a/unzip/test/test_encrypted.zip.uu b/unzip/test/test_encrypted.zip.uu new file mode 100644 index 000000000000..6aabeb9f5786 --- /dev/null +++ b/unzip/test/test_encrypted.zip.uu @@ -0,0 +1,13 @@ +begin 644 test_encrypted.zip +M4$L#!!0``````'*1MU8````````````````*`"``96YC<GEP=&5D+U54#0`' +M&#IM9!LZ;608.FUD=7@+``$$Z`,```3H`P``4$L#!!0`"0!C`'*1MU8````` +M``````H````2`"L`96YC<GEP=&5D+V9I;&4N='AT550-``<8.FUD&#IM9!@Z +M;61U>`L``03H`P``!.@#```!F0<``@!!10,(`*_-)-RYPDYFJ$Q9+L<I#->< +M'#C?XVBR9/=H?7U\LC!A^8<6[&CO#PM02P<(`````"@````*````4$L!`A0# +M%```````<I&W5@````````````````H`(````````````.U!`````&5N8W)Y +M<'1E9"]55`T`!Q@Z;60;.FUD&#IM9'5X"P`!!.@#```$Z`,``%!+`0(4`Q0` +M"0!C`'*1MU8`````*`````H````2`"L```````````"D@4@```!E;F-R>7!T +M960O9FEL92YT>'155`T`!Q@Z;608.FUD&#IM9'5X"P`!!.@#```$Z`,```&9 +?!P`"`$%%`P@`4$L%!@`````"``(`PP```-L````````` +` +end diff --git a/unzip/test/test_glob.c b/unzip/test/test_glob.c new file mode 100644 index 000000000000..b334ce4bd37d --- /dev/null +++ b/unzip/test/test_glob.c @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2023 Adrian Vovk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* Test that the glob works */ +DEFINE_TEST(test_glob) +{ + const char *reffile = "test_basic.zip"; + int r; + + extract_reference_file(reffile); + r = systemf("%s %s test_*/[ab] >test.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertNonEmptyFile("test.out"); + assertEmptyFile("test.err"); + + assertTextFileContents("contents a\n", "test_basic/a"); + assertTextFileContents("contents b\n", "test_basic/b"); + assertFileNotExists("test_basic/c"); + assertFileNotExists("test_basic/CAPS"); +} diff --git a/unzip/test/test_j.c b/unzip/test/test_j.c new file mode 100644 index 000000000000..a449e02644b5 --- /dev/null +++ b/unzip/test/test_j.c @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2023 Adrian Vovk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* Test j arg - don't make directories */ +DEFINE_TEST(test_j) +{ + const char *reffile = "test_basic.zip"; + int r; + + extract_reference_file(reffile); + r = systemf("%s -j %s >test.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertNonEmptyFile("test.out"); + assertEmptyFile("test.err"); + + assertTextFileContents("contents a\n", "a"); + assertTextFileContents("contents b\n", "b"); + assertTextFileContents("contents c\n", "c"); + assertTextFileContents("contents CAPS\n", "CAPS"); +} diff --git a/unzip/test/test_n.c b/unzip/test/test_n.c new file mode 100644 index 000000000000..4e893f04b7ae --- /dev/null +++ b/unzip/test/test_n.c @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2023 Adrian Vovk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* Test n arg - don't overrite existing files */ +DEFINE_TEST(test_n) +{ + const char *reffile = "test_basic.zip"; + int r; + + assertMakeDir("test_basic", 0755); + assertMakeFile("test_basic/a", 0644, "orig a\n"); + assertMakeFile("test_basic/b", 0644, "orig b\n"); + + extract_reference_file(reffile); + r = systemf("%s -n %s >test.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertNonEmptyFile("test.out"); + assertEmptyFile("test.err"); + + assertTextFileContents("orig a\n", "test_basic/a"); + assertTextFileContents("orig b\n", "test_basic/b"); + assertTextFileContents("contents c\n", "test_basic/c"); + assertTextFileContents("contents CAPS\n", "test_basic/CAPS"); +} diff --git a/unzip/test/test_not_exist.c b/unzip/test/test_not_exist.c new file mode 100644 index 000000000000..aa660dc646e5 --- /dev/null +++ b/unzip/test/test_not_exist.c @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2023 Adrian Vovk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* Test non existant file */ +DEFINE_TEST(test_not_exist) +{ + int r; + r = systemf("%s nonexist.zip >test.out 2>test.err", testprog); + assert(r != 0); + assertEmptyFile("test.out"); + assertNonEmptyFile("test.err"); +} diff --git a/unzip/test/test_o.c b/unzip/test/test_o.c new file mode 100644 index 000000000000..af0c4128686f --- /dev/null +++ b/unzip/test/test_o.c @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2023 Adrian Vovk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* Test o arg - overrite existing files */ +DEFINE_TEST(test_o) +{ + const char *reffile = "test_basic.zip"; + int r; + + assertMakeDir("test_basic", 0755); + assertMakeFile("test_basic/a", 0644, "orig a\n"); + assertMakeFile("test_basic/b", 0644, "orig b\n"); + + extract_reference_file(reffile); + r = systemf("%s -o %s >test.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertEmptyFile("test.err"); + + assertTextFileContents("contents a\n", "test_basic/a"); + assertTextFileContents("contents b\n", "test_basic/b"); + assertTextFileContents("contents c\n", "test_basic/c"); + assertTextFileContents("contents CAPS\n", "test_basic/CAPS"); +} diff --git a/unzip/test/test_p.c b/unzip/test/test_p.c new file mode 100644 index 000000000000..f34a5eae8e13 --- /dev/null +++ b/unzip/test/test_p.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2023 Adrian Vovk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* Test p arg - Print to stdout */ +DEFINE_TEST(test_p) +{ + const char *reffile = "test_basic.zip"; + int r; + + extract_reference_file(reffile); + r = systemf("%s -p %s >test.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertTextFileContents("contents a\ncontents b\ncontents c\ncontents CAPS\n", "test.out"); + assertEmptyFile("test.err"); +} diff --git a/unzip/test/test_q.c b/unzip/test/test_q.c new file mode 100644 index 000000000000..9a532c888366 --- /dev/null +++ b/unzip/test/test_q.c @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2023 Adrian Vovk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* Test q arg - Quiet */ +DEFINE_TEST(test_q) +{ + const char *reffile = "test_basic.zip"; + int r; + + extract_reference_file(reffile); + r = systemf("%s -q %s >test.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertEmptyFile("test.out"); + assertEmptyFile("test.err"); + + assertTextFileContents("contents a\n", "test_basic/a"); + assertTextFileContents("contents b\n", "test_basic/b"); + assertTextFileContents("contents c\n", "test_basic/c"); + assertTextFileContents("contents CAPS\n", "test_basic/CAPS"); +} diff --git a/unzip/test/test_singlefile.c b/unzip/test/test_singlefile.c new file mode 100644 index 000000000000..70c376eb3932 --- /dev/null +++ b/unzip/test/test_singlefile.c @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2023 Adrian Vovk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* Ensure single-file zips work */ +DEFINE_TEST(test_singlefile) +{ + const char *reffile = "test_singlefile.zip"; + int r; + + extract_reference_file(reffile); + r = systemf("%s %s >test.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertNonEmptyFile("test.out"); + assertEmptyFile("test.err"); + + assertTextFileContents("hello\n", "file.txt"); +} diff --git a/unzip/test/test_singlefile.zip.uu b/unzip/test/test_singlefile.zip.uu new file mode 100644 index 000000000000..589e08f12396 --- /dev/null +++ b/unzip/test/test_singlefile.zip.uu @@ -0,0 +1,8 @@ +begin 644 test_singlefile.zip +M4$L#!!0`"``(`&"6MU8```````````8````(`"``9FEL92YT>'155`T`!U1# +M;6140VUD5$-M9'5X"P`!!.@#```$Z`,``,M(S<G)YP(`4$L'""`P.C8(```` +M!@```%!+`0(4`Q0`"``(`&"6MU8@,#HV"`````8````(`"````````````"D +M@0````!F:6QE+G1X=%54#0`'5$-M9%1#;6140VUD=7@+``$$Z`,```3H`P`` +64$L%!@`````!``$`5@```%X````````` +` +end diff --git a/unzip/test/test_t.c b/unzip/test/test_t.c new file mode 100644 index 000000000000..40d8d39e54d5 --- /dev/null +++ b/unzip/test/test_t.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2023 Adrian Vovk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* Test t arg - Test zip contents */ +DEFINE_TEST(test_t) +{ + const char *reffile = "test_basic.zip"; + int r; + + extract_reference_file(reffile); + r = systemf("%s -t %s >test.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertNonEmptyFile("test.out"); + assertEmptyFile("test.err"); +} diff --git a/unzip/test/test_t_bad.c b/unzip/test/test_t_bad.c new file mode 100644 index 000000000000..f9afbb40dae2 --- /dev/null +++ b/unzip/test/test_t_bad.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2023 Adrian Vovk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* Test t arg - Test zip contents, but fail! */ +DEFINE_TEST(test_t_bad) +{ + const char *reffile = "test_t_bad.zip"; + int r; + + extract_reference_file(reffile); + r = systemf("%s -t %s >test.out 2>test.err", testprog, reffile); + assert(r != 0); + assertNonEmptyFile("test.out"); + assertNonEmptyFile("test.err"); +} diff --git a/unzip/test/test_t_bad.zip.uu b/unzip/test/test_t_bad.zip.uu new file mode 100644 index 000000000000..ae6ad07925e6 --- /dev/null +++ b/unzip/test/test_t_bad.zip.uu @@ -0,0 +1,25 @@ +begin 644 test_t_bad.zip +M4$L#!!0``````,J0MU8````````````````+`"``=&5S=%]B87-I8R]55`T` +M!]PX;63U.6UDW#AM9'5X"P`!!.@#```$Z`,``%!+`P04``@`"``)C;=6```` +M```````+````#``@`'1E<W1?8F%S:6,O85546``'PS)M9/HY;603.&UD=7@+ +M``$$Z`,```3H`P``2\[/*TG-*RE62.0"`%!+!PAY:C`$#0````L```!02P,$ +M%&$(``@`#HVW5@``````````"P````P`(`!T97-T7V)A<VEC+V)55`T`!\TR +M;63Z.6UD.SAM9'5X"P`!!.@#```$Z`,``$O.SRM)S2LI5DCB`@!02P<(NCD= +M+PT````+````4$L#!!0`"``(`%*-MU8```````````L````,`"``=&5S=%]B +M87-I8R]C550-``=,,VUDTSAM9,\X;61U>`L``03H`P``!.@#``!+SL\K2<TK +M*59(Y@(`4$L'"/L(!C8-````"P```%!+`P04``@`"`#*D+=6```````````. +M````#P`@`'1E<W1?8F%S:6,O0T%04U54#0`'W#AM9/HY;63<.&UD=7@+``$$ +MZ`,```3H`P``2\[/*TG-*RE6<'8,".8"`%!+!P@I4T'W$`````X```!02P$" +M%`,4``````#*D+=6````````````````"P`@````````````[4(`````=&5S +M=%]B87-I8R]55`T`!]PX;63U.6UDW#AM9'5X"P`!!.@#```$Z`,``%!+`0(4 +M`Q0`"``(``F-MU9Y:C`$#0````L````,`"````````````"D@4D```!T97-T +M7V)A<VEC+V%55`T`!\,R;63Z.6UD$SAM9'5X"P`!!.@#```$Z`,``%!+`0(4 +M`Q0`"``(``Z-MU:Z.1TO#0````L````,`"````````````"D@;````!T97-T +M7V)A<VEC+V)55`T`!\TR;63Z.6UD.SAM9'5X"P`!!.@#```$Z`,``%!+`0(4 +M`Q0`"``(`%*-MU;["`8V#0````L````,`"````````````"D@1<!``!T97-T +M7V)A<VEC+V-55`T`!TPS;633.&UDSSAM9'5X"P`!!.@#```$Z`,``%!+`0(4 +M`Q0`"``(`,J0MU8I4T'W$`````X````/`"````````````"D@7X!``!T97-T +M7V)A<VEC+T-!4%-55`T`!]PX;63Z.6UDW#AM9'5X"P`!!.@#```$Z`,``%!+ +5!08`````!0`%`,0!``#K`0`````* +` +end diff --git a/unzip/test/test_version.c b/unzip/test/test_version.c new file mode 100644 index 000000000000..efa797982d57 --- /dev/null +++ b/unzip/test/test_version.c @@ -0,0 +1,34 @@ +/*- + * Copyright (c) 2003-2017 Tim Kientzle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* + * Test that --version option works and generates reasonable output. + */ + +DEFINE_TEST(test_version) +{ + assertVersion(testprog, "bsdunzip"); +} diff --git a/unzip/test/test_x.c b/unzip/test/test_x.c new file mode 100644 index 000000000000..d55376849ce9 --- /dev/null +++ b/unzip/test/test_x.c @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2023 Adrian Vovk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* Test x arg with single exclude path */ +DEFINE_TEST(test_x_single) +{ + const char *reffile = "test_basic.zip"; + int r; + + extract_reference_file(reffile); + r = systemf("%s %s -x test_basic/c >test.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertNonEmptyFile("test.out"); + assertEmptyFile("test.err"); + + assertTextFileContents("contents a\n", "test_basic/a"); + assertTextFileContents("contents b\n", "test_basic/b"); + assertFileNotExists("test_basic/c"); + assertTextFileContents("contents CAPS\n", "test_basic/CAPS"); +} + +/* Test x arg with multiple exclude paths */ +DEFINE_TEST(test_x_multiple) +{ + const char *reffile = "test_basic.zip"; + int r; + + extract_reference_file(reffile); + r = systemf("%s %s -x test_basic/c test_basic/b >test.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertNonEmptyFile("test.out"); + assertEmptyFile("test.err"); + + assertTextFileContents("contents a\n", "test_basic/a"); + assertFileNotExists("test_basic/b"); + assertFileNotExists("test_basic/c"); + assertTextFileContents("contents CAPS\n", "test_basic/CAPS"); +} + +/* Test x arg with multiple exclude paths and a d arg afterwards */ +DEFINE_TEST(test_x_multiple_with_d) +{ + const char *reffile = "test_basic.zip"; + int r; + + extract_reference_file(reffile); + r = systemf("%s %s -x test_basic/c test_basic/b -d foobar >test.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertNonEmptyFile("test.out"); + assertEmptyFile("test.err"); + + assertTextFileContents("contents a\n", "foobar/test_basic/a"); + assertFileNotExists("foobar/test_basic/b"); + assertFileNotExists("foobar/test_basic/c"); + assertTextFileContents("contents CAPS\n", "foobar/test_basic/CAPS"); +} |