The existing code was built with the assumption that no cgroup
name could appear as part of another cgroup name. Rewrite it to
handle such cases correctly.
---
tools/virt-host-validate-common.c | 20 ++++++++++++++------
1 file changed, 14 insertions(+), 6 deletions(-)
diff --git a/tools/virt-host-validate-common.c b/tools/virt-host-validate-common.c
index 56c6b56..d448e5c 100644
--- a/tools/virt-host-validate-common.c
+++ b/tools/virt-host-validate-common.c
@@ -340,16 +340,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)
--
2.5.5