[libvirt] [PATCH 3/5] qemuDomainCreateDeviceRecursive: Don't try to create devices under preserved mount points
Cedric Bosdonnat
cbosdonnat at suse.com
Wed May 3 13:23:59 UTC 2017
On Fri, 2017-04-28 at 13:22 +0200, Michal Privoznik wrote:
> While the code allows devices to already be there (by some
> miracle), we shouldn't try to create devices that don't belong to
> us. For instance, we shouldn't try to create /dev/shm/file
> because /dev/shm is a mount point that is preserved. Therefore if
> a file is created there from an outside (e.g. by mgmt application
> or some other daemon running on the system like vhostmd), it
> exists in the qemu namespace too as the mount point is the same.
> It's only /dev and /dev only that is different. The same
One 'only' should be dropped perhaps?
> reasoning applies to all other preserved mount points.
>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> src/qemu/qemu_domain.c | 39 ++++++++++++++++++++++++++++++---------
> 1 file changed, 30 insertions(+), 9 deletions(-)
>
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 9e18f7e..5840c57 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -7339,6 +7339,8 @@ qemuDomainGetPreservedMounts(virQEMUDriverConfigPtr cfg,
>
> struct qemuDomainCreateDeviceData {
> const char *path; /* Path to temp new /dev location */
> + char * const *devMountsPath;
> + size_t ndevMountsPath;
> };
>
>
> @@ -7392,17 +7394,34 @@ qemuDomainCreateDeviceRecursive(const char *device,
> * For now, lets hope callers play nice.
> */
> if (STRPREFIX(device, DEVPREFIX)) {
> - if (virAsprintf(&devicePath, "%s/%s",
> - data->path, device + strlen(DEVPREFIX)) < 0)
> - goto cleanup;
> + size_t i;
>
> - if (virFileMakeParentPath(devicePath) < 0) {
> - virReportSystemError(errno,
> - _("Unable to create %s"),
> - devicePath);
> - goto cleanup;
> + for (i = 0; i < data->ndevMountsPath; i++) {
> + if (STREQ(data->devMountsPath[i], "/dev"))
> + continue;
> + if (STRPREFIX(device, data->devMountsPath[i]))
> + break;
> + }
> +
> + if (i == data->ndevMountsPath) {
> + /* Okay, @device is in /dev but not in any mount point under /dev.
> + * Create it. */
> + if (virAsprintf(&devicePath, "%s/%s",
> + data->path, device + strlen(DEVPREFIX)) < 0)
> + goto cleanup;
> +
> + if (virFileMakeParentPath(devicePath) < 0) {
> + virReportSystemError(errno,
> + _("Unable to create %s"),
> + devicePath);
> + goto cleanup;
> + }
> + VIR_DEBUG("Creating dev %s", device);
> + create = true;
> + } else {
> + VIR_DEBUG("Skipping dev %s because of %s mount point",
> + device, data->devMountsPath[i]);
> }
> - create = true;
> }
>
> if (isLink) {
> @@ -7951,6 +7970,8 @@ qemuDomainBuildNamespace(virQEMUDriverConfigPtr cfg,
> }
>
> data.path = devPath;
> + data.devMountsPath = devMountsPath;
> + data.ndevMountsPath = ndevMountsPath;
>
> if (virProcessSetupPrivateMountNS() < 0)
> goto cleanup;
ACK
--
Cedric
More information about the libvir-list
mailing list