]> wimlib.net Git - wimlib/blobdiff - src/write.c
overwrite_wim_inplace(): Fix error path
[wimlib] / src / write.c
index ba8b697078a2efeb2d23a657b10323d05d1cfc25..3b2aa18e0477b405288403ebed0b337c7aafa799 100644 (file)
@@ -1825,6 +1825,7 @@ finish_write(WIMStruct *w, int image, int write_flags,
                zero_resource_entry(&hdr.integrity);
        }
 
+       hdr.flags &= ~WIM_HDR_FLAG_WRITE_IN_PROGRESS;
        ret = write_header(&hdr, w->out_fd);
        if (ret)
                goto out_close_wim;
@@ -1907,7 +1908,9 @@ begin_write(WIMStruct *w, const tchar *path, int write_flags)
        if (ret)
                return ret;
        /* Write dummy header. It will be overwritten later. */
+       w->hdr.flags |= WIM_HDR_FLAG_WRITE_IN_PROGRESS;
        ret = write_header(&w->hdr, w->out_fd);
+       w->hdr.flags &= ~WIM_HDR_FLAG_WRITE_IN_PROGRESS;
        if (ret)
                return ret;
        if (lseek(w->out_fd, WIM_HEADER_DISK_SIZE, SEEK_SET) == -1) {
@@ -2109,11 +2112,20 @@ overwrite_wim_inplace(WIMStruct *w, int write_flags,
                return ret;
        }
 
+       /* Write header with write in progress flag set. */
+       w->hdr.flags |= WIM_HDR_FLAG_WRITE_IN_PROGRESS;
+       ret = write_header(&w->hdr, w->out_fd);
+       w->hdr.flags &= ~WIM_HDR_FLAG_WRITE_IN_PROGRESS;
+       if (ret) {
+               close_wim_writable(w);
+               goto out_unlock_wim;
+       }
+
        if (lseek(w->out_fd, old_wim_end, SEEK_SET) == -1) {
                ERROR_WITH_ERRNO("Can't seek to end of WIM");
                close_wim_writable(w);
-               w->wim_locked = 0;
-               return WIMLIB_ERR_WRITE;
+               ret = WIMLIB_ERR_WRITE;
+               goto out_unlock_wim;
        }
 
        DEBUG("Writing newly added streams (offset = %"PRIu64")",
@@ -2148,6 +2160,7 @@ out_truncate:
                 * an error path. */
                (void)ttruncate(w->filename, old_wim_end);
        }
+out_unlock_wim:
        w->wim_locked = 0;
        return ret;
 }