aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Matuska <mm@FreeBSD.org>2019-06-11 23:16:13 +0000
committerMartin Matuska <mm@FreeBSD.org>2019-06-11 23:16:13 +0000
commite3586989c2bb0a5fe79b03eaa5ab50eec20eaf26 (patch)
tree489620a6c8afeeefb3bf2affc04d0c757f3474a8
parent8e97bbedaebab6c0c9e87545b8424c95f206f148 (diff)
downloadsrc-e3586989c2bb0a5fe79b03eaa5ab50eec20eaf26.tar.gz
src-e3586989c2bb0a5fe79b03eaa5ab50eec20eaf26.zip
Update vendor/libarchive/dist to git 614110e76d9dbb9ed3e159a71cbd75fa3b23efe3vendor/libarchive/3.4.0
Relevant vendor changes (release 3.4.0): - check_symlinks_fsobj() without chdir() and fchdir() - bsdtar.1 manpage fixes - patches from OpenBSD to libarchive_fe/passphrase.c
Notes
Notes: svn path=/vendor/libarchive/dist/; revision=348971 svn path=/vendor/libarchive/3.4.0/; revision=348973; tag=vendor/libarchive/3.4.0
-rw-r--r--.gitignore47
-rw-r--r--CMakeLists.txt3
-rw-r--r--NEWS6
-rw-r--r--README.md1
-rwxr-xr-xbuild/ci/build.sh2
-rw-r--r--build/cmake/config.h.in3
-rw-r--r--build/version2
-rw-r--r--configure.ac6
-rw-r--r--contrib/libarchive.spec249
-rw-r--r--libarchive/archive.h4
-rw-r--r--libarchive/archive_entry.h2
-rw-r--r--libarchive/archive_write_add_filter_b64encode.c10
-rw-r--r--libarchive/archive_write_disk_posix.c190
-rw-r--r--libarchive/archive_write_disk_windows.c2
-rw-r--r--libarchive_fe/line_reader.c3
-rw-r--r--libarchive_fe/passphrase.c95
-rw-r--r--tar/bsdtar.133
17 files changed, 429 insertions, 229 deletions
diff --git a/.gitignore b/.gitignore
index a766c3cf7f77..bdee31478876 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,19 +1,19 @@
*~
*.o
*.exe
+*.la
*.lo
*.cmake
+.deps/
.libs/
+.dirstamp
Makefile
Makefile.in
aclocal.m4
autom4te.cache/
bsdcat
-bsdcat_test
bsdcpio
-bsdcpio_test
bsdtar
-bsdtar_test
build/autoconf/compile
build/autoconf/config.guess
build/autoconf/config.sub
@@ -27,50 +27,22 @@ build/autoconf/ltversion.m4
build/autoconf/lt~obsolete.m4
build/autoconf/missing
build/pkgconfig/libarchive.pc
-cat/.deps/
-cat/.dirstamp
-cat/test/.deps/
-cat/test/.dirstamp
cat/test/list.h
+config.cache
config.h
config.h.in
config.log
config.status
configure
-cpio/.deps/
-cpio/.dirstamp
-cpio/test/.deps/
-cpio/test/.dirstamp
cpio/test/list.h
-libarchive.la
-libarchive/.deps/
-libarchive/.dirstamp
-libarchive/test/.deps/
-libarchive/test/.dirstamp
libarchive/test/list.h
-libarchive_fe.la
-libarchive_fe/.deps/
-libarchive_fe/.dirstamp
-libarchive_test
libtool
stamp-h1
-tar/.deps/
-tar/.dirstamp
-tar/test/.deps/
-tar/test/.dirstamp
tar/test/list.h
CMakeCache.txt
CMakeFiles/
DartConfiguration.tcl
cmake.tmp/
-cpio/CMakeFiles/
-cpio/test/CMakeFiles/
-libarchive/CMakeFiles/
-libarchive/test/CMakeFiles/
-tar/CMakeFiles/
-tar/test/CMakeFiles/
-test_utils/.deps/
-test_utils/.dirstamp
doc/html/*.html
doc/man/*.1
@@ -90,15 +62,10 @@ libarchive/libarchive.so.*
.DS_Store
-bsdcat_test.log
-bsdcat_test.trs
-bsdcpio_test.log
-bsdcpio_test.trs
-bsdtar_test.log
-bsdtar_test.trs
+/*_test
+/*_test.log
+/*_test.trs
build/autoconf/test-driver
-libarchive_test.log
-libarchive_test.trs
test-suite.log
.sw?
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0d6b8f14062b..4fd93d048027 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -18,7 +18,7 @@ endif()
# RelWithDebInfo : Release build with Debug Info
# MinSizeRel : Release Min Size build
IF(NOT CMAKE_BUILD_TYPE)
- SET(CMAKE_BUILD_TYPE "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".
@@ -1350,6 +1350,7 @@ CHECK_FUNCTION_EXISTS_GLIBC(strrchr HAVE_STRRCHR)
CHECK_FUNCTION_EXISTS_GLIBC(symlink HAVE_SYMLINK)
CHECK_FUNCTION_EXISTS_GLIBC(timegm HAVE_TIMEGM)
CHECK_FUNCTION_EXISTS_GLIBC(tzset HAVE_TZSET)
+CHECK_FUNCTION_EXISTS_GLIBC(unlinkat HAVE_UNLINKAT)
CHECK_FUNCTION_EXISTS_GLIBC(unsetenv HAVE_UNSETENV)
CHECK_FUNCTION_EXISTS_GLIBC(utime HAVE_UTIME)
CHECK_FUNCTION_EXISTS_GLIBC(utimes HAVE_UTIMES)
diff --git a/NEWS b/NEWS
index e2d96aebd714..222532d1e978 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,7 @@
+Jun 11, 2019: libarchive 3.4.0 released
+
+May 18, 2019: Fixes for reading Android APK and JAR archives
+
Apr 16, 2019: Support for non-recursive list and extract
Apr 14, 2019: New tar option: --exclude-vcs
@@ -6,7 +10,7 @@ Mar 27, 2019: Support for file and directory symlinks on Windows
Mar 12, 2019: Important fixes for storing file attributes and flags
-Jan 20, 2019: Support for xz, lzma, ppmd8 and bzip2 compression in zip archives
+Jan 20, 2019: Support for xz, lzma, ppmd8 and bzip2 decompression in ZIP files
Oct 06, 2018: RAR 5.0 reader
diff --git a/README.md b/README.md
index df19125f9030..2912b3d0a61e 100644
--- a/README.md
+++ b/README.md
@@ -81,6 +81,7 @@ Currently, the library automatically detects and reads the following fomats:
* Binary cpio (big-endian or little-endian)
* ISO9660 CD-ROM images (with optional Rockridge or Joliet extensions)
* ZIP archives (with uncompressed or "deflate" compressed entries, including support for encrypted Zip archives)
+ * ZIPX archives (with support for bzip2, ppmd8, lzma and xz compressed entries)
* GNU and BSD 'ar' archives
* 'mtree' format
* 7-Zip archives
diff --git a/build/ci/build.sh b/build/ci/build.sh
index 64eb07fb23aa..1e5cd11f7051 100755
--- a/build/ci/build.sh
+++ b/build/ci/build.sh
@@ -75,7 +75,7 @@ if [ -n "${DEBUG}" ]; then
else
export CFLAGS="-g -fsanitize=address"
fi
- if ["${BS}" = "cmake" ]; then
+ if [ "${BS}" = "cmake" ]; then
CONFIGURE_ARGS="${CONFIGURE_ARGS} -DCMAKE_C_CFLAGS=-g -fsanitize=address"
fi
fi
diff --git a/build/cmake/config.h.in b/build/cmake/config.h.in
index aed77f9a81c9..f0761c957ecd 100644
--- a/build/cmake/config.h.in
+++ b/build/cmake/config.h.in
@@ -1111,6 +1111,9 @@ typedef uint64_t uintmax_t;
/* Define to 1 if you have the <unistd.h> header file. */
#cmakedefine HAVE_UNISTD_H 1
+/* Define to 1 if you have the `unlinkat' function. */
+#cmakedefine HAVE_UNLINKAT 1
+
/* Define to 1 if you have the `unsetenv' function. */
#cmakedefine HAVE_UNSETENV 1
diff --git a/build/version b/build/version
index 85595ba58905..784078cf9c92 100644
--- a/build/version
+++ b/build/version
@@ -1 +1 @@
-3003004dev
+3004000
diff --git a/configure.ac b/configure.ac
index 64f77a673682..c517b17c1975 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4,8 +4,8 @@ dnl First, define all of the version numbers up front.
dnl In particular, this allows the version macro to be used in AC_INIT
dnl These first two version numbers are updated automatically on each release.
-m4_define([LIBARCHIVE_VERSION_S],[3.3.4dev])
-m4_define([LIBARCHIVE_VERSION_N],[3003004])
+m4_define([LIBARCHIVE_VERSION_S],[3.4.0])
+m4_define([LIBARCHIVE_VERSION_N],[3004000])
dnl bsdtar and bsdcpio versioning tracks libarchive
m4_define([BSDTAR_VERSION_S],LIBARCHIVE_VERSION_S())
@@ -636,7 +636,7 @@ AC_CHECK_FUNCS([nl_langinfo openat pipe poll posix_spawnp readlink readlinkat])
AC_CHECK_FUNCS([readpassphrase])
AC_CHECK_FUNCS([select setenv setlocale sigaction statfs statvfs])
AC_CHECK_FUNCS([strchr strdup strerror strncpy_s strrchr symlink timegm])
-AC_CHECK_FUNCS([tzset unsetenv utime utimensat utimes vfork])
+AC_CHECK_FUNCS([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 _localtime64_s _mkgmtime64])
diff --git a/contrib/libarchive.spec b/contrib/libarchive.spec
index f4ed359721a0..211b391e9173 100644
--- a/contrib/libarchive.spec
+++ b/contrib/libarchive.spec
@@ -1,105 +1,216 @@
-Summary: Library to create and read several different archive formats
-Name: libarchive
-Version: 3.1.2
-Release: 1
+Name: {{{ git_name }}}
+Version: {{{ git_version lead=3 follow=4 }}}
+Release: 1%{?dist}
+Summary: A library for handling streaming archive formats
+
License: BSD
-Group: Libraries
-Source0: http://libarchive.org/downloads/%{name}-%{version}.tar.gz
-URL: http:/libarchive.org/
-Requires: glibc
-Requires: zlib
-Requires: bzip2
+URL: http://www.libarchive.org/
+Source: {{{ git_pack }}}
+
+VCS: {{{ git_vcs }}}
+
+BuildRequires: automake
+BuildRequires: bison
+BuildRequires: bzip2-devel
+BuildRequires: e2fsprogs-devel
BuildRequires: gcc
-BuildRequires: gcc-c++
-BuildRequires: gawk
+BuildRequires: libacl-devel
+BuildRequires: libattr-devel
+BuildRequires: libtool
+BuildRequires: libxml2-devel
+BuildRequires: libzstd-devel
+BuildRequires: lz4-devel
+BuildRequires: lzo-devel
+BuildRequires: openssl-devel
+BuildRequires: sharutils
+BuildRequires: xz-devel
BuildRequires: zlib-devel
-BuildRequires: bzip2
-BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description
-Libarchive is a programming library that can create and read several
-different streaming archive formats, including most popular TAR
-variants and several CPIO formats. It can also write SHAR archives.
+Libarchive is a programming library that can create and read several different
+streaming archive formats, including most popular tar variants, several cpio
+formats, and both BSD and GNU ar variants. It can also write shar archives and
+read ISO9660 CDROM images and ZIP archives.
+
%package devel
-Summary: Header files for libarchive library
-Group: Development/Libraries
-Requires: %{name} = %{version}-%{release}
+Summary: Development files for %{name}
+Requires: %{name}%{?_isa} = %{version}-%{release}
%description devel
-Header files for libarchive library.
-
-%package static
-Summary: Static libarchive library
-Group: Development/Libraries
-Requires: %{name}-devel = %{version}-%{release}
+The %{name}-devel package contains libraries and header files for
+developing applications that use %{name}.
-%description static
-Static libarchive library.
%package -n bsdtar
-Summary: bsdtar - tar(1) implementation based on libarchive
-Group: Applications/Archiving
-Requires: %{name} = %{version}-%{release}
+Summary: Manipulate tape archives
+Requires: %{name}%{?_isa} = %{version}-%{release}
%description -n bsdtar
-bsdtar - tar(1) implementation based on libarchive.
+The bsdtar package contains standalone bsdtar utility split off regular
+libarchive packages.
+
%package -n bsdcpio
-Summary: bsdcpio - cpio(1) implementation based on libarchive
-Group: Applications/Archiving
-Requires: %{name} = %{version}-%{release}
+Summary: Copy files to and from archives
+Requires: %{name}%{?_isa} = %{version}-%{release}
%description -n bsdcpio
-bsdcpio - cpio(1) implementation based on libarchive
+The bsdcpio package contains standalone bsdcpio utility split off regular
+libarchive packages.
+
+
+%package -n bsdcat
+Summary: Expand files to standard output
+Requires: %{name}%{?_isa} = %{version}-%{release}
+
+%description -n bsdcat
+The bsdcat program typically takes a filename as an argument or reads standard
+input when used in a pipe. In both cases decompressed data it written to
+standard output.
+
%prep
-%setup -q
+{{{ git_setup_macro }}}
+%autosetup -p1
+
%build
-mkdir -p %{buildroot}
-./configure \
---prefix=%{_prefix} \
---libexecdir=%{_libexecdir} \
---libdir=%{_libdir} \
---mandir=%{_mandir} \
---infodir=%{_infodir} \
---enable-shared=yes \
---enable-static=yes \
-| tee %{buildroot}/config.log
-make | tee %{buildroot}/make.log
+build/autogen.sh
+%configure --disable-static --without-nettle LT_SYS_LIBRARY_PATH=%_libdir
+%make_build
+
%install
-[ "%buildroot" != "/" ] && [ -d %buildroot ] && rm -rf %buildroot;
-make DESTDIR=%buildroot install
+make install DESTDIR=$RPM_BUILD_ROOT
+find $RPM_BUILD_ROOT -name '*.la' -exec rm -f {} ';'
+
+# rhbz#1294252
+replace ()
+{
+ filename=$1
+ file=`basename "$filename"`
+ binary=${file%%.*}
+ pattern=${binary##bsd}
+
+ awk "
+ # replace the topic
+ /^.Dt ${pattern^^} 1/ {
+ print \".Dt ${binary^^} 1\";
+ next;
+ }
+ # replace the first occurence of \"$pattern\" by \"$binary\"
+ !stop && /^.Nm $pattern/ {
+ print \".Nm $binary\" ;
+ stop = 1 ;
+ next;
+ }
+ # print remaining lines
+ 1;
+ " "$filename" > "$filename.new"
+ mv "$filename".new "$filename"
+}
+
+for manpage in bsdtar.1 bsdcpio.1
+do
+ installed_manpage=`find "$RPM_BUILD_ROOT" -name "$manpage"`
+ replace "$installed_manpage"
+done
+
+
+%check
+%if %{with check}
+logfiles ()
+{
+ find -name '*_test.log' -or -name test-suite.log
+}
+
+tempdirs ()
+{
+ cat `logfiles` \
+ | awk "match(\$0, /[^[:space:]]*`date -I`[^[:space:]]*/) { print substr(\$0, RSTART, RLENGTH); }" \
+ | sort | uniq
+}
+
+cat_logs ()
+{
+ for i in `logfiles`
+ do
+ echo "=== $i ==="
+ cat "$i"
+ done
+}
+
+run_testsuite ()
+{
+ rc=0
+ %make_build check -j1 || {
+ # error happened - try to extract in koji as much info as possible
+ cat_logs
+
+ for i in `tempdirs`; do
+ if test -d "$i" ; then
+ find $i -printf "%p\n ~> a: %a\n ~> c: %c\n ~> t: %t\n ~> %s B\n"
+ cat $i/*.log
+ fi
+ done
+ return 1
+ }
+ cat_logs
+}
+
+# On a ppc/ppc64 is some race condition causing 'make check' fail on ppc
+# when both 32 and 64 builds are done in parallel on the same machine in
+# koji. Try to run once again if failed.
+%ifarch ppc
+run_testsuite || run_testsuite
+%else
+run_testsuite
+%endif
+%endif
-%clean
-rm -fr %buildroot
%files
-%{_libdir}/libarchive.so*
-
-%files static
-%{_libdir}/libarchive.a
+%{!?_licensedir:%global license %%doc}
+%license COPYING
+%doc NEWS README.md
+%{_libdir}/libarchive.so.13*
+%{_mandir}/*/cpio.*
+%{_mandir}/*/mtree.*
+%{_mandir}/*/tar.*
%files devel
-%{_libdir}/pkgconfig/libarchive.pc
-%{_libdir}/libarchive.la
%{_includedir}/*.h
-%doc %{_mandir}/man3/*
-%doc %{_mandir}/man5/*
+%{_mandir}/*/archive*
+%{_mandir}/*/libarchive*
+%{_libdir}/libarchive.so
+%{_libdir}/pkgconfig/libarchive.pc
%files -n bsdtar
-%attr(755,root,root) %{_bindir}/bsdtar
-%doc %{_mandir}/man1/bsdtar.1*
+%{!?_licensedir:%global license %%doc}
+%license COPYING
+%doc NEWS README.md
+%{_bindir}/bsdtar
+%{_mandir}/*/bsdtar*
%files -n bsdcpio
-%attr(755,root,root) %{_bindir}/bsdcpio
-%doc %{_mandir}/man1/bsdcpio.1*
+%{!?_licensedir:%global license %%doc}
+%license COPYING
+%doc NEWS README.md
+%{_bindir}/bsdcpio
+%{_mandir}/*/bsdcpio*
+
+%files -n bsdcat
+%{!?_licensedir:%global license %%doc}
+%license COPYING
+%doc NEWS README.md
+%{_bindir}/bsdcat
+%{_mandir}/*/bsdcat*
+
+
%changelog
-* Wed May 01 2013 Nikolai Lifanov <lifanov@mail.lifanov.com> - 3.1.2-1
-- Initial package
-- contrib/libarchive.spec by PLD team overhaul
-- Added "bsdcpio" package
-- Fixed build on x86_64 platform
+* Thu Mar 28 2019 Pavel Raiskup <praiskup@redhat.com> - 3.3.3-7
+- simplify libtool hacks
+
+{{ git_changelog }}
diff --git a/libarchive/archive.h b/libarchive/archive.h
index daaaf783a001..9ad9260b41ad 100644
--- a/libarchive/archive.h
+++ b/libarchive/archive.h
@@ -36,7 +36,7 @@
* assert that ARCHIVE_VERSION_NUMBER >= 2012108.
*/
/* Note: Compiler will complain if this does not match archive_entry.h! */
-#define ARCHIVE_VERSION_NUMBER 3003004
+#define ARCHIVE_VERSION_NUMBER 3004000
#include <sys/stat.h>
#include <stddef.h> /* for wchar_t */
@@ -155,7 +155,7 @@ __LA_DECL int archive_version_number(void);
/*
* Textual name/version of the library, useful for version displays.
*/
-#define ARCHIVE_VERSION_ONLY_STRING "3.3.4dev"
+#define ARCHIVE_VERSION_ONLY_STRING "3.4.0"
#define ARCHIVE_VERSION_STRING "libarchive " ARCHIVE_VERSION_ONLY_STRING
__LA_DECL const char * archive_version_string(void);
diff --git a/libarchive/archive_entry.h b/libarchive/archive_entry.h
index f8a7e532f2b9..71cc63653b92 100644
--- a/libarchive/archive_entry.h
+++ b/libarchive/archive_entry.h
@@ -30,7 +30,7 @@
#define ARCHIVE_ENTRY_H_INCLUDED
/* Note: Compiler will complain if this does not match archive.h! */
-#define ARCHIVE_VERSION_NUMBER 3003004
+#define ARCHIVE_VERSION_NUMBER 3004000
/*
* Note: archive_entry.h is for use outside of libarchive; the
diff --git a/libarchive/archive_write_add_filter_b64encode.c b/libarchive/archive_write_add_filter_b64encode.c
index 85eb087b0522..b46b19a0c74d 100644
--- a/libarchive/archive_write_add_filter_b64encode.c
+++ b/libarchive/archive_write_add_filter_b64encode.c
@@ -60,7 +60,7 @@ static int archive_filter_b64encode_write(struct archive_write_filter *,
const void *, size_t);
static int archive_filter_b64encode_close(struct archive_write_filter *);
static int archive_filter_b64encode_free(struct archive_write_filter *);
-static void b64_encode(struct archive_string *, const unsigned char *, size_t);
+static void la_b64_encode(struct archive_string *, const unsigned char *, size_t);
static int64_t atol8(const char *, size_t);
static const char base64[] = {
@@ -180,7 +180,7 @@ archive_filter_b64encode_open(struct archive_write_filter *f)
}
static void
-b64_encode(struct archive_string *as, const unsigned char *p, size_t len)
+la_b64_encode(struct archive_string *as, const unsigned char *p, size_t len)
{
int c;
@@ -234,12 +234,12 @@ archive_filter_b64encode_write(struct archive_write_filter *f, const void *buff,
}
if (state->hold_len < LBYTES)
return (ret);
- b64_encode(&state->encoded_buff, state->hold, LBYTES);
+ la_b64_encode(&state->encoded_buff, state->hold, LBYTES);
state->hold_len = 0;
}
for (; length >= LBYTES; length -= LBYTES, p += LBYTES)
- b64_encode(&state->encoded_buff, p, LBYTES);
+ la_b64_encode(&state->encoded_buff, p, LBYTES);
/* Save remaining bytes. */
if (length > 0) {
@@ -270,7 +270,7 @@ archive_filter_b64encode_close(struct archive_write_filter *f)
/* Flush remaining bytes. */
if (state->hold_len != 0)
- b64_encode(&state->encoded_buff, state->hold, state->hold_len);
+ la_b64_encode(&state->encoded_buff, state->hold, state->hold_len);
archive_string_sprintf(&state->encoded_buff, "====\n");
/* Write the last block */
archive_write_set_bytes_in_last_block(f->archive, 1);
diff --git a/libarchive/archive_write_disk_posix.c b/libarchive/archive_write_disk_posix.c
index 84e8f80eed7c..b1a0bb3843a2 100644
--- a/libarchive/archive_write_disk_posix.c
+++ b/libarchive/archive_write_disk_posix.c
@@ -165,6 +165,10 @@ __FBSDID("$FreeBSD$");
#define O_NOFOLLOW 0
#endif
+#ifndef AT_FDCWD
+#define AT_FDCWD -100
+#endif
+
struct fixup_entry {
struct fixup_entry *next;
struct archive_acl acl;
@@ -348,6 +352,8 @@ struct archive_write_disk {
#define HFS_BLOCKS(s) ((s) >> 12)
+
+static int la_opendirat(int, const char *);
static void fsobj_error(int *, struct archive_string *, int, const char *,
const char *);
static int check_symlinks_fsobj(char *, int *, struct archive_string *,
@@ -401,6 +407,37 @@ static ssize_t _archive_write_disk_data_block(struct archive *, const void *,
size_t, int64_t);
static int
+la_opendirat(int fd, const char *path) {
+ const int flags = O_CLOEXEC
+#if defined(O_BINARY)
+ | O_BINARY
+#endif
+#if defined(O_DIRECTORY)
+ | O_DIRECTORY
+#endif
+#if defined(O_PATH)
+ | O_PATH
+#elif defined(O_SEARCH)
+ | O_SEARCH
+#elif defined(O_EXEC)
+ | O_EXEC
+#else
+ | O_RDONLY
+#endif
+ ;
+
+#if !defined(HAVE_OPENAT)
+ if (fd != AT_FDCWD) {
+ errno = ENOTSUP;
+ return (-1);
+ } else
+ return (open(fd, path, flags));
+#else
+ return (openat(fd, path, flags));
+#endif
+}
+
+static int
lazy_stat(struct archive_write_disk *a)
{
if (a->pst != NULL) {
@@ -1909,7 +1946,7 @@ edit_deep_directories(struct archive_write_disk *a)
return;
/* Try to record our starting dir. */
- a->restore_pwd = open(".", O_RDONLY | O_BINARY | O_CLOEXEC);
+ a->restore_pwd = la_opendirat(AT_FDCWD, ".");
__archive_ensure_cloexec_flag(a->restore_pwd);
if (a->restore_pwd < 0)
return;
@@ -2342,7 +2379,7 @@ _archive_write_disk_close(struct archive *_a)
{
struct archive_write_disk *a = (struct archive_write_disk *)_a;
struct fixup_entry *next, *p;
- int ret;
+ int fd, ret;
archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC,
ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA,
@@ -2353,21 +2390,33 @@ _archive_write_disk_close(struct archive *_a)
p = sort_dir_list(a->fixup_list);
while (p != NULL) {
+ fd = -1;
a->pst = NULL; /* Mark stat cache as out-of-date. */
+ if (p->fixup &
+ (TODO_TIMES | TODO_MODE_BASE | TODO_ACLS | TODO_FFLAGS)) {
+ fd = open(p->name,
+ O_WRONLY | O_BINARY | O_NOFOLLOW | O_CLOEXEC);
+ }
if (p->fixup & TODO_TIMES) {
- set_times(a, -1, p->mode, p->name,
+ set_times(a, fd, p->mode, p->name,
p->atime, p->atime_nanos,
p->birthtime, p->birthtime_nanos,
p->mtime, p->mtime_nanos,
p->ctime, p->ctime_nanos);
}
- if (p->fixup & TODO_MODE_BASE)
+ if (p->fixup & TODO_MODE_BASE) {
+#ifdef HAVE_FCHMOD
+ if (fd >= 0)
+ fchmod(fd, p->mode);
+ else
+#endif
chmod(p->name, p->mode);
+ }
if (p->fixup & TODO_ACLS)
- archive_write_disk_set_acls(&a->archive, -1, p->name,
- &p->acl, p->mode);
+ archive_write_disk_set_acls(&a->archive, fd,
+ p->name, &p->acl, p->mode);
if (p->fixup & TODO_FFLAGS)
- set_fflags_platform(a, -1, p->name,
+ set_fflags_platform(a, fd, p->name,
p->mode, p->fflags_set, 0);
if (p->fixup & TODO_MAC_METADATA)
set_mac_metadata(a, p->name, p->mac_metadata,
@@ -2376,6 +2425,8 @@ _archive_write_disk_close(struct archive *_a)
archive_acl_clear(&p->acl);
free(p->mac_metadata);
free(p->name);
+ if (fd >= 0)
+ close(fd);
free(p);
p = next;
}
@@ -2540,8 +2591,6 @@ fsobj_error(int *a_eno, struct archive_string *a_estr,
* scan the path and both can be optimized by comparing against other
* recent paths.
*/
-/* TODO: Extend this to support symlinks on Windows Vista and later. */
-
/*
* Checks the given path to see if any elements along it are symlinks. Returns
* ARCHIVE_OK if there are none, otherwise puts an error in errmsg.
@@ -2550,7 +2599,8 @@ static int
check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
int flags)
{
-#if !defined(HAVE_LSTAT)
+#if !defined(HAVE_LSTAT) && \
+ !(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 */
@@ -2565,7 +2615,10 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
char c;
int r;
struct stat st;
- int restore_pwd;
+ int chdir_fd;
+#if defined(HAVE_OPENAT) && defined(HAVE_FSTATAT) && defined(HAVE_UNLINKAT)
+ int fd;
+#endif
/* Nothing to do here if name is empty */
if(path[0] == '\0')
@@ -2586,9 +2639,9 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
* c holds what used to be in *tail
* last is 1 if this is the last tail
*/
- restore_pwd = open(".", O_RDONLY | O_BINARY | O_CLOEXEC);
- __archive_ensure_cloexec_flag(restore_pwd);
- if (restore_pwd < 0) {
+ chdir_fd = la_opendirat(AT_FDCWD, ".");
+ __archive_ensure_cloexec_flag(chdir_fd);
+ if (chdir_fd < 0) {
fsobj_error(a_eno, a_estr, errno,
"Could not open ", path);
return (ARCHIVE_FATAL);
@@ -2621,7 +2674,11 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
c = tail[0];
tail[0] = '\0';
/* 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
r = lstat(head, &st);
+#endif
if (r != 0) {
tail[0] = c;
/* We've hit a dir that doesn't exist; stop now. */
@@ -2647,7 +2704,19 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
}
} else if (S_ISDIR(st.st_mode)) {
if (!last) {
- if (chdir(head) != 0) {
+#if defined(HAVE_OPENAT) && defined(HAVE_FSTATAT) && defined(HAVE_UNLINKAT)
+ fd = la_opendirat(chdir_fd, head);
+ if (fd < 0)
+ r = -1;
+ else {
+ r = 0;
+ close(chdir_fd);
+ chdir_fd = fd;
+ }
+#else
+ r = chdir(head);
+#endif
+ if (r != 0) {
tail[0] = c;
fsobj_error(a_eno, a_estr, errno,
"Could not chdir ", path);
@@ -2664,7 +2733,12 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
* so we can overwrite it with the
* item being extracted.
*/
- if (unlink(head)) {
+#if defined(HAVE_OPENAT) && defined(HAVE_FSTATAT) && defined(HAVE_UNLINKAT)
+ r = unlinkat(chdir_fd, head, 0);
+#else
+ r = unlink(head);
+#endif
+ if (r != 0) {
tail[0] = c;
fsobj_error(a_eno, a_estr, errno,
"Could not remove symlink ",
@@ -2694,7 +2768,12 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
break;
} else if (flags & ARCHIVE_EXTRACT_UNLINK) {
/* User asked us to remove problems. */
- if (unlink(head) != 0) {
+#if defined(HAVE_OPENAT) && defined(HAVE_FSTATAT) && defined(HAVE_UNLINKAT)
+ r = unlinkat(chdir_fd, head, 0);
+#else
+ r = unlink(head);
+#endif
+ if (r != 0) {
tail[0] = c;
fsobj_error(a_eno, a_estr, 0,
"Cannot remove intervening "
@@ -2712,7 +2791,11 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
* This is needed to extract hardlinks over
* symlinks.
*/
+#if defined(HAVE_OPENAT) && defined(HAVE_FSTATAT) && defined(HAVE_UNLINKAT)
+ r = fstatat(chdir_fd, head, &st, 0);
+#else
r = la_stat(head, &st);
+#endif
if (r != 0) {
tail[0] = c;
if (errno == ENOENT) {
@@ -2725,7 +2808,19 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
break;
}
} else if (S_ISDIR(st.st_mode)) {
- if (chdir(head) != 0) {
+#if defined(HAVE_OPENAT) && defined(HAVE_FSTATAT) && defined(HAVE_UNLINKAT)
+ fd = la_opendirat(chdir_fd, head);
+ if (fd < 0)
+ r = -1;
+ else {
+ r = 0;
+ close(chdir_fd);
+ chdir_fd = fd;
+ }
+#else
+ r = chdir(head);
+#endif
+ if (r != 0) {
tail[0] = c;
fsobj_error(a_eno, a_estr,
errno,
@@ -2761,16 +2856,21 @@ check_symlinks_fsobj(char *path, int *a_eno, struct archive_string *a_estr,
}
/* Catches loop exits via break */
tail[0] = c;
-#ifdef HAVE_FCHDIR
+#if defined(HAVE_OPENAT) && defined(HAVE_FSTATAT) && defined(HAVE_UNLINKAT)
+ /* If we operate with openat(), fstatat() and unlinkat() there was
+ * no chdir(), so just close the fd */
+ if (chdir_fd >= 0)
+ close(chdir_fd);
+#elif HAVE_FCHDIR
/* If we changed directory above, restore it here. */
- if (restore_pwd >= 0) {
- r = fchdir(restore_pwd);
+ if (chdir_fd >= 0) {
+ r = fchdir(chdir_fd);
if (r != 0) {
fsobj_error(a_eno, a_estr, errno,
"chdir() failure", "");
}
- close(restore_pwd);
- restore_pwd = -1;
+ close(chdir_fd);
+ chdir_fd = -1;
if (r != 0) {
res = (ARCHIVE_FATAL);
}
@@ -3387,6 +3487,7 @@ static int
set_mode(struct archive_write_disk *a, int mode)
{
int r = ARCHIVE_OK;
+ int r2;
mode &= 07777; /* Strip off file type bits. */
if (a->todo & TODO_SGID_CHECK) {
@@ -3443,16 +3544,26 @@ set_mode(struct archive_write_disk *a, int mode)
}
if (S_ISLNK(a->mode)) {
-#ifdef HAVE_LCHMOD
/*
- * If this is a symlink, use lchmod(). If the
+ * If this is a symlink, use fchmod() or lchmod(). If the
* platform doesn't support lchmod(), just skip it. A
* platform that doesn't provide a way to set
* permissions on symlinks probably ignores
* permissions on symlinks, so a failure here has no
* impact.
*/
- if (lchmod(a->name, mode) != 0) {
+#ifdef HAVE_FCHMOD
+ if (a->fd > 0)
+ r2 = fchmod(a->fd, mode);
+ else
+#endif
+#ifdef HAVE_LCHMOD
+ r2 = lchmod(a->name, mode);
+#else
+ /* We don't have lchmod() here and a fd is not given */
+ r2 = 0;
+#endif
+ if (r2 != 0) {
switch (errno) {
case ENOTSUP:
case ENOSYS:
@@ -3471,7 +3582,6 @@ set_mode(struct archive_write_disk *a, int mode)
r = ARCHIVE_WARN;
}
}
-#endif
} else if (!S_ISDIR(a->mode)) {
/*
* If it's not a symlink and not a dir, then use
@@ -3480,21 +3590,19 @@ set_mode(struct archive_write_disk *a, int mode)
* post-extract fixup, which is handled elsewhere.
*/
#ifdef HAVE_FCHMOD
- if (a->fd >= 0) {
- if (fchmod(a->fd, mode) != 0) {
- archive_set_error(&a->archive, errno,
- "Can't set permissions to 0%o", (int)mode);
- r = ARCHIVE_WARN;
- }
- } else
+ if (a->fd >= 0)
+ r2 = fchmod(a->fd, mode);
+ else
#endif
- /* If this platform lacks fchmod(), then
- * we'll just use chmod(). */
- if (chmod(a->name, mode) != 0) {
- archive_set_error(&a->archive, errno,
- "Can't set permissions to 0%o", (int)mode);
- r = ARCHIVE_WARN;
- }
+ /* If this platform lacks fchmod(), then
+ * we'll just use chmod(). */
+ r2 = chmod(a->name, mode);
+
+ if (r2 != 0) {
+ archive_set_error(&a->archive, errno,
+ "Can't set permissions to 0%o", (int)mode);
+ r = ARCHIVE_WARN;
+ }
}
return (r);
}
diff --git a/libarchive/archive_write_disk_windows.c b/libarchive/archive_write_disk_windows.c
index 3d4d577f081f..8b947304bd61 100644
--- a/libarchive/archive_write_disk_windows.c
+++ b/libarchive/archive_write_disk_windows.c
@@ -1948,7 +1948,6 @@ current_fixup(struct archive_write_disk *a, const wchar_t *pathname)
return (a->current_fixup);
}
-/* TODO: Make this work. */
/*
* TODO: The deep-directory support bypasses this; disable deep directory
* support if we're doing symlink checks.
@@ -1958,7 +1957,6 @@ current_fixup(struct archive_write_disk *a, const wchar_t *pathname)
* scan the path and both can be optimized by comparing against other
* recent paths.
*/
-/* TODO: Extend this to support symlinks on Windows Vista and later. */
static int
check_symlinks(struct archive_write_disk *a)
{
diff --git a/libarchive_fe/line_reader.c b/libarchive_fe/line_reader.c
index 2d197d3dfb03..c7c4694eeb82 100644
--- a/libarchive_fe/line_reader.c
+++ b/libarchive_fe/line_reader.c
@@ -49,11 +49,10 @@ __FBSDID("$FreeBSD$");
*/
struct lafe_line_reader {
FILE *f;
- char *buff, *buff_end, *line_start, *line_end, *p;
+ char *buff, *buff_end, *line_start, *line_end;
char *pathname;
size_t buff_length;
int nullSeparator; /* Lines separated by null, not CR/CRLF/etc. */
- int ret;
};
struct lafe_line_reader *
diff --git a/libarchive_fe/passphrase.c b/libarchive_fe/passphrase.c
index 8c38ad777828..edf72d147182 100644
--- a/libarchive_fe/passphrase.c
+++ b/libarchive_fe/passphrase.c
@@ -23,9 +23,11 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-/* $OpenBSD: readpassphrase.c,v 1.22 2010/01/13 10:20:54 dtucker Exp $ */
+/* $OpenBSD: readpassphrase.c,v 1.27 2019/01/25 00:19:25 millert Exp $ */
+
/*
- * Copyright (c) 2000-2002, 2007 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 2000-2002, 2007, 2010
+ * Todd C. Miller <millert@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -199,6 +201,27 @@ restart:
}
/*
+ * Turn off echo if possible.
+ * If we are using a tty but are not the foreground pgrp this will
+ * generate SIGTTOU, so do it *before* installing the signal handlers.
+ */
+ if (input != STDIN_FILENO && tcgetattr(input, &oterm) == 0) {
+ memcpy(&term, &oterm, sizeof(term));
+ if (!(flags & RPP_ECHO_ON))
+ term.c_lflag &= ~(ECHO | ECHONL);
+#ifdef VSTATUS
+ if (term.c_cc[VSTATUS] != _POSIX_VDISABLE)
+ term.c_cc[VSTATUS] = _POSIX_VDISABLE;
+#endif
+ (void)tcsetattr(input, _T_FLUSH, &term);
+ } else {
+ memset(&term, 0, sizeof(term));
+ term.c_lflag |= ECHO;
+ memset(&oterm, 0, sizeof(oterm));
+ oterm.c_lflag |= ECHO;
+ }
+
+ /*
* Catch signals that would otherwise cause the user to end
* up with echo turned off in the shell. Don't worry about
* things like SIGXCPU and SIGVTALRM for now.
@@ -217,57 +240,41 @@ restart:
(void)sigaction(SIGTTIN, &sa, &savettin);
(void)sigaction(SIGTTOU, &sa, &savettou);
- /* Turn off echo if possible. */
- if (input != STDIN_FILENO && tcgetattr(input, &oterm) == 0) {
- memcpy(&term, &oterm, sizeof(term));
- if (!(flags & RPP_ECHO_ON))
- term.c_lflag &= ~(ECHO | ECHONL);
-#ifdef VSTATUS
- if (term.c_cc[VSTATUS] != _POSIX_VDISABLE)
- term.c_cc[VSTATUS] = _POSIX_VDISABLE;
-#endif
- (void)tcsetattr(input, _T_FLUSH, &term);
- } else {
- memset(&term, 0, sizeof(term));
- term.c_lflag |= ECHO;
- memset(&oterm, 0, sizeof(oterm));
- oterm.c_lflag |= ECHO;
+ if (!(flags & RPP_STDIN)) {
+ int r = write(output, prompt, strlen(prompt));
+ (void)r;
}
-
- /* No I/O if we are already backgrounded. */
- if (signo[SIGTTOU] != 1 && signo[SIGTTIN] != 1) {
- if (!(flags & RPP_STDIN)) {
- int r = write(output, prompt, strlen(prompt));
- (void)r;
- }
- end = buf + bufsiz - 1;
- p = buf;
- while ((nr = read(input, &ch, 1)) == 1 && ch != '\n' && ch != '\r') {
- if (p < end) {
- if ((flags & RPP_SEVENBIT))
- ch &= 0x7f;
- if (isalpha((unsigned char)ch)) {
- if ((flags & RPP_FORCELOWER))
- ch = (char)tolower((unsigned char)ch);
- if ((flags & RPP_FORCEUPPER))
- ch = (char)toupper((unsigned char)ch);
- }
- *p++ = ch;
+ end = buf + bufsiz - 1;
+ p = buf;
+ while ((nr = read(input, &ch, 1)) == 1 && ch != '\n' && ch != '\r') {
+ if (p < end) {
+ if ((flags & RPP_SEVENBIT))
+ ch &= 0x7f;
+ if (isalpha((unsigned char)ch)) {
+ if ((flags & RPP_FORCELOWER))
+ ch = (char)tolower((unsigned char)ch);
+ if ((flags & RPP_FORCEUPPER))
+ ch = (char)toupper((unsigned char)ch);
}
- }
- *p = '\0';
- save_errno = errno;
- if (!(term.c_lflag & ECHO)) {
- int r = write(output, "\n", 1);
- (void)r;
+ *p++ = ch;
}
}
+ *p = '\0';
+ save_errno = errno;
+ if (!(term.c_lflag & ECHO)) {
+ int r = write(output, "\n", 1);
+ (void)r;
+ }
/* Restore old terminal settings and signals. */
if (memcmp(&term, &oterm, sizeof(term)) != 0) {
+ const int sigttou = signo[SIGTTOU];
+
+ /* Ignore SIGTTOU generated when we are not the fg pgrp. */
while (tcsetattr(input, _T_FLUSH, &oterm) == -1 &&
- errno == EINTR)
+ errno == EINTR && !signo[SIGTTOU])
continue;
+ signo[SIGTTOU] = sigttou;
}
(void)sigaction(SIGALRM, &savealrm, NULL);
(void)sigaction(SIGHUP, &savehup, NULL);
diff --git a/tar/bsdtar.1 b/tar/bsdtar.1
index 82840547007a..6d8d6d3d617a 100644
--- a/tar/bsdtar.1
+++ b/tar/bsdtar.1
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd October 1, 2017
+.Dd June 3, 2019
.Dt TAR 1
.Os
.Sh NAME
@@ -198,7 +198,7 @@ options and before extracting any files.
.It Fl Fl clear-nochange-fflags
(x mode only)
Before removing file system objects to replace them, clear platform-specific
-file flags that might prevent removal.
+file attributes or file flags that might prevent removal.
.It Fl Fl exclude Ar pattern
Do not process files or directories that match the
specified pattern.
@@ -218,7 +218,8 @@ and
.Sq Darcs .
.It Fl Fl fflags
(c, r, u, x modes only)
-Archive or extract file flags. This is the reverse of
+Archive or extract platform-specific file attributes or file flags.
+This is the reverse of
.Fl Fl no-fflags
and the default behavior in c, r, and u modes or if
.Nm
@@ -389,8 +390,8 @@ Do not extract modification time.
By default, the modification time is set to the time stored in the archive.
.It Fl Fl mac-metadata
(c, r, u and x mode only)
-Mac OS X specific. Archive or extract extended ACLs and extended attributes
-using
+Mac OS X specific. Archive or extract extended ACLs and extended file
+attributes using
.Xr copyfile 3
in AppleDouble format. This is the reverse of
.Fl Fl no-mac-metadata .
@@ -445,21 +446,21 @@ and the default behavior if
is run as non-root in x mode (on Mac OS X as any user in c, r, u and x modes).
.It Fl Fl no-fflags
(c, r, u, x modes only)
-Do not archive or extract file flags. This is the reverse of
+Do not archive or extract file attributes or file flags. This is the reverse of
.Fl Fl fflags
and the default behavior if
.Nm
is run as non-root in x mode.
.It Fl Fl no-mac-metadata
(x mode only)
-Mac OS X specific. Do not archive or extract ACLs and extended attributes using
+Mac OS X specific. Do not archive or extract ACLs and extended file attributes
+using
.Xr copyfile 3
in AppleDouble format. This is the reverse of
.Fl Fl mac-metadata .
and the default behavior if
.Nm
is run as non-root in x mode.
-.It Fl n , Fl Fl norecurse , Fl Fl no-recursion
.It Fl Fl no-same-owner
(x mode only)
Do not extract owner and group IDs.
@@ -470,8 +471,8 @@ and the default behavior if
is run as non-root.
.It Fl Fl no-same-permissions
(x mode only)
-Do not extract full permissions (SGID, SUID, sticky bit, ACLs,
-extended attributes or extended file flags).
+Do not extract full permissions (SGID, SUID, sticky bit,
+file attributes or file flags, extended file attributes and ACLs).
This is the reverse of
.Fl p
and the default behavior if
@@ -479,7 +480,7 @@ and the default behavior if
is run as non-root.
.It Fl Fl no-xattrs
(c, r, u, x modes only)
-Do not archive or extract extended attributes. This is the reverse of
+Do not archive or extract extended file attributes. This is the reverse of
.Fl Fl xattrs
and the default behavior if
.Nm
@@ -667,13 +668,13 @@ This option suppresses these behaviors.
.It Fl p , Fl Fl insecure , Fl Fl preserve-permissions
(x mode only)
Preserve file permissions.
-Attempt to restore the full permissions, including owner, file modes, ACLs,
-extended attributes and extended file flags, if available, for each item
-extracted from the archive. This is te reverse of
+Attempt to restore the full permissions, including file modes, file attributes
+or file flags, extended file attributes and ACLs, if available, for each item
+extracted from the archive. This is the reverse of
.Fl Fl no-same-permissions
and the default if
.Nm
-is being run by root and can be partially overridden by also specifying
+is being run as root. It can be partially overridden by also specifying
.Fl Fl no-acls ,
.Fl Fl no-fflags ,
.Fl Fl no-mac-metadata
@@ -844,7 +845,7 @@ See
for more information about the handling of exclusions.
.It Fl Fl xattrs
(c, r, u, x modes only)
-Archive or extract extended attributes. This is the reverse of
+Archive or extract extended file attributes. This is the reverse of
.Fl Fl no-xattrs
and the default behavior in c, r, and u modes or if
.Nm