From: Martin Matuska Date: Sat, 29 Feb 2020 01:10:00 +0000 (+0100) Subject: Safe writes: delete temporary file if rename fails X-Git-Tag: v3.4.3~30 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=de0d217aa3ff615f26f1895b298ff6e64e89ceb2;p=thirdparty%2Flibarchive.git Safe writes: delete temporary file if rename fails Change error message to "Failed to safe write" Fixes #1341 --- diff --git a/libarchive/archive_write_disk_posix.c b/libarchive/archive_write_disk_posix.c index cc53a3d31..173ea808f 100644 --- a/libarchive/archive_write_disk_posix.c +++ b/libarchive/archive_write_disk_posix.c @@ -1855,8 +1855,9 @@ finish_metadata: a->fd = -1; if (a->tmpname) { if (rename(a->tmpname, a->name) == -1) { + unlink(a->tmpname); archive_set_error(&a->archive, errno, - "rename failed"); + "Failed to safe write"); ret = ARCHIVE_FATAL; } a->tmpname = NULL; diff --git a/libarchive/archive_write_disk_windows.c b/libarchive/archive_write_disk_windows.c index 77e36c4a6..1d1275df3 100644 --- a/libarchive/archive_write_disk_windows.c +++ b/libarchive/archive_write_disk_windows.c @@ -1281,8 +1281,9 @@ _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) { + disk_unlink(a->tmpname); archive_set_error(&a->archive, errno, - "rename failed"); + "Failed to safe write"); ret = ARCHIVE_FATAL; } a->tmpname = NULL;