]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Fix error when overwriting files on Windows
authorMartin Matuska <martin@matuska.org>
Wed, 22 Jan 2020 16:13:43 +0000 (17:13 +0100)
committerMartin Matuska <martin@matuska.org>
Wed, 22 Jan 2020 16:54:13 +0000 (17:54 +0100)
Introduced in 467d193dd61ca7669a5ba8d38e09836babf64e58

libarchive/archive_write_disk_windows.c

index adf89bc5d05a61e8770b221fd9261c17d14a32cd..111b54128c750c8e828e4be5373fbe8b77262849 100644 (file)
@@ -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)