From 6451b55ec3d801bb03e912b0811408cf82cfc880 Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Mon, 12 Jun 2017 16:44:45 +0200 Subject: [PATCH] qemuDomainGetPreservedMounts: Fix suffixes for corner cases https://bugzilla.redhat.com/show_bug.cgi?id=1431112 Imagine a FS mounted on /dev/blah/blah2. Our process of creating suffix for temporary location where all the mounted filesystems are moved is very simplistic. We want: /var/run/libvirt/qemu/$domName.$suffix\ were $suffix is just the mount point path stripped of the "/dev/" prefix. For instance: /var/run/libvirt/qemu/fedora.mqueue for /dev/mqueue /var/run/libvirt/qemu/fedora.pts for /dev/pts and so on. Now if we plug /dev/blah/blah2 into the example we see some misbehaviour: /var/run/libvirt/qemu/fedora.blah/blah2 Well, misbehaviour if /dev/blah/blah2 is a file, because in that case we call virFileTouch() instead of virFileMakePath(). The solution is to replace all the slashes in the suffix with say dots. That way we don't have to care about nested directories. IOW, the result we want for given example is: /var/run/libvirt/qemu/fedora.blah.blah2 Signed-off-by: Michal Privoznik Reviewed-by: John Ferlan --- src/qemu/qemu_domain.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 81e4b02f38..5b6d34be67 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -7622,7 +7622,9 @@ qemuDomainGetPreservedMounts(virQEMUDriverConfigPtr cfg, goto error; for (i = 0; i < nmounts; i++) { + char *tmp; const char *suffix = mounts[i] + strlen(DEVPREFIX); + size_t off; if (STREQ(mounts[i], "/dev")) suffix = "dev"; @@ -7630,6 +7632,20 @@ qemuDomainGetPreservedMounts(virQEMUDriverConfigPtr cfg, if (virAsprintf(&paths[i], "%s/%s.%s", cfg->stateDir, vm->def->name, suffix) < 0) goto error; + + /* Now consider that mounts[i] is "/dev/blah/blah2". + * @suffix then points to "blah/blah2". However, caller + * expects all the @paths to be the same depth. The + * caller doesn't always do `mkdir -p` but sometimes bare + * `touch`. Therefore fix all the suffixes. */ + off = strlen(paths[i]) - strlen(suffix); + + tmp = paths[i] + off; + while (*tmp) { + if (*tmp == '/') + *tmp = '.'; + tmp++; + } } if (devPath)