提交 4ac847f9 编写于 作者: M Michal Privoznik

qemuDomainCreateDevice: Don't loop endlessly

When working with symlinks it is fairly easy to get into a loop.
Don't.
Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
上级 54ed6722
......@@ -6999,9 +6999,10 @@ qemuDomainGetPreservedMounts(virQEMUDriverPtr driver,
static int
qemuDomainCreateDevice(const char *device,
const char *path,
bool allow_noent)
qemuDomainCreateDeviceRecursive(const char *device,
const char *path,
bool allow_noent,
unsigned int ttl)
{
char *devicePath = NULL;
char *target = NULL;
......@@ -7013,6 +7014,13 @@ qemuDomainCreateDevice(const char *device,
char *tcon = NULL;
#endif
if (!ttl) {
virReportSystemError(ELOOP,
_("Too many levels of symbolic links: %s"),
device);
return ret;
}
if (lstat(device, &sb) < 0) {
if (errno == ENOENT && allow_noent) {
/* Ignore non-existent device. */
......@@ -7102,7 +7110,8 @@ qemuDomainCreateDevice(const char *device,
tmp = NULL;
}
if (qemuDomainCreateDevice(target, path, allow_noent) < 0)
if (qemuDomainCreateDeviceRecursive(target, path,
allow_noent, ttl - 1) < 0)
goto cleanup;
} else {
if (create &&
......@@ -7173,6 +7182,17 @@ qemuDomainCreateDevice(const char *device,
}
static int
qemuDomainCreateDevice(const char *device,
const char *path,
bool allow_noent)
{
long symloop_max = sysconf(_SC_SYMLOOP_MAX);
return qemuDomainCreateDeviceRecursive(device, path,
allow_noent, symloop_max);
}
static int
qemuDomainPopulateDevices(virQEMUDriverPtr driver,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册