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;
}
if (isLink &&
- qemuDomainAttachDeviceMknod(driver, vm, devDef, target) < 0)
+ qemuDomainAttachDeviceMknodRecursive(driver, vm, devDef,
+ target, ttl -1) < 0)
goto cleanup;
ret = 0;
}
+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)