On Tue, Apr 05, 2016 at 03:08:40PM +0200, Andrea Bolognani wrote: > Simply checking whether the cgroup name appears somewhere inside > /proc/self/cgroup is enough most of the time, but there are some > corner cases that require a more mindful parsing. > > As a bonus, after the rewrite 'line' is no longer leaked. > --- > tools/virt-host-validate-common.c | 49 +++++++++++++++++++++++++++++++++------ > 1 file changed, 42 insertions(+), 7 deletions(-) > > diff --git a/tools/virt-host-validate-common.c b/tools/virt-host-validate-common.c > index 8ebf73e..56c6b56 100644 > --- a/tools/virt-host-validate-common.c > +++ b/tools/virt-host-validate-common.c > @@ -265,18 +265,53 @@ static int virHostValidateCGroupSupport(const char *hvname, > goto error; > > while ((ret = getline(&line, &len, fp)) >= 0 && !matched) { > - char *tmp = strstr(line, cg_name); > - if (!tmp) > + char **cgroups; > + char *start; > + char *end; > + size_t ncgroups; > + size_t i; > + > + /* Each line in this file looks like > + * > + * 4:cpu,cpuacct:/machine.slice/machine-qemu\x2dtest.scope/emulator > + * > + * Since multiple cgroups can be part of the same line and some cgroup > + * names can appear as part of other cgroup names (eg. 'cpu' is a > + * prefix for both 'cpuacct' and 'cpuset'), it's not enough to simply > + * check whether the cgroup name is present somewhere inside the file Also, they could be present in the path. > + */ > + > + /* Look for the first colon. > + * The part we're interested in starts right after it */ > + if (!(start = strchr(line, ':'))) { > + VIR_FREE(line); > continue; This pattern keeps repeating. How about calling VIR_FREE the first thing in the loop and moving the getline call right after it? ACK either way. Jan -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list