Similarly to 29bb066915 forbid paths used with blockjobs to be relative.
Resolves:
https://bugzilla.redhat.com/show_bug.cgi?id=1300177
---
src/conf/snapshot_conf.c | 4 +---
src/libvirt_private.syms | 1 +
src/qemu/qemu_driver.c | 6 ++++++
src/util/virstoragefile.c | 31 +++++++++++++++++++++++++++++++
src/util/virstoragefile.h | 2 ++
5 files changed, 41 insertions(+), 3 deletions(-)
diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c
index 862c2ec00..5daa8d11a 100644
--- a/src/conf/snapshot_conf.c
+++ b/src/conf/snapshot_conf.c
@@ -170,9 +170,7 @@ virDomainSnapshotDiskDefParseXML(xmlNodePtr node,
}
/* validate that the passed path is absolute */
- if (virStorageSourceIsLocalStorage(def->src) &&
- def->src->path &&
- def->src->path[0] != '/') {
+ if (virStorageSourceIsRelative(def->src)) {
virReportError(VIR_ERR_XML_ERROR,
_("disk snapshot image path '%s' must be
absolute"),
def->src->path);
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 7beebbf27..5c82e4a0e 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2455,6 +2455,7 @@ virStorageSourceInitChainElement;
virStorageSourceIsBlockLocal;
virStorageSourceIsEmpty;
virStorageSourceIsLocalStorage;
+virStorageSourceIsRelative;
virStorageSourceNewFromBacking;
virStorageSourceNewFromBackingAbsolute;
virStorageSourceParseRBDColonString;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 0bf185644..1a464337e 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -16665,6 +16665,12 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm,
priv = vm->privateData;
cfg = virQEMUDriverGetConfig(driver);
+ if (virStorageSourceIsRelative(mirror)) {
+ virReportError(VIR_ERR_INVALID_ARG, "%s",
+ _("absolute path must be used as block copy target"));
+ goto cleanup;
+ }
+
if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
goto cleanup;
diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
index 9ec005d50..ce6d21388 100644
--- a/src/util/virstoragefile.c
+++ b/src/util/virstoragefile.c
@@ -3672,3 +3672,34 @@ virStorageFileCheckCompat(const char *compat)
virStringListFree(version);
return ret;
}
+
+
+/**
+ * virStorageSourceIsRelative:
+ * @src: storage source to check
+ *
+ * Returns true if given storage source definition is a relative path.
+ */
+bool
+virStorageSourceIsRelative(virStorageSourcePtr src)
+{
+ virStorageType actual_type = virStorageSourceGetActualType(src);
+
+ if (!src->path)
+ return false;
+
+ switch (actual_type) {
+ case VIR_STORAGE_TYPE_FILE:
+ case VIR_STORAGE_TYPE_BLOCK:
+ case VIR_STORAGE_TYPE_DIR:
+ return src->path[0] != '/';
+
+ case VIR_STORAGE_TYPE_NETWORK:
+ case VIR_STORAGE_TYPE_VOLUME:
+ case VIR_STORAGE_TYPE_NONE:
+ case VIR_STORAGE_TYPE_LAST:
+ return false;
+ }
+
+ return false;
+}
diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h
index 6d1aac78d..1f62244db 100644
--- a/src/util/virstoragefile.h
+++ b/src/util/virstoragefile.h
@@ -388,4 +388,6 @@ int virStorageFileCheckCompat(const char *compat);
virStorageSourcePtr virStorageSourceNewFromBackingAbsolute(const char *path);
+bool virStorageSourceIsRelative(virStorageSourcePtr src);
+
#endif /* __VIR_STORAGE_FILE_H__ */
--
2.11.0