[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