From 7f0b382522c6cea296ef4b15ed96ddea9564e140 Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Thu, 19 Jan 2017 17:19:19 +0100 Subject: [PATCH] qemuDomainAttachDeviceMknod: Don't loop endlessly When working with symlinks it is fairly easy to get into a loop. Don't. Signed-off-by: Michal Privoznik --- src/qemu/qemu_domain.c | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 86ef2ceb2c..89a52ab1b7 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -7735,16 +7735,24 @@ qemuDomainAttachDeviceMknodHelper(pid_t pid ATTRIBUTE_UNUSED, static int -qemuDomainAttachDeviceMknod(virQEMUDriverPtr driver, - virDomainObjPtr vm, - virDomainDeviceDefPtr devDef, - const char *file) +qemuDomainAttachDeviceMknodRecursive(virQEMUDriverPtr driver, + virDomainObjPtr vm, + virDomainDeviceDefPtr devDef, + const char *file, + unsigned int ttl) { struct qemuDomainAttachDeviceMknodData data; int ret = -1; char *target = NULL; bool isLink; + if (!ttl) { + virReportSystemError(ELOOP, + _("Too many levels of symbolic links: %s"), + file); + return ret; + } + memset(&data, 0, sizeof(data)); data.driver = driver; @@ -7822,7 +7830,8 @@ qemuDomainAttachDeviceMknod(virQEMUDriverPtr driver, } if (isLink && - qemuDomainAttachDeviceMknod(driver, vm, devDef, target) < 0) + qemuDomainAttachDeviceMknodRecursive(driver, vm, devDef, + target, ttl -1) < 0) goto cleanup; ret = 0; @@ -7836,6 +7845,19 @@ qemuDomainAttachDeviceMknod(virQEMUDriverPtr driver, } +static int +qemuDomainAttachDeviceMknod(virQEMUDriverPtr driver, + virDomainObjPtr vm, + virDomainDeviceDefPtr devDef, + const char *file) +{ + long symloop_max = sysconf(_SC_SYMLOOP_MAX); + + return qemuDomainAttachDeviceMknodRecursive(driver, vm, devDef, + file, symloop_max); +} + + static int qemuDomainDetachDeviceUnlinkHelper(pid_t pid ATTRIBUTE_UNUSED, void *opaque)