[CRIU] [PATCH 2/4] service: page-server: return port back to user

Pavel Emelyanov xemul at parallels.com
Wed Sep 17 07:44:44 PDT 2014


On 09/17/2014 11:25 AM, Ruslan Kuprieiev wrote:
> Signed-off-by: Ruslan Kuprieiev <kupruser at gmail.com>
> ---
>  cr-service.c | 44 ++++++++++++++++++++++++++++----------------
>  1 file changed, 28 insertions(+), 16 deletions(-)
> 
> diff --git a/cr-service.c b/cr-service.c
> index d144f47..2af6e8f 100644
> --- a/cr-service.c
> +++ b/cr-service.c
> @@ -505,7 +505,7 @@ static int pre_dump_loop(int sk, CriuReq *msg)
>  
>  static int start_page_server_req(int sk, CriuOpts *req)
>  {
> -	int ret, pid, start_pipe[2];
> +	int ret = -1, pid, start_pipe[2];
>  	ssize_t count;
>  	bool success = false;
>  	CriuResp resp = CRIU_RESP__INIT;
> @@ -532,28 +532,40 @@ static int start_page_server_req(int sk, CriuOpts *req)
>  
>  		pr_debug("Starting page server\n");
>  
> -		ret = cr_page_server(true, start_pipe[1]);
> +		pid = cr_page_server(true, start_pipe[1]);
> +		if (pid <= 0)
> +			goto out_ch;
> +
> +		count = write(start_pipe[1], &opts.ps_port, sizeof(opts.ps_port));
> +		if (count != sizeof(opts.ps_port))
> +			goto out_ch;
> +
> +		ret = pid;
>  out_ch:
> -		count = write(start_pipe[1], &ret, sizeof(ret));
> +		if (ret < 0 && pid > 0)
> +			kill(pid, SIGKILL);
>  		close(start_pipe[1]);
> -		if (count != sizeof(ret))
> -			exit(1);
> -		exit(0);
> +		exit(ret);
>  	}
>  
>  	close(start_pipe[1]);
> -	wait(NULL);
> -	ret = -1;
> -	count = read(start_pipe[0], &ret, sizeof(ret));
> -	if (count != sizeof(ret))
> -		success = false;
> -	else if (ret > 0) {
> -		success = true;
> -		ps.has_pid = true;
> -		ps.pid = ret;
> -		resp.ps = &ps;
> +	wait(&ret);
> +	if (ret <= 0)
> +		goto out;
> +
> +	count = read(start_pipe[0], &opts.ps_port, sizeof(opts.ps_port));
> +	if (count != sizeof(opts.ps_port)) {
> +		kill(ret, SIGKILL);
> +		goto out;
>  	}
>  
> +	success = true;
> +	ps.has_pid = true;
> +	ps.pid = ret;

The ret here would be ... what? Last time it was passed
as pointer to wait() call, but its argument is a) not pointer
to store pid and b) this task's child is not page server task.

> +	ps.has_port = true;
> +	ps.port = opts.ps_port;
> +	resp.ps = &ps;
> +
>  	pr_debug("Page server started\n");
>  out:
>  	resp.type = CRIU_REQ_TYPE__PAGE_SERVER;
> 



More information about the CRIU mailing list