]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
c/r: don't fail if there is no console_fd on restore 906/head
authorTycho Andersen <tycho.andersen@canonical.com>
Mon, 21 Mar 2016 22:52:02 +0000 (16:52 -0600)
committerTycho Andersen <tycho.andersen@canonical.com>
Mon, 21 Mar 2016 22:56:03 +0000 (16:56 -0600)
If we set lxc.console=none, this fd won't exist, so let's not fail if it
doesn't. We already partially handled this case correctly, so let's
actually handle it correctly :)

Signed-off-by: Tycho Andersen <tycho.andersen@canonical.com>
src/lxc/criu.c

index 1b3c4ac622cf43de3c2b4b4d5ca3a53d24732c58..16449bcf1ce5b7b27d6ae731279dd1118b84ea87 100644 (file)
@@ -290,6 +290,11 @@ static void exec_criu(struct criu_opts *opts)
                DECLARE_ARG(opts->cgroup_path);
 
                if (tty_info[0]) {
+                       if (opts->console_fd < 0) {
+                               ERROR("lxc.console configured on source host but not target");
+                               goto err;
+                       }
+
                        ret = snprintf(buf, sizeof(buf), "fd[%d]:%s", opts->console_fd, tty_info);
                        if (ret < 0 || ret >= sizeof(buf))
                                goto err;
@@ -624,20 +629,22 @@ void do_restore(struct lxc_container *c, int status_pipe, char *directory, bool
                os.cgroup_path = cgroup_canonical_path(handler);
                os.console_fd = c->lxc_conf->console.slave;
 
-               /* Twiddle the FD_CLOEXEC bit. We want to pass this FD to criu
-                * via --inherit-fd, so we don't want it to close.
-                */
-               flags = fcntl(os.console_fd, F_GETFD);
-               if (flags < 0) {
-                       SYSERROR("F_GETFD failed");
-                       goto out_fini_handler;
-               }
+               if (os.console_fd >= 0) {
+                       /* Twiddle the FD_CLOEXEC bit. We want to pass this FD to criu
+                        * via --inherit-fd, so we don't want it to close.
+                        */
+                       flags = fcntl(os.console_fd, F_GETFD);
+                       if (flags < 0) {
+                               SYSERROR("F_GETFD failed: %d", os.console_fd);
+                               goto out_fini_handler;
+                       }
 
-               flags &= ~FD_CLOEXEC;
+                       flags &= ~FD_CLOEXEC;
 
-               if (fcntl(os.console_fd, F_SETFD, flags) < 0) {
-                       SYSERROR("F_SETFD failed");
-                       goto out_fini_handler;
+                       if (fcntl(os.console_fd, F_SETFD, flags) < 0) {
+                               SYSERROR("F_SETFD failed");
+                               goto out_fini_handler;
+                       }
                }
                os.console_name = c->lxc_conf->console.name;