[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