Unverified Commit 5846c3b4 by Christian Brauner Committed by Stéphane Graber

utils: duplicate stderr as well in lxc_popen()

parent 19615db8
...@@ -472,6 +472,7 @@ const char** lxc_va_arg_list_to_argv_const(va_list ap, size_t skip) ...@@ -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) extern struct lxc_popen_FILE *lxc_popen(const char *command)
{ {
int ret;
struct lxc_popen_FILE *fp = NULL; struct lxc_popen_FILE *fp = NULL;
int parent_end = -1, child_end = -1; int parent_end = -1, child_end = -1;
int pipe_fds[2]; int pipe_fds[2];
...@@ -491,24 +492,40 @@ extern struct lxc_popen_FILE *lxc_popen(const char *command) ...@@ -491,24 +492,40 @@ extern struct lxc_popen_FILE *lxc_popen(const char *command)
if (child_pid == 0) { if (child_pid == 0) {
/* child */ /* child */
int child_std_end = STDOUT_FILENO;
close(parent_end); close(parent_end);
if (child_end != child_std_end) { if (child_end != STDOUT_FILENO) {
/* dup2() doesn't dup close-on-exec flag */ /* dup2() doesn't dup close-on-exec flag */
dup2(child_end, child_std_end); ret = dup2(child_end, STDOUT_FILENO);
if (ret < 0)
/* it's safe not to close child_end here WARN("Failed to duplicate stdout fd");
* as it's marked close-on-exec anyway } 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 { } else {
/* /*
* The descriptor is already the one we will use. * The descriptor is already the one we will use.
* But it must not be marked close-on-exec. * But it must not be marked close-on-exec.
* Undo the effects. * 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."); SYSERROR("Failed to remove FD_CLOEXEC from fd.");
exit(127); exit(127);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment