svn commit: r358532 - vendor/libarchive/dist/libarchive

Martin Matuska mm at FreeBSD.org
Mon Mar 2 08:31:01 UTC 2020


Author: mm
Date: Mon Mar  2 08:30:59 2020
New Revision: 358532
URL: https://svnweb.freebsd.org/changeset/base/358532

Log:
  Update vendor/libarchive/dist to git f001f3b0e6a66a7eb989ed3783791c0316831202
  
  Relevant vendor changes:
    Issue #1341: Safe writes: improve error handling

Modified:
  vendor/libarchive/dist/libarchive/archive_util.c
  vendor/libarchive/dist/libarchive/archive_write_disk_posix.c
  vendor/libarchive/dist/libarchive/archive_write_disk_windows.c

Modified: vendor/libarchive/dist/libarchive/archive_util.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_util.c	Mon Mar  2 07:40:08 2020	(r358531)
+++ vendor/libarchive/dist/libarchive/archive_util.c	Mon Mar  2 08:30:59 2020	(r358532)
@@ -365,6 +365,7 @@ __archive_mktempx(const char *tmpdir, wchar_t *templat
 		}
 		fd = _open_osfhandle((intptr_t)h, _O_BINARY | _O_RDWR);
 		if (fd == -1) {
+			la_dosmaperr(GetLastError());
 			CloseHandle(h);
 			goto exit_tmpfile;
 		} else

Modified: vendor/libarchive/dist/libarchive/archive_write_disk_posix.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_write_disk_posix.c	Mon Mar  2 07:40:08 2020	(r358531)
+++ vendor/libarchive/dist/libarchive/archive_write_disk_posix.c	Mon Mar  2 08:30:59 2020	(r358532)
@@ -1654,7 +1654,6 @@ _archive_write_disk_finish_entry(struct archive *_a)
 {
 	struct archive_write_disk *a = (struct archive_write_disk *)_a;
 	int ret = ARCHIVE_OK;
-	int oerrno;
 
 	archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC,
 	    ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA,
@@ -1856,12 +1855,10 @@ finish_metadata:
 		a->fd = -1;
 		if (a->tmpname) {
 			if (rename(a->tmpname, a->name) == -1) {
-				oerrno = errno;
-				unlink(a->tmpname);
-				errno = oerrno;
 				archive_set_error(&a->archive, errno,
-				    "Failed to safe write");
-				ret = ARCHIVE_FATAL;
+				    "Failed to rename temporary file");
+				ret = ARCHIVE_FAILED;
+				unlink(a->tmpname);
 			}
 			a->tmpname = NULL;
 		}
@@ -2148,8 +2145,11 @@ restore_entry(struct archive_write_disk *a)
 			if ((a->flags & ARCHIVE_EXTRACT_SAFE_WRITES) &&
 			    S_ISREG(a->st.st_mode)) {
 				/* Use a temporary file to extract */
-				if ((a->fd = la_mktemp(a)) == -1)
+				if ((a->fd = la_mktemp(a)) == -1) {
+					archive_set_error(&a->archive, errno,
+					    "Can't create temporary file");
 					return ARCHIVE_FAILED;
+				}
 				a->pst = NULL;
 				en = 0;
 			} else {

Modified: vendor/libarchive/dist/libarchive/archive_write_disk_windows.c
==============================================================================
--- vendor/libarchive/dist/libarchive/archive_write_disk_windows.c	Mon Mar  2 07:40:08 2020	(r358531)
+++ vendor/libarchive/dist/libarchive/archive_write_disk_windows.c	Mon Mar  2 08:30:59 2020	(r358532)
@@ -549,6 +549,8 @@ la_mktemp(struct archive_write_disk *a)
 	a->tmpname = a->_tmpname_data.s;
 
 	fd = __archive_mkstemp(a->tmpname);
+	if (fd == -1)
+		return -1;
 
 	mode = a->mode & 0777 & ~a->user_umask;
 	if (la_chmod(a->tmpname, mode) == -1) {
@@ -1174,7 +1176,6 @@ _archive_write_disk_finish_entry(struct archive *_a)
 {
 	struct archive_write_disk *a = (struct archive_write_disk *)_a;
 	int ret = ARCHIVE_OK;
-	int oerrno;
 
 	archive_check_magic(&a->archive, ARCHIVE_WRITE_DISK_MAGIC,
 	    ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA,
@@ -1282,12 +1283,11 @@ _archive_write_disk_finish_entry(struct archive *_a)
 			/* Windows does not support atomic rename */
 			disk_unlink(a->name);
 			if (_wrename(a->tmpname, a->name) != 0) {
-				oerrno = errno;
-				disk_unlink(a->tmpname);
-				errno = oerrno;
+				la_dosmaperr(GetLastError());
 				archive_set_error(&a->archive, errno,
-				    "Failed to safe write");
-				ret = ARCHIVE_FATAL;
+				    "Failed to rename temporary file");
+				ret = ARCHIVE_FAILED;
+				disk_unlink(a->tmpname);
 			}
 			a->tmpname = NULL;
 		}
@@ -1577,12 +1577,17 @@ restore_entry(struct archive_write_disk *a)
 				S_ISREG(st_mode)) {
 				int fd = la_mktemp(a);
 
-				if (fd == -1)
+				if (fd == -1) {
+					la_dosmaperr(GetLastError());
+					archive_set_error(&a->archive, errno,
+					    "Can't create temporary file");
 					return (ARCHIVE_FAILED);
+				}
 				a->fh = (HANDLE)_get_osfhandle(fd);
-				if (a->fh == INVALID_HANDLE_VALUE)
+				if (a->fh == INVALID_HANDLE_VALUE) {
+					la_dosmaperr(GetLastError());
 					return (ARCHIVE_FAILED);
-
+				}
 				a->pst = NULL;
 				en = 0;
 			} else {


More information about the svn-src-all mailing list