From f854c559b9e7a40152e2f8c1c360ed92ee174c00 Mon Sep 17 00:00:00 2001 From: Andrea Bolognani Date: Mon, 4 Apr 2016 16:25:15 +0200 Subject: [PATCH] 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. --- 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 ed6e74d346..95ae64a1db 100644 --- a/tools/virt-host-validate-common.c +++ b/tools/virt-host-validate-common.c @@ -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)