[CRIU] [PATCH] parasite: fix error paths in parasite_init

Pavel Emelyanov xemul at parallels.com
Tue Apr 9 17:26:08 EDT 2013


On 04/06/2013 01:28 PM, Andrey Vagin wrote:
> * Call restore_ns on error paths.
> * Use close_safe for the socket, because it can be reused
> 
> CID 996194 (#1 of 3): Resource leak (RESOURCE_LEAK)
> 6. leaked_handle: Handle variable "rst" going out of scope leaks the
> handle.
> 
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
>  parasite-syscall.c | 11 ++++++-----
>  1 file changed, 6 insertions(+), 5 deletions(-)
> 
> diff --git a/parasite-syscall.c b/parasite-syscall.c
> index d82995e..653db25 100644
> --- a/parasite-syscall.c
> +++ b/parasite-syscall.c
> @@ -309,18 +309,19 @@ static int parasite_init(struct parasite_ctl *ctl, pid_t pid, int nr_threads)
>  		}
>  
>  		sock = socket(PF_UNIX, SOCK_DGRAM, 0);
> -		if (sock < 0) {
> +		if (sock < 0)
>  			pr_perror("Can't create socket");
> +
> +		if (rst > 0 && restore_ns(rst, &net_ns_desc) < 0)
> +			return -1;
> +		if (sock < 0)

Can we have less if (sock < 0) checks?

>  			return -1;
> -		}
>  
>  		if (bind(sock, (struct sockaddr *)&args->h_addr, args->h_addr_len) < 0) {
>  			pr_perror("Can't bind socket");
>  			goto err;
>  		}
>  
> -		if (rst > 0 && restore_ns(rst, &net_ns_desc) < 0)
> -			goto err;
>  	} else {
>  		struct sockaddr addr = { .sa_family = AF_UNSPEC, };
>  
> @@ -350,7 +351,7 @@ static int parasite_init(struct parasite_ctl *ctl, pid_t pid, int nr_threads)
>  	ctl->tsock = sock;
>  	return 0;
>  err:
> -	close(sock);
> +	close_safe(&sock);
>  	return -1;
>  }
>  
> 




More information about the CRIU mailing list