summaryrefslogtreecommitdiffstats
path: root/src/openvpn/misc.c
diff options
context:
space:
mode:
authorDavid Sommerseth <davids@redhat.com>2014-09-05 17:04:58 +0200
committerDavid Sommerseth <davids@redhat.com>2014-09-10 11:56:18 +0200
commitdf8ebb21ad1957ec013ab832a0f6c18e9d6744f6 (patch)
tree53e1734cd82ac1f061d6fa0fedd1550b27309a09 /src/openvpn/misc.c
parent55480682b9bfa5894402954f4c740954d8c5c556 (diff)
downloadopenvpn-df8ebb21ad1957ec013ab832a0f6c18e9d6744f6.tar.gz
openvpn-df8ebb21ad1957ec013ab832a0f6c18e9d6744f6.tar.xz
openvpn-df8ebb21ad1957ec013ab832a0f6c18e9d6744f6.zip
Clean up the pipe closing in openvpn_popen()
Do the proper closing of the pipe ends which is not being used, also in error situations. Moved the closing of the parent side before the waitpid(), to be consistent with the child side (as early as possible). Also improved the error messages with more details. [v2 - Don't call close() if execve() fails] Signed-off-by: David Sommerseth <davids@redhat.com> Acked-by: Gert Doering <gert@greenie.muc.de> Message-Id: 20140909202408.GK1118@greenie.muc.de URL: http://article.gmane.org/gmane.network.openvpn.devel/9036
Diffstat (limited to 'src/openvpn/misc.c')
-rw-r--r--src/openvpn/misc.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/src/openvpn/misc.c b/src/openvpn/misc.c
index 19bbef7..61bc523 100644
--- a/src/openvpn/misc.c
+++ b/src/openvpn/misc.c
@@ -365,27 +365,29 @@ openvpn_popen (const struct argv *a, const struct env_set *es)
pid = fork ();
if (pid == (pid_t)0) /* child side */
{
- close (pipe_stdout[0]);
+ close (pipe_stdout[0]); /* Close read end */
dup2 (pipe_stdout[1],1);
execve (cmd, argv, envp);
exit (127);
}
- else if (pid < (pid_t)0) /* fork failed */
- {
- msg (M_ERR, "openvpn_popen: unable to fork");
- }
- else /* parent side */
+ else if (pid > (pid_t)0) /* parent side */
{
int status = 0;
+ close (pipe_stdout[1]); /* Close write end */
waitpid(pid, &status, 0);
ret = pipe_stdout[0];
+ }
+ else /* fork failed */
+ {
+ close (pipe_stdout[0]);
close (pipe_stdout[1]);
+ msg (M_ERR, "openvpn_popen: unable to fork %s", cmd);
}
}
else {
- msg (M_WARN, "openvpn_popen: unable to create stdout pipe");
- ret = -1;
+ msg (M_WARN, "openvpn_popen: unable to create stdout pipe for %s", cmd);
+ ret = -1;
}
}
else if (!warn_shown && (script_security < SSEC_SCRIPTS))