From b9537f3be119d9a099c96bbf9329fcd5b51e5312 Mon Sep 17 00:00:00 2001 Message-Id: From: Mark Wooding Date: Sun, 4 Jan 2009 17:48:43 +0000 Subject: [PATCH] Use new mdup(3mLib) function. Organization: Straylight/Edgeware From: Mark Wooding It makes descriptor juggling much more reliable. Increase version requirement on mLib to 2.1.0. --- client/tripectl.c | 12 +++++++----- configure.ac | 2 +- server/privsep.c | 6 ++++-- server/tripe.h | 1 + server/tun-slip.c | 9 +++++---- 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/client/tripectl.c b/client/tripectl.c index 2df79358..51450616 100644 --- a/client/tripectl.c +++ b/client/tripectl.c @@ -52,6 +52,7 @@ #include #include #include +#include #include #include #include @@ -367,6 +368,7 @@ int main(int argc, char *argv[]) uid_t u = -1; gid_t g = -1; int pfd[2], efd[2]; + mdup_fd md[3]; pid_t kid; struct sigaction sa; sigset_t newmask, oldmask; @@ -516,11 +518,11 @@ int main(int argc, char *argv[]) if ((kid = fork()) < 0) die(EXIT_FAILURE, "fork failed: %s", strerror(errno)); if (!kid) { - dup2(pfd[1], STDIN_FILENO); - dup2(pfd[1], STDOUT_FILENO); - dup2(efd[1], STDERR_FILENO); - close(pfd[0]); close(pfd[1]); - close(efd[0]); close(efd[1]); + close(pfd[0]); close(efd[0]); + md[0].cur = pfd[1]; md[0].want = STDIN_FILENO; + md[1].cur = pfd[1]; md[1].want = STDOUT_FILENO; + md[2].cur = efd[1]; md[2].want = STDERR_FILENO; + mdup(md, 3); if (logfp) fclose(logfp); if (pidfp) fclose(pidfp); closelog(); diff --git a/configure.ac b/configure.ac index 61ed4a8f..a8723c25 100644 --- a/configure.ac +++ b/configure.ac @@ -57,7 +57,7 @@ case "$host_os" in ;; esac -PKG_CHECK_MODULES([mLib], [mLib >= 2.0.4]) +PKG_CHECK_MODULES([mLib], [mLib >= 2.1.0]) PKG_CHECK_MODULES([catacomb], [catacomb >= 2.1.1]) CFLAGS="$CFLAGS $mLib_CFLAGS $catacomb_CFLAGS" diff --git a/server/privsep.c b/server/privsep.c index 5bc2b892..bbd4814a 100644 --- a/server/privsep.c +++ b/server/privsep.c @@ -173,6 +173,7 @@ void ps_split(int detachp) { pid_t kid; int fd[2]; + mdup_fd md[1]; const char *helper; if (socketpair(PF_UNIX, SOCK_STREAM, 0, fd)) { @@ -189,8 +190,9 @@ void ps_split(int detachp) if (kid == 0) { signal(SIGCHLD, SIG_DFL); if (detachp) detachtty(); - if (dup2(fd[0], 0) < 0) goto lose; - close(fd[0]); close(fd[1]); + close(fd[1]); + md[0].cur = fd[0]; md[0].want = STDIN_FILENO; + if (mdup(md, 1)) goto lose; execl(helper, helper, (char *)0); lose: fprintf(stderr, "helper: failed to run helper: %s\n", strerror(errno)); diff --git a/server/tripe.h b/server/tripe.h index ab15787f..2b6f950a 100644 --- a/server/tripe.h +++ b/server/tripe.h @@ -75,6 +75,7 @@ #include #include #include +#include #include #include #include diff --git a/server/tun-slip.c b/server/tun-slip.c index 40830f9d..04a58402 100644 --- a/server/tun-slip.c +++ b/server/tun-slip.c @@ -258,6 +258,7 @@ static tunnel *t_create(peer *p, int fd, char **ifn) { slipif *sl = 0; int pin[2] = { -1, -1 }, pout[2] = { -1, -1 }; + mdup_fd md[2]; pid_t kid = -1; dstr d = DSTR_INIT; unsigned char ch; @@ -292,10 +293,10 @@ static tunnel *t_create(peer *p, int fd, char **ifn) goto fail; } if (!kid) { - close(pin[1]); - close(pout[0]); - dup2(pin[0], STDIN_FILENO); - dup2(pout[1], STDOUT_FILENO); + close(pin[1]); close(pout[0]); + md[0].cur = pin[0]; md[0].want = STDIN_FILENO; + md[1].cur = pout[0]; md[1].want = STDOUT_FILENO; + mdup(md, 2); execlp(slipcmd, slipcmd, p_name(p), (char *)0); _exit(127); } -- [mdw]