[lxc-devel] [PATCH 1/1] cgmanager get/set: clean up child (v2)

Dwight Engen dwight.engen at oracle.com
Fri Aug 15 20:20:32 UTC 2014


On Fri, 15 Aug 2014 19:22:02 +0000
Serge Hallyn <serge.hallyn at ubuntu.com> wrote:

> (Thanks, Dwight, this one look right?)
> 
> Make sure we reap our child at cgm_{s,g}et.
> 
> Changelog: Fix change in behavior on empty read from the do_cgm_get()
>            helper that was spotted by Dwight.
> 
> Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>

Acked-by: Dwight Engen <dwight.engen at oracle.com>

> ---
>  src/lxc/cgmanager.c | 30 +++++++++++++++++++++---------
>  1 file changed, 21 insertions(+), 9 deletions(-)
> 
> diff --git a/src/lxc/cgmanager.c b/src/lxc/cgmanager.c
> index c4f48e9..4db61c1 100644
> --- a/src/lxc/cgmanager.c
> +++ b/src/lxc/cgmanager.c
> @@ -794,32 +794,38 @@ static int cgm_get(const char *filename, char
> *value, size_t len, const char *na close(p[1]);
>  		return -1;
>  	}
> -	if (!pid)
> +	if (!pid) // do_cgm_get exits
>  		do_cgm_get(name, lxcpath, filename, p[1], len &&
> value); close(p[1]);
>  	ret = read(p[0], &newlen, sizeof(newlen));
>  	if (ret != sizeof(newlen)) {
>  		close(p[0]);
> -		return -1;
> +		ret = -1;
> +		goto out;
>  	}
>  	if (!len || !value) {
>  		close(p[0]);
> -		return newlen;
> +		ret = newlen;
> +		goto out;
>  	}
>  	memset(value, 0, len);
>  	if (newlen < 0) { // child is reporting an error
>  		close(p[0]);
> -		return -1;
> +		ret = -1;
> +		goto out;
>  	}
>  	if (newlen == 0) { // empty read
>  		close(p[0]);
> -		return 0;
> +		ret = 0;
> +		goto out;
>  	}
>  	readlen = newlen > len ? len : newlen;
>  	ret = read(p[0], value, readlen);
>  	close(p[0]);
> -	if (ret != readlen)
> -		return -1;
> +	if (ret != readlen) {
> +		ret = -1;
> +		goto out;
> +	}
>  	if (newlen >= len) {
>  		value[len-1] = '\0';
>  		newlen = len-1;
> @@ -828,7 +834,11 @@ static int cgm_get(const char *filename, char
> *value, size_t len, const char *na value[newlen++] = '\n';
>  		value[newlen] = '\0';
>  	}
> -	return newlen;
> +	ret = newlen;
> +out:
> +	if (wait_for_pid(pid))
> +		WARN("do_cgm_get exited with error");
> +	return ret;
>  }
>  
>  static void do_cgm_set(const char *name, const char *lxcpath, const
> char *filename, const char *value, int outp) @@ -920,11 +930,13 @@
> static int cgm_set(const char *filename, const char *value, const
> char *name, co close(p[0]); return -1;
>  	}
> -	if (!pid)
> +	if (!pid) // do_cgm_set exits
>  		do_cgm_set(name, lxcpath, filename, value, p[1]);
>  	close(p[1]);
>  	ret = read(p[0], &v, sizeof(v));
>  	close(p[0]);
> +	if (wait_for_pid(pid))
> +		WARN("do_cgm_set exited with error");
>  	if (ret != sizeof(v) || !v)
>  		return -1;
>  	return 0;



More information about the lxc-devel mailing list