mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-29 09:05:25 +00:00
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 <mprivozn@redhat.com> Reviewed-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
parent
cdd9205dff
commit
6451b55ec3
@ -7622,7 +7622,9 @@ qemuDomainGetPreservedMounts(virQEMUDriverConfigPtr cfg,
|
|||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
for (i = 0; i < nmounts; i++) {
|
for (i = 0; i < nmounts; i++) {
|
||||||
|
char *tmp;
|
||||||
const char *suffix = mounts[i] + strlen(DEVPREFIX);
|
const char *suffix = mounts[i] + strlen(DEVPREFIX);
|
||||||
|
size_t off;
|
||||||
|
|
||||||
if (STREQ(mounts[i], "/dev"))
|
if (STREQ(mounts[i], "/dev"))
|
||||||
suffix = "dev";
|
suffix = "dev";
|
||||||
@ -7630,6 +7632,20 @@ qemuDomainGetPreservedMounts(virQEMUDriverConfigPtr cfg,
|
|||||||
if (virAsprintf(&paths[i], "%s/%s.%s",
|
if (virAsprintf(&paths[i], "%s/%s.%s",
|
||||||
cfg->stateDir, vm->def->name, suffix) < 0)
|
cfg->stateDir, vm->def->name, suffix) < 0)
|
||||||
goto error;
|
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)
|
if (devPath)
|
||||||
|
Loading…
Reference in New Issue
Block a user