[lxc-devel] [PATCH 1/2] don't hang on some errors in do_restore
Tycho Andersen
tycho.andersen at canonical.com
Fri Apr 3 21:17:25 UTC 2015
Instead, the parent always writes a status to the pipe.
Signed-off-by: Tycho Andersen <tycho.andersen at canonical.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
More information about the lxc-devel
mailing list