aboutsummaryrefslogtreecommitdiff
path: root/contrib/libarchive/tar
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/libarchive/tar')
-rw-r--r--contrib/libarchive/tar/bsdtar.c7
-rw-r--r--contrib/libarchive/tar/bsdtar.h8
-rw-r--r--contrib/libarchive/tar/cmdline.c2
-rw-r--r--contrib/libarchive/tar/creation_set.c2
-rw-r--r--contrib/libarchive/tar/read.c2
-rw-r--r--contrib/libarchive/tar/subst.c2
-rw-r--r--contrib/libarchive/tar/test/test_crlf_mtree.c74
-rw-r--r--contrib/libarchive/tar/test/test_option_safe_writes.c5
-rw-r--r--contrib/libarchive/tar/util.c7
-rw-r--r--contrib/libarchive/tar/write.c29
10 files changed, 126 insertions, 12 deletions
diff --git a/contrib/libarchive/tar/bsdtar.c b/contrib/libarchive/tar/bsdtar.c
index 53ac135f0129..92e86fd6bd94 100644
--- a/contrib/libarchive/tar/bsdtar.c
+++ b/contrib/libarchive/tar/bsdtar.c
@@ -55,7 +55,7 @@
#endif
#include "bsdtar.h"
-#include "err.h"
+#include "lafe_err.h"
#if ARCHIVE_VERSION_NUMBER < 4000000 && !defined(_PATH_DEFTAPE)
// Libarchive 4.0 and later will NOT define _PATH_DEFTAPE
@@ -183,6 +183,11 @@ main(int argc, char **argv)
sa.sa_handler = SIG_IGN;
sigaction(SIGPIPE, &sa, NULL);
#endif
+#ifdef SIGCHLD
+ /* Do not ignore SIGCHLD. */
+ sa.sa_handler = SIG_DFL;
+ sigaction(SIGCHLD, &sa, NULL);
+#endif
}
#endif
diff --git a/contrib/libarchive/tar/bsdtar.h b/contrib/libarchive/tar/bsdtar.h
index 45dfeed7dce3..782d36d6f756 100644
--- a/contrib/libarchive/tar/bsdtar.h
+++ b/contrib/libarchive/tar/bsdtar.h
@@ -16,6 +16,12 @@
#define ENV_WRITER_OPTIONS "TAR_WRITER_OPTIONS"
#define IGNORE_WRONG_MODULE_NAME "__ignore_wrong_module_name__,"
+#if defined(_MSC_VER ) && (_MSC_VER < 1927 ) /* Check if compiler pre-dated Visual Studio 2019 Release 16.8 */
+#define ARCHIVE_RESTRICT
+#else
+#define ARCHIVE_RESTRICT restrict
+#endif
+
struct creation_set;
/*
* The internal state for the "bsdtar" program.
@@ -188,7 +194,7 @@ int edit_pathname(struct bsdtar *, struct archive_entry *);
void edit_mtime(struct bsdtar *, struct archive_entry *);
int need_report(void);
int pathcmp(const char *a, const char *b);
-void safe_fprintf(FILE * restrict, const char * restrict fmt, ...) __LA_PRINTF(2, 3);
+void safe_fprintf(FILE * ARCHIVE_RESTRICT, const char * ARCHIVE_RESTRICT fmt, ...) __LA_PRINTF(2, 3);
void set_chdir(struct bsdtar *, const char *newdir);
const char *tar_i64toa(int64_t);
void tar_mode_c(struct bsdtar *bsdtar);
diff --git a/contrib/libarchive/tar/cmdline.c b/contrib/libarchive/tar/cmdline.c
index c766c1a52dbb..309be312c948 100644
--- a/contrib/libarchive/tar/cmdline.c
+++ b/contrib/libarchive/tar/cmdline.c
@@ -22,7 +22,7 @@
#endif
#include "bsdtar.h"
-#include "err.h"
+#include "lafe_err.h"
/*
* Short options for tar. Please keep this sorted.
diff --git a/contrib/libarchive/tar/creation_set.c b/contrib/libarchive/tar/creation_set.c
index 6883090418b0..51f803354a5d 100644
--- a/contrib/libarchive/tar/creation_set.c
+++ b/contrib/libarchive/tar/creation_set.c
@@ -15,7 +15,7 @@
#endif
#include "bsdtar.h"
-#include "err.h"
+#include "lafe_err.h"
struct creation_set {
char *create_format;
diff --git a/contrib/libarchive/tar/read.c b/contrib/libarchive/tar/read.c
index 8563fe714f9a..7cbcfb19ff0a 100644
--- a/contrib/libarchive/tar/read.c
+++ b/contrib/libarchive/tar/read.c
@@ -57,7 +57,7 @@
#endif
#include "bsdtar.h"
-#include "err.h"
+#include "lafe_err.h"
struct progress_data {
struct bsdtar *bsdtar;
diff --git a/contrib/libarchive/tar/subst.c b/contrib/libarchive/tar/subst.c
index 5546b5f93b12..a5d644dc5a70 100644
--- a/contrib/libarchive/tar/subst.c
+++ b/contrib/libarchive/tar/subst.c
@@ -25,7 +25,7 @@
#define REG_BASIC 0
#endif
-#include "err.h"
+#include "lafe_err.h"
struct subst_rule {
struct subst_rule *next;
diff --git a/contrib/libarchive/tar/test/test_crlf_mtree.c b/contrib/libarchive/tar/test/test_crlf_mtree.c
new file mode 100644
index 000000000000..5ef8811369c1
--- /dev/null
+++ b/contrib/libarchive/tar/test/test_crlf_mtree.c
@@ -0,0 +1,74 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2018 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Arshan Khanifar <arshankhanifar@gmail.com>
+ * under sponsorship from the FreeBSD Foundation.
+ */
+#include "test.h"
+
+DEFINE_TEST(test_crlf_mtree)
+{
+ char *p0;
+ size_t s;
+ int r;
+ p0 = NULL;
+ char *content = "#mtree\r\n"
+ "f type=file uname=\\\r\n"
+ "root gname=root mode=0755 content=bar/foo\r\n"
+ "g type=file uname=root gname=root mode=0755 content=bar/goo\r\n";
+ char *filename = "output.tar";
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ char *p;
+#endif
+
+ /* an absolute path to mtree file */
+ char *mtree_file = "/METALOG.mtree";
+ char *absolute_path = malloc(strlen(testworkdir) + strlen(mtree_file) + 1);
+ strcpy(absolute_path, testworkdir);
+ strcat(absolute_path, mtree_file );
+
+ /* Create an archive using an mtree file. */
+ assertMakeFile(absolute_path, 0777, content);
+ assertMakeDir("bar", 0775);
+ assertMakeFile("bar/foo", 0777, "abc");
+ assertMakeFile("bar/goo", 0777, "abc");
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ p = absolute_path;
+ while(*p != '\0') {
+ if (*p == '/')
+ *p = '\\';
+ p++;
+ }
+
+ r = systemf("%s -cf %s @%s >step1.out 2>step1.err", testprog, filename, absolute_path);
+ failure("Error invoking %s -cf %s -C bar @%s", testprog, filename, absolute_path);
+#else
+ r = systemf("%s -cf %s \"@%s\" >step1.out 2>step1.err", testprog, filename, absolute_path);
+ failure("Error invoking %s -cf %s -C bar \"@%s\"", testprog, filename, absolute_path);
+#endif
+
+ assertEqualInt(r, 0);
+ assertEmptyFile("step1.out");
+ assertEmptyFile("step1.err");
+
+ /* Do validation of the constructed archive. */
+
+ p0 = slurpfile(&s, "output.tar");
+ if (!assert(p0 != NULL))
+ goto done;
+ if (!assert(s >= 2048))
+ goto done;
+ assertEqualMem(p0 + 0, "f", 2);
+ assertEqualMem(p0 + 512, "abc", 4);
+ assertEqualMem(p0 + 1024, "g", 2);
+ assertEqualMem(p0 + 1536, "abc", 4);
+done:
+ free(p0);
+ free(absolute_path);
+}
+
+
diff --git a/contrib/libarchive/tar/test/test_option_safe_writes.c b/contrib/libarchive/tar/test/test_option_safe_writes.c
index b88479bc5f35..d30b9a745927 100644
--- a/contrib/libarchive/tar/test/test_option_safe_writes.c
+++ b/contrib/libarchive/tar/test/test_option_safe_writes.c
@@ -16,11 +16,12 @@ DEFINE_TEST(test_option_safe_writes)
assertMakeFile("d", 0644, "c");
assertMakeFile("fs", 0644, "d");
assertMakeFile("ds", 0644, "e");
+ assertMakeDir("fd", 0755);
assertEqualInt(0, chdir(".."));
/* Tar files up */
assertEqualInt(0,
- systemf("%s -c -C in -f t.tar f fh d fs ds "
+ systemf("%s -c -C in -f t.tar f fh d fs ds fd "
">pack.out 2>pack.err", testprog));
/* Verify that nothing went to stdout or stderr. */
@@ -32,6 +33,7 @@ DEFINE_TEST(test_option_safe_writes)
assertEqualInt(0, chdir("out"));
assertMakeFile("f", 0644, "a");
assertMakeHardlink("fh", "f");
+ assertMakeFile("fd", 0644, "b");
assertMakeDir("d", 0755);
if (canSymlink()) {
assertMakeSymlink("fs", "f", 0);
@@ -55,4 +57,5 @@ DEFINE_TEST(test_option_safe_writes)
assertTextFileContents("c","d");
assertTextFileContents("d","fs");
assertTextFileContents("e","ds");
+ assertIsDir("fd", 0755);
}
diff --git a/contrib/libarchive/tar/util.c b/contrib/libarchive/tar/util.c
index c99f67797562..fc5e15cb039f 100644
--- a/contrib/libarchive/tar/util.c
+++ b/contrib/libarchive/tar/util.c
@@ -41,7 +41,7 @@
#endif
#include "bsdtar.h"
-#include "err.h"
+#include "lafe_err.h"
#include "passphrase.h"
static size_t bsdtar_expand_char(char *, size_t, size_t, char);
@@ -682,6 +682,7 @@ list_item_verbose(struct bsdtar *bsdtar, FILE *out, struct archive_entry *entry)
{
char tmp[100];
size_t w;
+ size_t sw;
const char *p;
const char *fmt;
time_t tim;
@@ -769,8 +770,8 @@ list_item_verbose(struct bsdtar *bsdtar, FILE *out, struct archive_entry *entry)
ltime = localtime(&tim);
#endif
if (ltime)
- strftime(tmp, sizeof(tmp), fmt, ltime);
- else
+ sw = strftime(tmp, sizeof(tmp), fmt, ltime);
+ if (!ltime || !sw)
sprintf(tmp, "-- -- ----");
fprintf(out, " %s ", tmp);
safe_fprintf(out, "%s", archive_entry_pathname(entry));
diff --git a/contrib/libarchive/tar/write.c b/contrib/libarchive/tar/write.c
index 21984e980ebd..9e6c97b580b7 100644
--- a/contrib/libarchive/tar/write.c
+++ b/contrib/libarchive/tar/write.c
@@ -58,7 +58,7 @@
#endif
#include "bsdtar.h"
-#include "err.h"
+#include "lafe_err.h"
#include "line_reader.h"
#ifndef O_BINARY
@@ -111,7 +111,32 @@ seek_file(int fd, int64_t offset, int whence)
return (SetFilePointerEx((HANDLE)_get_osfhandle(fd),
distance, NULL, FILE_BEGIN) ? 1 : -1);
}
-#define open _open
+
+static int
+_open_wrap_sopen(char const *const path, int const oflag, ...)
+{
+ va_list ap;
+ int r, pmode;
+
+ pmode = 0;
+ if (oflag & _O_CREAT)
+ {
+ va_start(ap, oflag);
+ pmode = va_arg(ap, int);
+ va_end(ap);
+ }
+
+ _sopen_s(&r, path, oflag, _SH_DENYNO, pmode & 0600);
+ if (r < 0)
+ {
+ /* _sopen_s populates errno */
+ return -1;
+ }
+
+ return r;
+}
+
+#define open _open_wrap_sopen
#define close _close
#define read _read
#ifdef lseek