Saving domain to previously created file changes also its ownership.
This is certainly not what users want if some conditions are met:
it is a regular, local file and dynamic_ownership is off.
---
src/qemu/qemu_driver.c | 12 +++++++++++-
1 files changed, 11 insertions(+), 1 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index db299a2..4538cf3 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -1963,6 +1963,8 @@ static int qemudDomainSaveFlag(struct qemud_driver *driver,
virDomainPtr dom,
bool is_reg = false;
unsigned long long offset;
int fd = -1;
+ uid_t uid = getuid();
+ gid_t gid = getgid();
memset(&header, 0, sizeof(header));
memcpy(header.magic, QEMUD_SAVE_MAGIC, sizeof(header.magic));
@@ -2013,6 +2015,14 @@ static int qemudDomainSaveFlag(struct qemud_driver *driver,
virDomainPtr dom,
is_reg = true;
} else {
is_reg = !!S_ISREG(sb.st_mode);
+ /* If the path is regular local file which exists
+ * already and dynamic_ownership is off, we don't
+ * want to change it's ownership, just append the data */
+ if (is_reg && !driver->dynamicOwnership &&
+ virStorageFileIsSharedFS(path) == 0) {
+ uid=sb.st_uid;
+ gid=sb.st_gid;
+ }
}
offset = sizeof(header) + header.xml_len;
@@ -2048,7 +2058,7 @@ static int qemudDomainSaveFlag(struct qemud_driver *driver,
virDomainPtr dom,
} else {
if ((fd = virFileOpenAs(path, O_CREAT|O_TRUNC|O_WRONLY,
S_IRUSR|S_IWUSR,
- getuid(), getgid(), 0)) < 0) {
+ uid, gid, 0)) < 0) {
/* If we failed as root, and the error was permission-denied
(EACCES or EPERM), assume it's on a network-connected share
where root access is restricted (eg, root-squashed NFS). If the
--
1.7.5.rc3