From: Tycho Andersen Date: Fri, 26 Aug 2016 20:29:45 +0000 (-0400) Subject: c/r: write status only after trying to parse the pid X-Git-Tag: lxc-2.1.0~337^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F1155%2Fhead;p=thirdparty%2Flxc.git c/r: write status only after trying to parse the pid Previously, we write a "success" status but tried to parse the pid. This meant that we wouldn't notice a successful restore but failure to parse the pid, which was a little strange. We still don't know the child pid, so we will end up with a restored process tree and a running container, but at least in this case the API will return false indicating that something failed. We could kill(-1, 9) in this case, but since liblxc runs as root sometimes (e.g. LXD), that would be a Very Bad Thing. Signed-off-by: Tycho Andersen --- diff --git a/src/lxc/criu.c b/src/lxc/criu.c index 5a48c7203..71c9b9c32 100644 --- a/src/lxc/criu.c +++ b/src/lxc/criu.c @@ -723,15 +723,6 @@ static void do_restore(struct lxc_container *c, int status_pipe, struct migrate_ goto out_fini_handler; } - ret = write(status_pipe, &status, sizeof(status)); - close(status_pipe); - status_pipe = -1; - - if (sizeof(status) != ret) { - SYSERROR("failed to write all of status"); - goto out_fini_handler; - } - if (WIFEXITED(status)) { char buf[4096]; @@ -780,6 +771,15 @@ static void do_restore(struct lxc_container *c, int status_pipe, struct migrate_ close(pipes[0]); + ret = write(status_pipe, &status, sizeof(status)); + close(status_pipe); + status_pipe = -1; + + if (sizeof(status) != ret) { + SYSERROR("failed to write all of status"); + goto out_fini_handler; + } + /* * See comment in lxcapi_start; we don't care if these * fail because it's just a beauty thing. We just @@ -805,7 +805,12 @@ out_fini_handler: out: if (status_pipe >= 0) { - status = 1; + /* ensure getting here was a failure, e.g. if we failed to + * parse the child pid or something, even after a successful + * restore + */ + if (!status) + status = 1; if (write(status_pipe, &status, sizeof(status)) != sizeof(status)) { SYSERROR("writing status failed"); }