From: Martin Matuska Date: Wed, 22 Jan 2020 16:13:43 +0000 (+0100) Subject: Fix error when overwriting files on Windows X-Git-Tag: v3.4.2~29 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2f3fea2105c2a17af705f5f125d4e5d6b2cec8ff;p=thirdparty%2Flibarchive.git Fix error when overwriting files on Windows Introduced in 467d193dd61ca7669a5ba8d38e09836babf64e58 --- diff --git a/libarchive/archive_write_disk_windows.c b/libarchive/archive_write_disk_windows.c index adf89bc5d..111b54128 100644 --- a/libarchive/archive_write_disk_windows.c +++ b/libarchive/archive_write_disk_windows.c @@ -1569,14 +1569,7 @@ restore_entry(struct archive_write_disk *a) ARCHIVE_EXTRACT_CLEAR_NOCHANGE_FFLAGS) { (void)clear_nochange_fflags(a); } - if (dirlnk) { - /* Edge case: dir symlink pointing to a file */ - if (disk_rmdir(a->name) != 0) { - archive_set_error(&a->archive, errno, - "Can't unlink directory symlink"); - return (ARCHIVE_FAILED); - } - } else if ((a->flags & ARCHIVE_EXTRACT_SAFE_WRITES) && + if ((a->flags & ARCHIVE_EXTRACT_SAFE_WRITES) && S_ISREG(st_mode)) { int fd = la_mktemp(a); @@ -1588,17 +1581,30 @@ restore_entry(struct archive_write_disk *a) a->pst = NULL; en = 0; - - } else if (disk_unlink(a->name) != 0) { - /* A non-dir is in the way, unlink it. */ - archive_set_error(&a->archive, errno, - "Can't unlink already-existing object"); - return (ARCHIVE_FAILED); + } else { + if (dirlnk) { + /* Edge case: dir symlink pointing + * to a file */ + if (disk_rmdir(a->name) != 0) { + archive_set_error(&a->archive, + errno, "Can't unlink " + "directory symlink"); + return (ARCHIVE_FAILED); + } + } else { + if (disk_unlink(a->name) != 0) { + /* A non-dir is in the way, + * unlink it. */ + archive_set_error(&a->archive, + errno, "Can't unlink " + "already-existing object"); + return (ARCHIVE_FAILED); + } + } a->pst = NULL; /* Try again. */ en = create_filesystem_object(a); } - } else if (!S_ISDIR(a->mode)) { /* A dir is in the way of a non-dir, rmdir it. */ if (a->flags & ARCHIVE_EXTRACT_CLEAR_NOCHANGE_FFLAGS)