[CRIU] [PATCH] page-xfer: close sockets on errror paths

Pavel Emelyanov xemul at parallels.com
Fri Apr 12 12:46:56 EDT 2013


On 04/12/2013 04:14 PM, Andrey Vagin wrote:
> CID 996195 (#1 of 1): Resource leak (RESOURCE_LEAK)
> 10. leaked_handle: Handle variable ask going out of scope leaks the handle.
> 
> CID 996196 (#3 of 3): Resource leak (RESOURCE_LEAK)
> 10. leaked_handle: Handle variable sk going out of scope leaks the handle.

Can we teach this soft not to warn us about not closed files on paths,
that lead directly to program termination?

More comments inline.

> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
>  page-xfer.c | 27 +++++++++++++++++----------
>  1 file changed, 17 insertions(+), 10 deletions(-)
> 
> diff --git a/page-xfer.c b/page-xfer.c
> index b60f1ce..f9ae094 100644
> --- a/page-xfer.c
> +++ b/page-xfer.c
> @@ -106,8 +106,11 @@ static int page_server_add(int sk, struct page_server_iov *pi)
>  
>  static int page_server_serve(int sk)
>  {
> +	int ret = -1;
> +
>  	if (pipe(cxfer.p)) {
>  		pr_perror("Can't make pipe for xfer");
> +		close(sk);
>  		return -1;

goto out;

>  	}
>  
> @@ -115,7 +118,6 @@ static int page_server_serve(int sk)
>  	pr_debug("Created xfer pipe size %u\n", cxfer.pipe_size);
>  
>  	while (1) {
> -		int ret;
>  		struct page_server_iov pi;
>  
>  		ret = read(sk, &pi, sizeof(pi));
> @@ -124,7 +126,8 @@ static int page_server_serve(int sk)
>  
>  		if (ret != sizeof(pi)) {
>  			pr_perror("Can't read pagemap from socket");
> -			return -1;
> +			ret = -1;
> +			break;
>  		}
>  
>  		switch (pi.cmd) {
> @@ -138,16 +141,18 @@ static int page_server_serve(int sk)
>  		}
>  
>  		if (ret)
> -			return -1;
> +			break;
>  	}
>  
>  	pr_info("Session over\n");
> -	return 0;

out:

> +
> +	close(sk);
> +	return ret;
>  }
>  
>  int cr_page_server(void)
>  {
> -	int sk, ask;
> +	int sk, ask = -1;
>  	struct sockaddr_in caddr;
>  	socklen_t clen = sizeof(caddr);
>  
> @@ -165,22 +170,24 @@ int cr_page_server(void)
>  	opts.ps_addr.sin_family = AF_INET;
>  	if (bind(sk, (struct sockaddr *)&opts.ps_addr, sizeof(opts.ps_addr))) {
>  		pr_perror("Can't bind page server\n");
> -		return -1;
> +		goto out;
>  	}
>  
>  	if (listen(sk, 1)) {
>  		pr_perror("Can't listen on page server socket");
> -		return -1;
> +		goto out;
>  	}
>  
>  	ask = accept(sk, (struct sockaddr *)&caddr, &clen);

close(sk); here

> -	if (ask < 0) {
> +	if (ask < 0)
>  		pr_perror("Can't accept connection to server");
> -		return -1;
> -	}
>  
> +out:
>  	close(sk);
>  
> +	if (ask < 0)
> +		return -1;
> +

and no double if (ask < 0) here

>  	pr_info("Accepted connection from %s:%u\n",
>  			inet_ntoa(caddr.sin_addr),
>  			(int)ntohs(caddr.sin_port));
> 




More information about the CRIU mailing list