[lxc-devel] [PATCH] lxc_monitor: fix memory leak on @fds and close fds

Serge Hallyn serge.hallyn at ubuntu.com
Wed Jun 10 14:23:45 UTC 2015


Quoting Arjun Sreedharan (arjun024 at gmail.com):
> also label and consolidate error conditions for
> better readability.
> 
> Signed-off-by: Arjun Sreedharan <arjun024 at gmail.com>

My only concern here is that rc in main is a pretty
generic name - could you please either put a comment by its
definition saying "this is main's return value, do not
use it for anything else", or use a different variable
name?  (You can add my ack when you resend)

Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>

> ---
>  src/lxc/lxc_monitor.c | 50 ++++++++++++++++++++++++++++++++++++--------------
>  1 file changed, 36 insertions(+), 14 deletions(-)
> 
> diff --git a/src/lxc/lxc_monitor.c b/src/lxc/lxc_monitor.c
> index b3d8912..30b8bfe 100644
> --- a/src/lxc/lxc_monitor.c
> +++ b/src/lxc/lxc_monitor.c
> @@ -71,6 +71,18 @@ Options :\n\
>  	.lxcpath_additional = -1,
>  };
>  
> +void close_fds(struct pollfd *fds, nfds_t nfds)
> +{
> +	nfds_t i;
> +
> +	if (nfds < 1)
> +		return;
> +
> +	for (i = 0; i < nfds; ++i) {
> +		close(fds[i].fd);
> +	}
> +}
> +
>  int main(int argc, char *argv[])
>  {
>  	char *regexp;
> @@ -78,7 +90,9 @@ int main(int argc, char *argv[])
>  	regex_t preg;
>  	struct pollfd *fds;
>  	nfds_t nfds;
> -	int len, rc, i;
> +	int len, rc, rc_snp, i;
> +
> +	rc = 0;
>  
>  	if (lxc_arguments_parse(&my_args, argc, argv))
>  		return 1;
> @@ -119,24 +133,24 @@ int main(int argc, char *argv[])
>  		ERROR("failed to allocate memory");
>  		return 1;
>  	}
> -	rc = snprintf(regexp, len, "^%s$", my_args.name);
> -	if (rc < 0 || rc >= len) {
> +	rc_snp = snprintf(regexp, len, "^%s$", my_args.name);
> +	if (rc_snp < 0 || rc_snp >= len) {
>  		ERROR("Name too long");
> -		free(regexp);
> -		return 1;
> +		rc = 1;
> +		goto error;
>  	}
>  
>  	if (regcomp(&preg, regexp, REG_NOSUB|REG_EXTENDED)) {
>  		ERROR("failed to compile the regex '%s'", my_args.name);
> -		free(regexp);
> -		return 1;
> +		rc = 1;
> +		goto error;
>  	}
> -	free(regexp);
>  
>  	fds = malloc(my_args.lxcpath_cnt * sizeof(struct pollfd));
>  	if (!fds) {
>  		SYSERROR("out of memory");
> -		return -1;
> +		rc = -1;
> +		goto error;
>  	}
>  
>  	nfds = my_args.lxcpath_cnt;
> @@ -147,8 +161,9 @@ int main(int argc, char *argv[])
>  
>  		fd = lxc_monitor_open(my_args.lxcpath[i]);
>  		if (fd < 0) {
> -			regfree(&preg);
> -			return 1;
> +			close_fds(fds, i);
> +			rc = 1;
> +			goto cleanup;
>  		}
>  		fds[i].fd = fd;
>  		fds[i].events = POLLIN;
> @@ -159,8 +174,8 @@ int main(int argc, char *argv[])
>  
>  	for (;;) {
>  		if (lxc_monitor_read_fdset(fds, nfds, &msg, -1) < 0) {
> -			regfree(&preg);
> -			return 1;
> +			rc = 1;
> +			goto close_and_clean;
>  		}
>  
>  		msg.name[sizeof(msg.name)-1] = '\0';
> @@ -182,7 +197,14 @@ int main(int argc, char *argv[])
>  		}
>  	}
>  
> +close_and_clean:
> +	close_fds(fds, nfds);
> +
> +cleanup:
>  	regfree(&preg);
> +	free(fds);
>  
> -	return 0;
> +error:
> +	free(regexp);
> +	return rc;
>  }
> -- 
> 1.7.11.7
> 


More information about the lxc-devel mailing list