svn commit: r232133 - in vendor/libarchive/dist: . cpio cpio/test libarchive libarchive/test tar tar/test

Martin Matuska mm at FreeBSD.org
Sat Feb 25 00:16:01 UTC 2012


Author: mm
Date: Sat Feb 25 00:16:00 2012
New Revision: 232133
URL: http://svn.freebsd.org/changeset/base/232133

Log:
  Update libarchive's vendor dist to latest changes in release branch.
  
  Git branch:	release
  Git commit:     e2cc36190d7d733b3ac6744ec860d09776c9da02
  
  Obtained from:  https://github.com/libarchive/libarchive.git

Modified:
  vendor/libarchive/dist/CMakeLists.txt
  vendor/libarchive/dist/configure.ac
  vendor/libarchive/dist/cpio/cpio.c
  vendor/libarchive/dist/cpio/test/main.c
  vendor/libarchive/dist/libarchive/archive_options.c
  vendor/libarchive/dist/libarchive/archive_read.c
  vendor/libarchive/dist/libarchive/archive_read_data_into_fd.c
  vendor/libarchive/dist/libarchive/archive_read_disk_posix.c
  vendor/libarchive/dist/libarchive/archive_read_set_options.c
  vendor/libarchive/dist/libarchive/archive_read_support_format_cab.c
  vendor/libarchive/dist/libarchive/archive_read_support_format_cpio.c
  vendor/libarchive/dist/libarchive/archive_read_support_format_lha.c
  vendor/libarchive/dist/libarchive/archive_read_support_format_rar.c
  vendor/libarchive/dist/libarchive/archive_read_support_format_tar.c
  vendor/libarchive/dist/libarchive/archive_read_support_format_zip.c
  vendor/libarchive/dist/libarchive/archive_string.c
  vendor/libarchive/dist/libarchive/archive_windows.c
  vendor/libarchive/dist/libarchive/archive_windows.h
  vendor/libarchive/dist/libarchive/archive_write_add_filter_bzip2.c
  vendor/libarchive/dist/libarchive/archive_write_add_filter_gzip.c
  vendor/libarchive/dist/libarchive/archive_write_add_filter_xz.c
  vendor/libarchive/dist/libarchive/archive_write_disk_windows.c
  vendor/libarchive/dist/libarchive/archive_write_set_format_7zip.c
  vendor/libarchive/dist/libarchive/archive_write_set_format_cpio.c
  vendor/libarchive/dist/libarchive/archive_write_set_format_cpio_newc.c
  vendor/libarchive/dist/libarchive/archive_write_set_format_gnutar.c
  vendor/libarchive/dist/libarchive/archive_write_set_format_iso9660.c
  vendor/libarchive/dist/libarchive/archive_write_set_format_mtree.c
  vendor/libarchive/dist/libarchive/archive_write_set_format_pax.c
  vendor/libarchive/dist/libarchive/archive_write_set_format_ustar.c
  vendor/libarchive/dist/libarchive/archive_write_set_format_xar.c
  vendor/libarchive/dist/libarchive/archive_write_set_format_zip.c
  vendor/libarchive/dist/libarchive/archive_write_set_options.c
  vendor/libarchive/dist/libarchive/test/main.c
  vendor/libarchive/dist/libarchive/test/test_archive_read_set_options.c
  vendor/libarchive/dist/libarchive/test/test_archive_write_set_options.c
  vendor/libarchive/dist/libarchive/test/test_write_compress_program.c
  vendor/libarchive/dist/tar/bsdtar.c
  vendor/libarchive/dist/tar/test/main.c
  vendor/libarchive/dist/tar/test/test_option_s.c

Modified: vendor/libarchive/dist/CMakeLists.txt
==============================================================================
--- vendor/libarchive/dist/CMakeLists.txt	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/CMakeLists.txt	Sat Feb 25 00:16:00 2012	(r232133)
@@ -607,6 +607,37 @@ ELSE(LIBXML2_FOUND)
 ENDIF(LIBXML2_FOUND)
 
 #
+# Find Libregex
+#
+FIND_PATH(REGEX_INCLUDE_DIR regex.h)
+IF(REGEX_INCLUDE_DIR)
+  CHECK_FUNCTION_EXISTS_GLIBC(regcomp HAVE_REGCOMP_LIBC)
+  #
+  # If libc does not provide regex, find libregex.
+  #
+  IF(NOT HAVE_REGCOMP_LIBC)
+    FIND_LIBRARY(REGEX_LIBRARY regex)
+    IF(REGEX_LIBRARY)
+      SET(CMAKE_REQUIRED_LIBRARIES ${REGEX_LIBRARY})
+      CHECK_FUNCTION_EXISTS_GLIBC(regcomp HAVE_REGCOMP_LIBREGEX)
+      IF(HAVE_REGCOMP_LIBREGEX)
+        LIST(APPEND ADDITIONAL_LIBS ${REGEX_LIBRARY})
+        #
+        # If regex.h is not found, retry looking for regex.h at
+        # REGEX_INCLUDE_DIR
+        #
+        IF(NOT HAVE_REGEX_H)
+          UNSET(HAVE_REGEX_H CACHE)
+          INCLUDE_DIRECTORIES(${REGEX_INCLUDE_DIR})
+          SET(CMAKE_REQUIRED_INCLUDES ${REGEX_INCLUDE_DIR})
+          LA_CHECK_INCLUDE_FILE("regex.h" HAVE_REGEX_H)
+        ENDIF(NOT HAVE_REGEX_H)
+      ENDIF(HAVE_REGCOMP_LIBREGEX)
+    ENDIF(REGEX_LIBRARY)
+  ENDIF(NOT HAVE_REGCOMP_LIBC)
+ENDIF(REGEX_INCLUDE_DIR)
+
+#
 # Check functions
 #
 IF ("CMAKE_C_COMPILER_ID" MATCHES "^GNU$")

Modified: vendor/libarchive/dist/configure.ac
==============================================================================
--- vendor/libarchive/dist/configure.ac	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/configure.ac	Sat Feb 25 00:16:00 2012	(r232133)
@@ -322,6 +322,15 @@ if test "x$ac_cv_header_libxml_xmlreader
   fi
 fi
 
+AC_ARG_WITH([libregex],
+  AS_HELP_STRING([--without-libregex], [Don't build support for regex through libregex]))
+
+if test "x$with_libregex" != "xno"; then
+  if test "x$ac_cv_header_regex_h" != "xno"; then
+    AC_CHECK_FUNC(regcomp, , [AC_CHECK_LIB(regex,regcomp)])
+  fi
+fi
+
 # TODO: Give the user the option of using a pre-existing system
 # libarchive.  This will define HAVE_LIBARCHIVE which will cause
 # bsdtar_platform.h to use #include <...> for the libarchive headers.

Modified: vendor/libarchive/dist/cpio/cpio.c
==============================================================================
--- vendor/libarchive/dist/cpio/cpio.c	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/cpio/cpio.c	Sat Feb 25 00:16:00 2012	(r232133)
@@ -119,6 +119,7 @@ static void	mode_in(struct cpio *);
 static 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);
@@ -155,9 +156,9 @@ main(int argc, char *argv[])
 	else {
 #if defined(_WIN32) && !defined(__CYGWIN__)
 		lafe_progname = strrchr(*argv, '\\');
-#else
-		lafe_progname = strrchr(*argv, '/');
+		if (strrchr(*argv, '/') > lafe_progname)
 #endif
+		lafe_progname = strrchr(*argv, '/');
 		if (lafe_progname != NULL)
 			lafe_progname++;
 		else
@@ -574,6 +575,49 @@ mode_out(struct cpio *cpio)
 	archive_write_free(cpio->archive);
 }
 
+static const char *
+remove_leading_slash(const char *p)
+{
+	const char *rp;
+
+	/* Remove leading "//./" or "//?/" or "//?/UNC/"
+	 * (absolute path prefixes used by Windows API) */
+	if ((p[0] == '/' || p[0] == '\\') &&
+	    (p[1] == '/' || p[1] == '\\') &&
+	    (p[2] == '.' || p[2] == '?') &&
+	    (p[3] == '/' || p[3] == '\\'))
+	{
+		if (p[2] == '?' &&
+		    (p[4] == 'U' || p[4] == 'u') &&
+		    (p[5] == 'N' || p[5] == 'n') &&
+		    (p[6] == 'C' || p[6] == 'c') &&
+		    (p[7] == '/' || p[7] == '\\'))
+			p += 8;
+		else
+			p += 4;
+	}
+	do {
+		rp = p;
+		/* Remove leading drive letter from archives created
+		 * on Windows. */
+		if (((p[0] >= 'a' && p[0] <= 'z') ||
+		     (p[0] >= 'A' && p[0] <= 'Z')) &&
+			 p[1] == ':') {
+			p += 2;
+		}
+		/* Remove leading "/../", "//", etc. */
+		while (p[0] == '/' || p[0] == '\\') {
+			if (p[1] == '.' && p[2] == '.' &&
+				(p[3] == '/' || p[3] == '\\')) {
+				p += 3; /* Remove "/..", leave "/"
+					 * for next pass. */
+			} else
+				p += 1; /* Remove "/". */
+		}
+	} while (rp != p);
+	return (p);
+}
+
 /*
  * This is used by both out mode (to copy objects from disk into
  * an archive) and pass mode (to copy objects from disk to
@@ -585,7 +629,6 @@ file_to_archive(struct cpio *cpio, const
 	const char *destpath;
 	struct archive_entry *entry, *spare;
 	size_t len;
-	const char *p;
 	int r;
 
 	/*
@@ -639,10 +682,7 @@ file_to_archive(struct cpio *cpio, const
 				    "Can't allocate path buffer");
 		}
 		strcpy(cpio->pass_destpath, cpio->destdir);
-		p = srcpath;
-		while (p[0] == '/')
-			++p;
-		strcat(cpio->pass_destpath, p);
+		strcat(cpio->pass_destpath, remove_leading_slash(srcpath));
 		destpath = cpio->pass_destpath;
 	}
 	if (cpio->option_rename)
@@ -1139,12 +1179,24 @@ cpio_rename(const char *name)
 	static char buff[1024];
 	FILE *t;
 	char *p, *ret;
+#if defined(_WIN32) && !defined(__CYGWIN__)
+	FILE *to;
 
+	t = fopen("CONIN$", "r");
+	if (t == NULL)
+		return (name);
+	to = fopen("CONOUT$", "w");
+	if (to == NULL)
+		return (name);
+	fprintf(to, "%s (Enter/./(new name))? ", name);
+	fclose(to);
+#else
 	t = fopen("/dev/tty", "r+");
 	if (t == NULL)
 		return (name);
 	fprintf(t, "%s (Enter/./(new name))? ", name);
 	fflush(t);
+#endif
 
 	p = fgets(buff, sizeof(buff), t);
 	fclose(t);

Modified: vendor/libarchive/dist/cpio/test/main.c
==============================================================================
--- vendor/libarchive/dist/cpio/test/main.c	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/cpio/test/main.c	Sat Feb 25 00:16:00 2012	(r232133)
@@ -2289,7 +2289,15 @@ main(int argc, char **argv)
 		j++;
 	}
 	testprogdir[i] = '\0';
+#if defined(_WIN32) && !defined(__CYGWIN__)
+	if (testprogdir[0] != '/' && testprogdir[0] != '\\' &&
+	    !(((testprogdir[0] >= 'a' && testprogdir[0] <= 'z') ||
+	       (testprogdir[0] >= 'A' && testprogdir[0] <= 'Z')) &&
+		testprogdir[1] == ':' &&
+		(testprogdir[2] == '/' || testprogdir[2] == '\\')))
+#else
 	if (testprogdir[0] != '/')
+#endif
 	{
 		/* Fixup path for relative directories. */
 		if ((testprogdir = (char *)realloc(testprogdir,
@@ -2298,8 +2306,9 @@ main(int argc, char **argv)
 			fprintf(stderr, "ERROR: Out of memory.");
 			exit(1);
 		}
-		strcpy(testprogdir + strlen(pwd) + 1, testprogdir);
-		strcpy(testprogdir, pwd);
+		memmove(testprogdir + strlen(pwd) + 1, testprogdir,
+		    strlen(testprogdir));
+		memcpy(testprogdir, pwd, strlen(pwd));
 		testprogdir[strlen(pwd)] = '/';
 	}
 

Modified: vendor/libarchive/dist/libarchive/archive_options.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_options.c	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/libarchive/archive_options.c	Sat Feb 25 00:16:00 2012	(r232133)
@@ -38,6 +38,7 @@ _archive_set_option(struct archive *a,
     int magic, const char *fn, option_handler use_option)
 {
 	const char *mp, *op, *vp;
+	int r;
 
 	archive_check_magic(a, magic, ARCHIVE_STATE_NEW, fn);
 
@@ -47,10 +48,24 @@ _archive_set_option(struct archive *a,
 
 	if (op == NULL && vp == NULL)
 		return (ARCHIVE_OK);
-	if (op == NULL)
+	if (op == NULL) {
+		archive_set_error(a, ARCHIVE_ERRNO_MISC, "Empty option");
 		return (ARCHIVE_FAILED);
+	}
 
-	return use_option(a, mp, op, vp);
+	r = use_option(a, mp, op, vp);
+	if (r == ARCHIVE_WARN - 1) {
+		archive_set_error(a, ARCHIVE_ERRNO_MISC,
+		    "Unknown module name: `%s'", mp);
+		return (ARCHIVE_FAILED);
+	}
+	if (r == ARCHIVE_WARN) {
+		archive_set_error(a, ARCHIVE_ERRNO_MISC,
+		    "Undefined option: `%s%s%s%s%s%s'",
+		    vp?"":"!", mp?mp:"", mp?":":"", op, vp?"=":"", vp?vp:"");
+		return (ARCHIVE_FAILED);
+	}
+	return (r);
 }
 
 int
@@ -102,6 +117,25 @@ _archive_set_options(struct archive *a, 
 			free(data);
 			return (ARCHIVE_FATAL);
 		}
+		if (r == ARCHIVE_FAILED && mod != NULL) {
+			free(data);
+			return (ARCHIVE_FAILED);
+		}
+		if (r == ARCHIVE_WARN - 1) {
+			/* The module name is wrong. */
+			archive_set_error(a, ARCHIVE_ERRNO_MISC,
+			    "Unknown module name: `%s'", mod);
+			free(data);
+			return (ARCHIVE_FAILED);
+		}
+		if (r == ARCHIVE_WARN) {
+			/* The option name is wrong. No-one used this. */
+			archive_set_error(a, ARCHIVE_ERRNO_MISC,
+			    "Undefined option: `%s%s%s'",
+			    mod?mod:"", mod?":":"", opt);
+			free(data);
+			return (ARCHIVE_FAILED);
+		}
 		if (r == ARCHIVE_OK)
 			anyok = 1;
 		else

Modified: vendor/libarchive/dist/libarchive/archive_read.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_read.c	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/libarchive/archive_read.c	Sat Feb 25 00:16:00 2012	(r232133)
@@ -633,7 +633,7 @@ archive_read_data(struct archive *_a, vo
 		}
 
 		/* Compute the amount of zero padding needed. */
-		if (a->read_data_output_offset + s <
+		if (a->read_data_output_offset + (int64_t)s <
 		    a->read_data_offset) {
 			len = s;
 		} else if (a->read_data_output_offset <

Modified: vendor/libarchive/dist/libarchive/archive_read_data_into_fd.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_read_data_into_fd.c	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/libarchive/archive_read_data_into_fd.c	Sat Feb 25 00:16:00 2012	(r232133)
@@ -64,7 +64,7 @@ pad_to(struct archive *a, int fd, int ca
 	}
 	while (target_offset > actual_offset) {
 		to_write = nulls_size;
-		if (target_offset < actual_offset + nulls_size)
+		if (target_offset < actual_offset + (int64_t)nulls_size)
 			to_write = (size_t)(target_offset - actual_offset);
 		bytes_written = write(fd, nulls, to_write);
 		if (bytes_written < 0) {

Modified: vendor/libarchive/dist/libarchive/archive_read_disk_posix.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_read_disk_posix.c	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/libarchive/archive_read_disk_posix.c	Sat Feb 25 00:16:00 2012	(r232133)
@@ -733,7 +733,7 @@ _archive_read_data_block(struct archive 
 	t->entry_buff_size = t->current_filesystem->buff_size;
 
 	buffbytes = t->entry_buff_size;
-	if (buffbytes > t->current_sparse->length)
+	if ((int64_t)buffbytes > t->current_sparse->length)
 		buffbytes = t->current_sparse->length;
 
 	/*

Modified: vendor/libarchive/dist/libarchive/archive_read_set_options.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_read_set_options.c	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/libarchive/archive_read_set_options.c	Sat Feb 25 00:16:00 2012	(r232133)
@@ -78,7 +78,7 @@ archive_set_format_option(struct archive
 	struct archive_read *a = (struct archive_read *)_a;
 	struct archive_format_descriptor *format;
 	size_t i;
-	int r, rv = ARCHIVE_FAILED;
+	int r, rv = ARCHIVE_WARN;
 
 	for (i = 0; i < sizeof(a->formats)/sizeof(a->formats[0]); i++) {
 		format = &a->formats[i];
@@ -102,6 +102,10 @@ archive_set_format_option(struct archive
 		if (r == ARCHIVE_OK)
 			rv = ARCHIVE_OK;
 	}
+	/* If the format name didn't match, return a special code for
+	 * _archive_set_option[s]. */
+	if (rv == ARCHIVE_WARN && m != NULL)
+		rv = ARCHIVE_WARN - 1;
 	return (rv);
 }
 
@@ -112,7 +116,7 @@ archive_set_filter_option(struct archive
 	struct archive_read *a = (struct archive_read *)_a;
 	struct archive_read_filter *filter;
 	struct archive_read_filter_bidder *bidder;
-	int r, rv = ARCHIVE_FAILED;
+	int r, rv = ARCHIVE_WARN;
 
 	for (filter = a->filter; filter != NULL; filter = filter->upstream) {
 		bidder = filter->bidder;
@@ -135,6 +139,10 @@ archive_set_filter_option(struct archive
 		if (r == ARCHIVE_OK)
 			rv = ARCHIVE_OK;
 	}
+	/* If the filter name didn't match, return a special code for
+	 * _archive_set_option[s]. */
+	if (rv == ARCHIVE_WARN && m != NULL)
+		rv = ARCHIVE_WARN - 1;
 	return (rv);
 }
 

Modified: vendor/libarchive/dist/libarchive/archive_read_support_format_cab.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_read_support_format_cab.c	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/libarchive/archive_read_support_format_cab.c	Sat Feb 25 00:16:00 2012	(r232133)
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2010-2011 Michihiro NAKAJIMA
+ * Copyright (c) 2010-2012 Michihiro NAKAJIMA
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -478,11 +478,13 @@ archive_read_format_cab_options(struct a
 			else
 				ret = ARCHIVE_FATAL;
 		}
-	} else
-		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-		    "cab: unknown keyword ``%s''", key);
+		return (ret);
+	}
 
-	return (ret);
+	/* Note: The "warn" return is just to inform the options
+	 * supervisor that we didn't handle it.  It will generate
+	 * a suitable error if no one used this option. */
+	return (ARCHIVE_WARN);
 }
 
 static int
@@ -2066,6 +2068,7 @@ lzx_decode_init(struct lzx_stream *strm,
 	struct lzx_dec *ds;
 	int slot, w_size, w_slot;
 	int base, footer;
+	int base_inc[18];
 
 	if (strm->ds == NULL) {
 		strm->ds = calloc(1, sizeof(*strm->ds));
@@ -2100,13 +2103,15 @@ lzx_decode_init(struct lzx_stream *strm,
 		lzx_huffman_free(&(ds->mt));
 	}
 
+	for (footer = 0; footer < 18; footer++)
+		base_inc[footer] = 1 << footer;
 	base = footer = 0;
 	for (slot = 0; slot < w_slot; slot++) {
 		int n;
 		if (footer == 0)
 			base = slot;
 		else
-			base += 1 << footer;
+			base += base_inc[footer];
 		if (footer < 17) {
 			footer = -2;
 			for (n = base; n; n >>= 1)
@@ -2180,11 +2185,11 @@ lzx_translation(struct lzx_stream *strm,
 	end = b + size - 10;
 	while (b < end && (b = memchr(b, 0xE8, end - b)) != NULL) {
 		size_t i = b - (unsigned char *)p;
-		long cp, displacement, value;
+		int32_t cp, displacement, value;
 
 		cp = offset + i;
 		value = archive_le32dec(&b[1]);
-		if (value >= -cp && value < (long)ds->translation_size) {
+		if (value >= -cp && value < (int32_t)ds->translation_size) {
 			if (value >= 0)
 				displacement = value - cp;
 			else
@@ -2475,7 +2480,10 @@ lzx_read_blocks(struct lzx_stream *strm,
 			 */
 			/* Skip padding to align following field on
 			 * 16-bit boundary. */
-			lzx_br_consume_unalined_bits(br);
+			if (br->cache_avail == 32 || br->cache_avail == 16)
+				lzx_br_consume(br, 16);
+			else
+				lzx_br_consume_unalined_bits(br);
 			/* Preparation to read repeated offsets R0,R1 and R2. */
 			ds->rbytes_avail = 0;
 			ds->state = ST_RD_R0;

Modified: vendor/libarchive/dist/libarchive/archive_read_support_format_cpio.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_read_support_format_cpio.c	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/libarchive/archive_read_support_format_cpio.c	Sat Feb 25 00:16:00 2012	(r232133)
@@ -1,6 +1,6 @@
 /*-
  * Copyright (c) 2003-2007 Tim Kientzle
- * Copyright (c) 2010-2011 Michihiro NAKAJIMA
+ * Copyright (c) 2010-2012 Michihiro NAKAJIMA
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -325,7 +325,7 @@ archive_read_format_cpio_options(struct 
 	if (strcmp(key, "compat-2x")  == 0) {
 		/* Handle filnames as libarchive 2.x */
 		cpio->init_default_conversion = (val != NULL)?1:0;
-		ret = ARCHIVE_OK;
+		return (ARCHIVE_OK);
 	} else if (strcmp(key, "hdrcharset")  == 0) {
 		if (val == NULL || val[0] == 0)
 			archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
@@ -339,11 +339,13 @@ archive_read_format_cpio_options(struct 
 			else
 				ret = ARCHIVE_FATAL;
 		}
-	} else
-		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-		    "cpio: unknown keyword ``%s''", key);
+		return (ret);
+	}
 
-	return (ret);
+	/* Note: The "warn" return is just to inform the options
+	 * supervisor that we didn't handle it.  It will generate
+	 * a suitable error if no one used this option. */
+	return (ARCHIVE_WARN);
 }
 
 static int

Modified: vendor/libarchive/dist/libarchive/archive_read_support_format_lha.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_read_support_format_lha.c	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/libarchive/archive_read_support_format_lha.c	Sat Feb 25 00:16:00 2012	(r232133)
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2008-2011 Michihiro NAKAJIMA
+ * Copyright (c) 2008-2012 Michihiro NAKAJIMA
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -445,11 +445,13 @@ archive_read_format_lha_options(struct a
 			else
 				ret = ARCHIVE_FATAL;
 		}
-	} else
-		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-		    "lha: unknown keyword ``%s''", key);
+		return (ret);
+	}
 
-	return (ret);
+	/* Note: The "warn" return is just to inform the options
+	 * supervisor that we didn't handle it.  It will generate
+	 * a suitable error if no one used this option. */
+	return (ARCHIVE_WARN);
 }
 
 static int

Modified: vendor/libarchive/dist/libarchive/archive_read_support_format_rar.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_read_support_format_rar.c	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/libarchive/archive_read_support_format_rar.c	Sat Feb 25 00:16:00 2012	(r232133)
@@ -757,11 +757,13 @@ archive_read_format_rar_options(struct a
       else
         ret = ARCHIVE_FATAL;
     }
-  } else
-    archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-        "rar: unknown keyword ``%s''", key);
-                
-  return (ret);
+    return (ret);
+  }
+
+  /* Note: The "warn" return is just to inform the options
+   * supervisor that we didn't handle it.  It will generate
+   * a suitable error if no one used this option. */
+  return (ARCHIVE_WARN);
 }
 
 static int

Modified: vendor/libarchive/dist/libarchive/archive_read_support_format_tar.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_read_support_format_tar.c	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/libarchive/archive_read_support_format_tar.c	Sat Feb 25 00:16:00 2012	(r232133)
@@ -1,6 +1,6 @@
 /*-
  * Copyright (c) 2003-2007 Tim Kientzle
- * Copyright (c) 2011 Michihiro NAKAJIMA
+ * Copyright (c) 2011-2012 Michihiro NAKAJIMA
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -369,7 +369,7 @@ archive_read_format_tar_options(struct a
 		/* Handle UTF-8 filnames as libarchive 2.x */
 		tar->compat_2x = (val != NULL)?1:0;
 		tar->init_default_conversion = tar->compat_2x;
-		ret = ARCHIVE_OK;
+		return (ARCHIVE_OK);
 	} else if (strcmp(key, "hdrcharset")  == 0) {
 		if (val == NULL || val[0] == 0)
 			archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
@@ -383,11 +383,13 @@ archive_read_format_tar_options(struct a
 			else
 				ret = ARCHIVE_FATAL;
 		}
-	} else
-		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-		    "tar: unknown keyword ``%s''", key);
+		return (ret);
+	}
 
-	return (ret);
+	/* Note: The "warn" return is just to inform the options
+	 * supervisor that we didn't handle it.  It will generate
+	 * a suitable error if no one used this option. */
+	return (ARCHIVE_WARN);
 }
 
 /* utility function- this exists to centralize the logic of tracking

Modified: vendor/libarchive/dist/libarchive/archive_read_support_format_zip.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_read_support_format_zip.c	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/libarchive/archive_read_support_format_zip.c	Sat Feb 25 00:16:00 2012	(r232133)
@@ -1,6 +1,6 @@
 /*-
  * Copyright (c) 2004 Tim Kientzle
- * Copyright (c) 2011 Michihiro NAKAJIMA
+ * Copyright (c) 2011-2012 Michihiro NAKAJIMA
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -441,7 +441,7 @@ archive_read_format_zip_options(struct a
 	if (strcmp(key, "compat-2x")  == 0) {
 		/* Handle filnames as libarchive 2.x */
 		zip->init_default_conversion = (val != NULL) ? 1 : 0;
-		ret = ARCHIVE_OK;
+		return (ARCHIVE_OK);
 	} else if (strcmp(key, "hdrcharset")  == 0) {
 		if (val == NULL || val[0] == 0)
 			archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
@@ -456,11 +456,13 @@ archive_read_format_zip_options(struct a
 			} else
 				ret = ARCHIVE_FATAL;
 		}
-	} else
-		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-		    "zip: unknown keyword ``%s''", key);
+		return (ret);
+	}
 
-	return (ret);
+	/* Note: The "warn" return is just to inform the options
+	 * supervisor that we didn't handle it.  It will generate
+	 * a suitable error if no one used this option. */
+	return (ARCHIVE_WARN);
 }
 
 static int

Modified: vendor/libarchive/dist/libarchive/archive_string.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_string.c	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/libarchive/archive_string.c	Sat Feb 25 00:16:00 2012	(r232133)
@@ -1,6 +1,6 @@
 /*-
  * Copyright (c) 2003-2011 Tim Kientzle
- * Copyright (c) 2011 Michihiro NAKAJIMA
+ * Copyright (c) 2011-2012 Michihiro NAKAJIMA
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -849,7 +849,7 @@ archive_string_append_from_wcs(struct ar
 			}
 		}
 		as->length += r;
-		if (wp == NULL || (wp - wpp) >= nwc)
+		if (wp == NULL || (wp - wpp) >= (int64_t)nwc)
 			break;
 		/* Get a remaining WCS lenth. */
 		nwc -= wp - wpp;
@@ -2333,7 +2333,7 @@ best_effort_strncat_in_locale(struct arc
 {
 	size_t remaining;
 	char *outp;
-	const char *inp;
+	const uint8_t *inp;
 	size_t avail;
 	int return_value = 0; /* success */
 
@@ -2357,11 +2357,11 @@ best_effort_strncat_in_locale(struct arc
 		return (-1);
 
 	remaining = length;
-	inp = (const char *)_p;
+	inp = (const uint8_t *)_p;
 	outp = as->s + as->length;
 	avail = as->buffer_length - as->length -1;
 	while (*inp && remaining > 0) {
-		if (*inp < 0 && (sc->flag & SCONV_TO_UTF8)) {
+		if (*inp > 127 && (sc->flag & SCONV_TO_UTF8)) {
 			if (avail < UTF8_R_CHAR_SIZE) {
 				as->length = outp - as->s;
 				if (NULL == archive_string_ensure(as,
@@ -2381,13 +2381,13 @@ best_effort_strncat_in_locale(struct arc
 			inp++;
 			remaining--;
 			return_value = -1;
-		} else if (*inp < 0) {
+		} else if (*inp > 127) {
 			*outp++ = '?';
 			inp++;
 			remaining--;
 			return_value = -1;
 		} else {
-			*outp++ = *inp++;
+			*outp++ = (char)*inp++;
 			remaining--;
 		}
 	}

Modified: vendor/libarchive/dist/libarchive/archive_windows.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_windows.c	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/libarchive/archive_windows.c	Sat Feb 25 00:16:00 2012	(r232133)
@@ -48,6 +48,7 @@
 
 #include "archive_platform.h"
 #include "archive_private.h"
+#include "archive_entry.h"
 #include <ctype.h>
 #include <errno.h>
 #include <stddef.h>
@@ -640,6 +641,113 @@ __la_write(int fd, const void *buf, size
 }
 
 /*
+ * Replace the Windows path separator '\' with '/'.
+ */
+static int
+replace_pathseparator(struct archive_wstring *ws, const wchar_t *wp)
+{
+	wchar_t *w;
+	size_t path_length;
+
+	if (wp == NULL)
+		return(0);
+	if (wcschr(wp, L'\\') == NULL)
+		return(0);
+	path_length = wcslen(wp);
+	if (archive_wstring_ensure(ws, path_length) == NULL)
+		return(-1);
+	archive_wstrncpy(ws, wp, path_length);
+	for (w = ws->s; *w; w++) {
+		if (*w == L'\\')
+			*w = L'/';
+	}
+	return(1);
+}
+
+static int
+fix_pathseparator(struct archive_entry *entry)
+{
+	struct archive_wstring ws;
+	const wchar_t *wp;
+	int ret = ARCHIVE_OK;
+
+	archive_string_init(&ws);
+	wp = archive_entry_pathname_w(entry);
+	switch (replace_pathseparator(&ws, wp)) {
+	case 0: /* Not replaced. */
+		break;
+	case 1: /* Replaced. */
+		archive_entry_copy_pathname_w(entry, ws.s);
+		break;
+	default:
+		ret = ARCHIVE_FAILED;
+	}
+	wp = archive_entry_hardlink_w(entry);
+	switch (replace_pathseparator(&ws, wp)) {
+	case 0: /* Not replaced. */
+		break;
+	case 1: /* Replaced. */
+		archive_entry_copy_hardlink_w(entry, ws.s);
+		break;
+	default:
+		ret = ARCHIVE_FAILED;
+	}
+	wp = archive_entry_symlink_w(entry);
+	switch (replace_pathseparator(&ws, wp)) {
+	case 0: /* Not replaced. */
+		break;
+	case 1: /* Replaced. */
+		archive_entry_copy_symlink_w(entry, ws.s);
+		break;
+	default:
+		ret = ARCHIVE_FAILED;
+	}
+	archive_wstring_free(&ws);
+	return(ret);
+}
+
+struct archive_entry *
+__la_win_entry_in_posix_pathseparator(struct archive_entry *entry)
+{
+	struct archive_entry *entry_main;
+	const wchar_t *wp;
+	int has_backslash = 0;
+	int ret;
+
+	wp = archive_entry_pathname_w(entry);
+	if (wp != NULL && wcschr(wp, L'\\') != NULL)
+		has_backslash = 1;
+	if (!has_backslash) {
+		wp = archive_entry_hardlink_w(entry);
+		if (wp != NULL && wcschr(wp, L'\\') != NULL)
+			has_backslash = 1;
+	}
+	if (!has_backslash) {
+		wp = archive_entry_symlink_w(entry);
+		if (wp != NULL && wcschr(wp, L'\\') != NULL)
+			has_backslash = 1;
+	}
+	/*
+	 * If there is no backslach chars, return the original.
+	 */
+	if (!has_backslash)
+		return (entry);
+
+	/* Copy entry so we can modify it as needed. */
+	entry_main = archive_entry_clone(entry);
+	if (entry_main == NULL)
+		return (NULL);
+	/* Replace the Windows path-separator '\' with '/'. */
+	ret = fix_pathseparator(entry_main);
+	if (ret < ARCHIVE_WARN) {
+		archive_entry_free(entry_main);
+		return (NULL);
+	}
+	return (entry_main);
+}
+
+
+/*
  * The following function was modified from PostgreSQL sources and is
  * subject to the copyright below.
  */

Modified: vendor/libarchive/dist/libarchive/archive_windows.h
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_windows.h	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/libarchive/archive_windows.h	Sat Feb 25 00:16:00 2012	(r232133)
@@ -261,6 +261,8 @@ extern wchar_t *__la_win_permissive_name
 extern wchar_t *__la_win_permissive_name_w(const wchar_t *wname);
 extern void __la_dosmaperr(unsigned long e);
 #define la_dosmaperr(e) __la_dosmaperr(e)
+extern struct archive_entry *__la_win_entry_in_posix_pathseparator(
+    struct archive_entry *);
 
 
 #endif /* LIBARCHIVE_ARCHIVE_WINDOWS_H_INCLUDED */

Modified: vendor/libarchive/dist/libarchive/archive_write_add_filter_bzip2.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_write_add_filter_bzip2.c	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/libarchive/archive_write_add_filter_bzip2.c	Sat Feb 25 00:16:00 2012	(r232133)
@@ -208,6 +208,9 @@ archive_compressor_bzip2_options(struct 
 		return (ARCHIVE_OK);
 	}
 
+	/* Note: The "warn" return is just to inform the options
+	 * supervisor that we didn't handle it.  It will generate
+	 * a suitable error if no one used this option. */
 	return (ARCHIVE_WARN);
 }
 

Modified: vendor/libarchive/dist/libarchive/archive_write_add_filter_gzip.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_write_add_filter_gzip.c	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/libarchive/archive_write_add_filter_gzip.c	Sat Feb 25 00:16:00 2012	(r232133)
@@ -220,6 +220,10 @@ archive_compressor_gzip_options(struct a
 		data->compression_level = value[0] - '0';
 		return (ARCHIVE_OK);
 	}
+
+	/* Note: The "warn" return is just to inform the options
+	 * supervisor that we didn't handle it.  It will generate
+	 * a suitable error if no one used this option. */
 	return (ARCHIVE_WARN);
 }
 

Modified: vendor/libarchive/dist/libarchive/archive_write_add_filter_xz.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_write_add_filter_xz.c	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/libarchive/archive_write_add_filter_xz.c	Sat Feb 25 00:16:00 2012	(r232133)
@@ -1,6 +1,6 @@
 /*-
- * Copyright (c) 2009,2010 Michihiro NAKAJIMA
  * Copyright (c) 2003-2010 Tim Kientzle
+ * Copyright (c) 2009-2012 Michihiro NAKAJIMA
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -365,6 +365,9 @@ archive_compressor_xz_options(struct arc
 		return (ARCHIVE_OK);
 	}
 
+	/* Note: The "warn" return is just to inform the options
+	 * supervisor that we didn't handle it.  It will generate
+	 * a suitable error if no one used this option. */
 	return (ARCHIVE_WARN);
 }
 

Modified: vendor/libarchive/dist/libarchive/archive_write_disk_windows.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_write_disk_windows.c	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/libarchive/archive_write_disk_windows.c	Sat Feb 25 00:16:00 2012	(r232133)
@@ -1434,7 +1434,7 @@ restore_entry(struct archive_write_disk 
 
 	if (en) {
 		/* Everything failed; give up here. */
-		archive_set_error(&a->archive, en, "Can't create '%s'",
+		archive_set_error(&a->archive, en, "Can't create '%ls'",
 		    a->name);
 		return (ARCHIVE_FAILED);
 	}
@@ -1844,7 +1844,7 @@ check_symlinks(struct archive_write_disk
 				 */
 				if (disk_unlink(a->name)) {
 					archive_set_error(&a->archive, errno,
-					    "Could not remove symlink %s",
+					    "Could not remove symlink %ls",
 					    a->name);
 					pn[0] = c;
 					return (ARCHIVE_FAILED);
@@ -1858,7 +1858,7 @@ check_symlinks(struct archive_write_disk
 				 */
 				if (!S_ISLNK(a->mode)) {
 					archive_set_error(&a->archive, 0,
-					    "Removing symlink %s",
+					    "Removing symlink %ls",
 					    a->name);
 				}
 				/* Symlink gone.  No more problem! */
@@ -1868,15 +1868,15 @@ check_symlinks(struct archive_write_disk
 				/* User asked us to remove problems. */
 				if (disk_unlink(a->name) != 0) {
 					archive_set_error(&a->archive, 0,
-					    "Cannot remove intervening symlink %s",
-					    a->name);
+					    "Cannot remove intervening "
+					    "symlink %ls", a->name);
 					pn[0] = c;
 					return (ARCHIVE_FAILED);
 				}
 				a->pst = NULL;
 			} else {
 				archive_set_error(&a->archive, 0,
-				    "Cannot extract through symlink %s",
+				    "Cannot extract through symlink %ls",
 				    a->name);
 				pn[0] = c;
 				return (ARCHIVE_FAILED);
@@ -2147,19 +2147,20 @@ create_dir(struct archive_write_disk *a,
 			return (ARCHIVE_OK);
 		if ((a->flags & ARCHIVE_EXTRACT_NO_OVERWRITE)) {
 			archive_set_error(&a->archive, EEXIST,
-			    "Can't create directory '%s'", path);
+			    "Can't create directory '%ls'", path);
 			return (ARCHIVE_FAILED);
 		}
 		if (disk_unlink(path) != 0) {
 			archive_set_error(&a->archive, errno,
-			    "Can't create directory '%s': "
+			    "Can't create directory '%ls': "
 			    "Conflicting file cannot be removed",
 			    path);
 			return (ARCHIVE_FAILED);
 		}
 	} else if (errno != ENOENT && errno != ENOTDIR) {
 		/* Stat failed? */
-		archive_set_error(&a->archive, errno, "Can't test directory '%s'", path);
+		archive_set_error(&a->archive, errno,
+		    "Can't test directory '%ls'", path);
 		return (ARCHIVE_FAILED);
 	} else if (slash != NULL) {
 		*slash = '\0';
@@ -2211,7 +2212,7 @@ create_dir(struct archive_write_disk *a,
 	if (file_information(a, path, &st, &st_mode, 0) == 0 && S_ISDIR(st_mode))
 		return (ARCHIVE_OK);
 
-	archive_set_error(&a->archive, errno, "Failed to create dir '%s'",
+	archive_set_error(&a->archive, errno, "Failed to create dir '%ls'",
 	    path);
 	return (ARCHIVE_FAILED);
 }
@@ -2240,7 +2241,7 @@ set_ownership(struct archive_write_disk 
 	}
 
 	archive_set_error(&a->archive, errno,
-	    "Can't set user=%jd/group=%jd for %s",
+	    "Can't set user=%jd/group=%jd for %ls",
 	    (intmax_t)a->uid, (intmax_t)a->gid, a->name);
 	return (ARCHIVE_WARN);
 }

Modified: vendor/libarchive/dist/libarchive/archive_write_set_format_7zip.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_write_set_format_7zip.c	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/libarchive/archive_write_set_format_7zip.c	Sat Feb 25 00:16:00 2012	(r232133)
@@ -413,7 +413,10 @@ _7z_options(struct archive_write *a, con
 		return (ARCHIVE_OK);
 	}
 
-	return (ARCHIVE_FAILED);
+	/* Note: The "warn" return is just to inform the options
+	 * supervisor that we didn't handle it.  It will generate
+	 * a suitable error if no one used this option. */
+	return (ARCHIVE_WARN);
 }
 
 static int
@@ -1587,7 +1590,8 @@ file_init_register_empty(struct _7zip *z
 	zip->empty_list.last = &(zip->empty_list.first);
 }
 
-#if !defined(HAVE_BZLIB_H) || !defined(BZ_CONFIG_ERROR) || !defined(HAVE_LZMA_H)
+#if !defined(HAVE_ZLIB_H) || !defined(HAVE_BZLIB_H) ||\
+	 !defined(BZ_CONFIG_ERROR) || !defined(HAVE_LZMA_H)
 static int
 compression_unsupported_encoder(struct archive *a,
     struct la_zstream *lastrm, const char *name)

Modified: vendor/libarchive/dist/libarchive/archive_write_set_format_cpio.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_write_set_format_cpio.c	Fri Feb 24 23:15:21 2012	(r232132)
+++ vendor/libarchive/dist/libarchive/archive_write_set_format_cpio.c	Sat Feb 25 00:16:00 2012	(r232133)
@@ -1,5 +1,6 @@
 /*-
  * Copyright (c) 2003-2007 Tim Kientzle
+ * Copyright (c) 2011-2012 Michihiro NAKAJIMA
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -147,11 +148,13 @@ archive_write_cpio_options(struct archiv
 			else
 				ret = ARCHIVE_FATAL;
 		}
-	} else
-		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-		    "%s: unknown keyword ``%s''", a->format_name, key);
+		return (ret);
+	}
 
-	return (ret);
+	/* Note: The "warn" return is just to inform the options
+	 * supervisor that we didn't handle it.  It will generate
+	 * a suitable error if no one used this option. */
+	return (ARCHIVE_WARN);
 }
 
 /*
@@ -278,18 +281,37 @@ write_header(struct archive_write *a, st
 	int64_t	ino;
 	char h[76];
 	struct archive_string_conv *sconv;
+	struct archive_entry *entry_main;
 	size_t len;
 
 	cpio = (struct cpio *)a->format_data;
 	ret_final = ARCHIVE_OK;
 	sconv = get_sconv(a);
 
+#if defined(_WIN32) && !defined(__CYGWIN__)
+	/* Make sure the path separators in pahtname, hardlink and symlink
+	 * are all slash '/', not the Windows path separator '\'. */
+	entry_main = __la_win_entry_in_posix_pathseparator(entry);
+	if (entry_main == NULL) {
+		archive_set_error(&a->archive, ENOMEM,
+		    "Can't allocate ustar data");
+		return(ARCHIVE_FATAL);
+	}
+	if (entry != entry_main)
+		entry = entry_main;
+	else
+		entry_main = NULL;
+#else
+	entry_main = NULL;
+#endif
+
 	ret = archive_entry_pathname_l(entry, &path, &len, sconv);
 	if (ret != 0) {
 		if (errno == ENOMEM) {
 			archive_set_error(&a->archive, ENOMEM,
 			    "Can't allocate memory for Pathname");
-			return (ARCHIVE_FATAL);
+			ret_final = ARCHIVE_FATAL;
+			goto exit_write_header;
 		}
 		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
 		    "Can't translate pathname '%s' to %s",
@@ -308,11 +330,13 @@ write_header(struct archive_write *a, st
 	if (ino < 0) {

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-all mailing list