[lxc-devel] [PATCH 1/2] don't hang on some errors in do_restore

Serge Hallyn serge.hallyn at ubuntu.com
Sat Apr 4 01:53:24 UTC 2015


Quoting Tycho Andersen (tycho.andersen at canonical.com):
> Instead, the parent always writes a status to the pipe.
> 
> Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>

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

> ---
>  src/lxc/lxccontainer.c | 21 ++++++++++++++++++---
>  1 file changed, 18 insertions(+), 3 deletions(-)
> 
> diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
> index b310a0f..88cdf55 100644
> --- a/src/lxc/lxccontainer.c
> +++ b/src/lxc/lxccontainer.c
> @@ -3926,13 +3926,14 @@ static void do_restore(struct lxc_container *c, int pipe, char *directory, bool
>  	pid_t pid;
>  	char pidfile[L_tmpnam];
>  	struct lxc_handler *handler;
> +	int status;
>  
>  	if (!tmpnam(pidfile))
> -		exit(1);
> +		goto out;
>  
>  	handler = lxc_init(c->name, c->lxc_conf, c->config_path);
>  	if (!handler)
> -		exit(1);
> +		goto out;
>  
>  	if (!cgroup_init(handler)) {
>  		ERROR("failed initing cgroups");
> @@ -3957,6 +3958,9 @@ static void do_restore(struct lxc_container *c, int pipe, char *directory, bool
>  		struct criu_opts os;
>  		struct lxc_rootfs *rootfs;
>  
> +		close(pipe);
> +		pipe = -1;
> +
>  		if (unshare(CLONE_NEWNS))
>  			goto out_fini_handler;
>  
> @@ -3994,7 +3998,7 @@ static void do_restore(struct lxc_container *c, int pipe, char *directory, bool
>  		rmdir(rootfs->mount);
>  		goto out_fini_handler;
>  	} else {
> -		int status, ret;
> +		int ret;
>  		char title[2048];
>  
>  		pid_t w = waitpid(pid, &status, 0);
> @@ -4005,6 +4009,7 @@ static void do_restore(struct lxc_container *c, int pipe, char *directory, bool
>  
>  		ret = write(pipe, &status, sizeof(status));
>  		close(pipe);
> +		pipe = -1;
>  
>  		if (sizeof(status) != ret) {
>  			perror("write");
> @@ -4056,6 +4061,16 @@ static void do_restore(struct lxc_container *c, int pipe, char *directory, bool
>  
>  out_fini_handler:
>  	lxc_fini(c->name, handler);
> +
> +out:
> +	if (pipe >= 0) {
> +		status = 1;
> +		if (write(pipe, &status, sizeof(status)) != sizeof(status)) {
> +			SYSERROR("writing status failed");
> +		}
> +		close(pipe);
> +	}
> +
>  	exit(1);
>  }
>  
> -- 
> 2.1.4
> 
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel


More information about the lxc-devel mailing list