[Pkg-libvirt-commits] [libguestfs] 42/179: daemon: copy-file-to-file: Unlink destination file on failure (RHBZ#1150867).
Hilko Bengen
bengen at moszumanska.debian.org
Fri Oct 31 19:08:04 UTC 2014
This is an automated email from the git hooks/post-receive script.
bengen pushed a commit to branch experimental
in repository libguestfs.
commit 4d4cada65a09dd40940aa021ba7a52b5fbf266be
Author: Richard W.M. Jones <rjones at redhat.com>
Date: Thu Oct 9 09:34:11 2014 +0100
daemon: copy-file-to-file: Unlink destination file on failure (RHBZ#1150867).
When copying from file to file, don't leave the destination file
around if the copy fails.
However in the same code don't try unlinking the destination device on
failure.
---
daemon/copy.c | 26 +++++++++++++++++++++++---
1 file changed, 23 insertions(+), 3 deletions(-)
diff --git a/daemon/copy.c b/daemon/copy.c
index 9312e51..bab00fe 100644
--- a/daemon/copy.c
+++ b/daemon/copy.c
@@ -29,9 +29,13 @@
#include "daemon.h"
#include "actions.h"
+/* wrflags */
#define DEST_FILE_FLAGS O_WRONLY|O_CREAT|O_TRUNC|O_NOCTTY|O_CLOEXEC, 0666
#define DEST_DEVICE_FLAGS O_WRONLY|O_CLOEXEC, 0
+/* flags */
+#define COPY_UNLINK_DEST_ON_FAILURE 1
+
/* NB: We cheat slightly by assuming that optargs_bitmask is
* compatible for all four of the calls. This is true provided they
* all take the same set of optional arguments.
@@ -42,6 +46,7 @@ static int
copy (const char *src, const char *src_display,
const char *dest, const char *dest_display,
int wrflags, int wrmode,
+ int flags,
int64_t srcoffset, int64_t destoffset, int64_t size, int sparse)
{
int64_t saved_size = size;
@@ -105,6 +110,8 @@ copy (const char *src, const char *src_display,
reply_with_perror ("lseek: %s", dest_display);
close (src_fd);
close (dest_fd);
+ if (flags & COPY_UNLINK_DEST_ON_FAILURE)
+ unlink (dest);
return -1;
}
@@ -127,6 +134,8 @@ copy (const char *src, const char *src_display,
reply_with_perror ("read: %s", src_display);
close (src_fd);
close (dest_fd);
+ if (flags & COPY_UNLINK_DEST_ON_FAILURE)
+ unlink (dest);
return -1;
}
@@ -136,6 +145,8 @@ copy (const char *src, const char *src_display,
reply_with_error ("%s: input too short", src_display);
close (src_fd);
close (dest_fd);
+ if (flags & COPY_UNLINK_DEST_ON_FAILURE)
+ unlink (dest);
return -1;
}
@@ -148,6 +159,8 @@ copy (const char *src, const char *src_display,
reply_with_perror ("%s: seek (because of sparse flag)", dest_display);
close (src_fd);
close (dest_fd);
+ if (flags & COPY_UNLINK_DEST_ON_FAILURE)
+ unlink (dest);
return -1;
}
goto sparse_skip;
@@ -161,6 +174,8 @@ copy (const char *src, const char *src_display,
reply_with_perror ("%s: write", dest_display);
close (src_fd);
close (dest_fd);
+ if (flags & COPY_UNLINK_DEST_ON_FAILURE)
+ unlink (dest);
return -1;
}
sparse_skip:
@@ -177,11 +192,15 @@ copy (const char *src, const char *src_display,
if (close (src_fd) == -1) {
reply_with_perror ("close: %s", src_display);
close (dest_fd);
+ if (flags & COPY_UNLINK_DEST_ON_FAILURE)
+ unlink (dest);
return -1;
}
if (close (dest_fd) == -1) {
reply_with_perror ("close: %s", dest_display);
+ if (flags & COPY_UNLINK_DEST_ON_FAILURE)
+ unlink (dest);
return -1;
}
@@ -193,7 +212,7 @@ do_copy_device_to_device (const char *src, const char *dest,
int64_t srcoffset, int64_t destoffset, int64_t size,
int sparse)
{
- return copy (src, src, dest, dest, DEST_DEVICE_FLAGS,
+ return copy (src, src, dest, dest, DEST_DEVICE_FLAGS, 0,
srcoffset, destoffset, size, sparse);
}
@@ -209,7 +228,7 @@ do_copy_device_to_file (const char *src, const char *dest,
return -1;
}
- return copy (src, src, dest_buf, dest, DEST_FILE_FLAGS,
+ return copy (src, src, dest_buf, dest, DEST_FILE_FLAGS, 0,
srcoffset, destoffset, size, sparse);
}
@@ -225,7 +244,7 @@ do_copy_file_to_device (const char *src, const char *dest,
return -1;
}
- return copy (src_buf, src, dest, dest, DEST_DEVICE_FLAGS,
+ return copy (src_buf, src, dest, dest, DEST_DEVICE_FLAGS, 0,
srcoffset, destoffset, size, sparse);
}
@@ -249,5 +268,6 @@ do_copy_file_to_file (const char *src, const char *dest,
}
return copy (src_buf, src, dest_buf, dest, DEST_FILE_FLAGS,
+ COPY_UNLINK_DEST_ON_FAILURE,
srcoffset, destoffset, size, sparse);
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-libvirt/libguestfs.git
More information about the Pkg-libvirt-commits
mailing list