]> git.proxmox.com Git - mirror_lxc.git/commitdiff
utils: duplicate stderr as well in lxc_popen()
authorChristian Brauner <christian.brauner@ubuntu.com>
Wed, 13 Sep 2017 03:25:22 +0000 (05:25 +0200)
committerStéphane Graber <stgraber@ubuntu.com>
Sun, 24 Sep 2017 04:25:28 +0000 (00:25 -0400)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/utils.c

index 3c83d7199bf957df6b9f2c1601f24002d7d6e215..d867f714d1f4ab28d46d38dcb11456ff99872c67 100644 (file)
@@ -472,6 +472,7 @@ const char** lxc_va_arg_list_to_argv_const(va_list ap, size_t skip)
 
 extern struct lxc_popen_FILE *lxc_popen(const char *command)
 {
+       int ret;
        struct lxc_popen_FILE *fp = NULL;
        int parent_end = -1, child_end = -1;
        int pipe_fds[2];
@@ -491,24 +492,40 @@ extern struct lxc_popen_FILE *lxc_popen(const char *command)
 
        if (child_pid == 0) {
                /* child */
-               int child_std_end = STDOUT_FILENO;
 
                close(parent_end);
 
-               if (child_end != child_std_end) {
+               if (child_end != STDOUT_FILENO) {
                        /* dup2() doesn't dup close-on-exec flag */
-                       dup2(child_end, child_std_end);
-
-                       /* it's safe not to close child_end here
-                        * as it's marked close-on-exec anyway
+                       ret = dup2(child_end, STDOUT_FILENO);
+                       if (ret < 0)
+                               WARN("Failed to duplicate stdout fd");
+               } else {
+                       /*
+                        * The descriptor is already the one we will use.
+                        * But it must not be marked close-on-exec.
+                        * Undo the effects.
                         */
+                       ret = fcntl(child_end, F_SETFD, 0);
+                       if (ret < 0) {
+                               SYSERROR("Failed to remove FD_CLOEXEC from fd.");
+                               exit(127);
+                       }
+               }
+
+               if (child_end != STDERR_FILENO) {
+                       /* dup2() doesn't dup close-on-exec flag */
+                       ret = dup2(child_end, STDERR_FILENO);
+                       if (ret < 0)
+                               WARN("Failed to duplicate stdout fd");
                } else {
                        /*
                         * The descriptor is already the one we will use.
                         * But it must not be marked close-on-exec.
                         * Undo the effects.
                         */
-                       if (fcntl(child_end, F_SETFD, 0) != 0) {
+                       ret = fcntl(child_end, F_SETFD, 0);
+                       if (ret < 0) {
                                SYSERROR("Failed to remove FD_CLOEXEC from fd.");
                                exit(127);
                        }