host-validate: Be more careful when checking for cgroup mounts

The existing code is built on the assumption that no cgroup
name can appear as part of another cgroup name; moreover, cgroups
are expected to always be listed in a specific order.

If that's not the case, eg. 'cpuacct' is listed before 'cpu', the
algorithm fails to detect the cgroup mount point.

Rewrite it to get rid of such assumptions.
This commit is contained in:
Andrea Bolognani 2016-04-04 16:25:15 +02:00
parent 4572997aca
commit f854c559b9

View File

@ -343,16 +343,24 @@ static int virHostValidateCGroupMount(const char *hvname,
goto error;
while (getmntent_r(fp, &ent, mntbuf, sizeof(mntbuf)) && !matched) {
char *tmp = strstr(ent.mnt_opts, cg_name);
if (!tmp)
char **opts;
size_t nopts;
size_t i;
/* Ignore non-cgroup mounts */
if (STRNEQ(ent.mnt_type, "cgroup"))
continue;
tmp += strlen(cg_name);
if (*tmp != ',' &&
*tmp != '\0')
if (!(opts = virStringSplitCount(ent.mnt_opts, ",", 0, &nopts)))
continue;
matched = true;
/* Look for a mount option matching the cgroup name */
for (i = 0; i < nopts; i++) {
if (STREQ(opts[i], cg_name))
matched = true;
}
virStringFreeListCount(opts, nopts);
}
endmntent(fp);
if (!matched)