diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 2007-10-17 20:02:34 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 2007-10-17 20:02:34 +0000 |
commit | 4f4368721b2619584d945f74ab23327bad6ac500 (patch) | |
tree | abab3b0ecf47032e485040088bd55f21f3952f39 | |
parent | 1d02ffd46168ad7485a450e43575363fbaa7dca7 (diff) |
- Be more careful about pre-existing SIGCHLD handlers (or SIG_IGN) by
temporarily restoring default behaviour. This is not 100% ideal.
But this fixes editor handling in mail... bah, it is really unfortunate
that got broken
- refactor the restoration code as well, to make it simpler
ok ray
-rw-r--r-- | sbin/disklabel/disklabel.c | 23 | ||||
-rw-r--r-- | usr.bin/mail/edit.c | 23 | ||||
-rw-r--r-- | usr.bin/sdiff/edit.c | 21 | ||||
-rw-r--r-- | usr.bin/sendbug/sendbug.c | 21 | ||||
-rw-r--r-- | usr.sbin/cron/crontab.c | 23 | ||||
-rw-r--r-- | usr.sbin/edquota/edquota.c | 21 |
6 files changed, 57 insertions, 75 deletions
diff --git a/sbin/disklabel/disklabel.c b/sbin/disklabel/disklabel.c index 31a9a30e6b8..9ac8c5e4cd8 100644 --- a/sbin/disklabel/disklabel.c +++ b/sbin/disklabel/disklabel.c @@ -1,4 +1,4 @@ -/* $OpenBSD: disklabel.c,v 1.119 2007/10/15 02:16:35 deraadt Exp $ */ +/* $OpenBSD: disklabel.c,v 1.120 2007/10/17 20:02:30 deraadt Exp $ */ /* * Copyright (c) 1987, 1993 @@ -39,7 +39,7 @@ static const char copyright[] = #endif /* not lint */ #ifndef lint -static const char rcsid[] = "$OpenBSD: disklabel.c,v 1.119 2007/10/15 02:16:35 deraadt Exp $"; +static const char rcsid[] = "$OpenBSD: disklabel.c,v 1.120 2007/10/17 20:02:30 deraadt Exp $"; #endif /* not lint */ #include <sys/param.h> @@ -1192,9 +1192,9 @@ int editit(const char *pathname) { char *argp[] = {"sh", "-c", NULL, NULL}, *ed, *p; - sig_t sighup, sigint, sigquit; + sig_t sighup, sigint, sigquit, sigchld; pid_t pid; - int saved_errno, st; + int saved_errno, st, ret = -1; ed = getenv("VISUAL"); if (ed == NULL || ed[0] == '\0') @@ -1208,6 +1208,7 @@ editit(const char *pathname) sighup = signal(SIGHUP, SIG_IGN); sigint = signal(SIGINT, SIG_IGN); sigquit = signal(SIGQUIT, SIG_IGN); + sigchld = signal(SIGCHLD, SIG_DFL); if ((pid = fork()) == -1) goto fail; if (pid == 0) { @@ -1217,24 +1218,20 @@ editit(const char *pathname) while (waitpid(pid, &st, 0) == -1) if (errno != EINTR) goto fail; - free(p); - (void)signal(SIGHUP, sighup); - (void)signal(SIGINT, sigint); - (void)signal(SIGQUIT, sigquit); - if (!WIFEXITED(st)) { + if (!WIFEXITED(st)) errno = EINTR; - return (-1); - } - return (WEXITSTATUS(st)); + else + ret = WEXITSTATUS(st); fail: saved_errno = errno; (void)signal(SIGHUP, sighup); (void)signal(SIGINT, sigint); (void)signal(SIGQUIT, sigquit); + (void)signal(SIGCHLD, sigchld); free(p); errno = saved_errno; - return (-1); + return (ret); } char * diff --git a/usr.bin/mail/edit.c b/usr.bin/mail/edit.c index 6c6043b61f4..47adbc2b3ed 100644 --- a/usr.bin/mail/edit.c +++ b/usr.bin/mail/edit.c @@ -1,4 +1,4 @@ -/* $OpenBSD: edit.c,v 1.16 2007/09/10 14:29:53 tobias Exp $ */ +/* $OpenBSD: edit.c,v 1.17 2007/10/17 20:02:33 deraadt Exp $ */ /* $NetBSD: edit.c,v 1.5 1996/06/08 19:48:20 christos Exp $ */ /* @@ -34,7 +34,7 @@ #if 0 static const char sccsid[] = "@(#)edit.c 8.1 (Berkeley) 6/6/93"; #else -static const char rcsid[] = "$OpenBSD: edit.c,v 1.16 2007/09/10 14:29:53 tobias Exp $"; +static const char rcsid[] = "$OpenBSD: edit.c,v 1.17 2007/10/17 20:02:33 deraadt Exp $"; #endif #endif /* not lint */ @@ -242,9 +242,9 @@ int editit(const char *ed, const char *pathname) { char *argp[] = {"sh", "-c", NULL, NULL}, *p; - sig_t sighup, sigint, sigquit; + sig_t sighup, sigint, sigquit, sigchld; pid_t pid; - int saved_errno, st; + int saved_errno, st, ret = -1; if (ed == NULL) ed = getenv("VISUAL"); @@ -259,6 +259,7 @@ editit(const char *ed, const char *pathname) sighup = signal(SIGHUP, SIG_IGN); sigint = signal(SIGINT, SIG_IGN); sigquit = signal(SIGQUIT, SIG_IGN); + sigchld = signal(SIGCHLD, SIG_DFL); if ((pid = fork()) == -1) goto fail; if (pid == 0) { @@ -268,22 +269,18 @@ editit(const char *ed, const char *pathname) while (waitpid(pid, &st, 0) == -1) if (errno != EINTR) goto fail; - free(p); - (void)signal(SIGHUP, sighup); - (void)signal(SIGINT, sigint); - (void)signal(SIGQUIT, sigquit); - if (!WIFEXITED(st)) { + if (!WIFEXITED(st)) errno = EINTR; - return (-1); - } - return (WEXITSTATUS(st)); + else + ret = WEXITSTATUS(st); fail: saved_errno = errno; (void)signal(SIGHUP, sighup); (void)signal(SIGINT, sigint); (void)signal(SIGQUIT, sigquit); + (void)signal(SIGCHLD, sigchld); free(p); errno = saved_errno; - return (-1); + return (ret); } diff --git a/usr.bin/sdiff/edit.c b/usr.bin/sdiff/edit.c index ba94a3f84d4..47a222f5a42 100644 --- a/usr.bin/sdiff/edit.c +++ b/usr.bin/sdiff/edit.c @@ -1,4 +1,4 @@ -/* $OpenBSD: edit.c,v 1.17 2007/05/11 02:47:52 ray Exp $ */ +/* $OpenBSD: edit.c,v 1.18 2007/10/17 20:02:33 deraadt Exp $ */ /* * Written by Raymond Lai <ray@cyth.net>. @@ -33,9 +33,9 @@ int editit(const char *pathname) { char *argp[] = {"sh", "-c", NULL, NULL}, *ed, *p; - sig_t sighup, sigint, sigquit; + sig_t sighup, sigint, sigquit, sigchld; pid_t pid; - int saved_errno, st; + int saved_errno, st, ret = -1; ed = getenv("VISUAL"); if (ed == NULL || ed[0] == '\0') @@ -49,6 +49,7 @@ editit(const char *pathname) sighup = signal(SIGHUP, SIG_IGN); sigint = signal(SIGINT, SIG_IGN); sigquit = signal(SIGQUIT, SIG_IGN); + sigchld = signal(SIGCHLD, SIG_DFL); if ((pid = fork()) == -1) goto fail; if (pid == 0) { @@ -58,24 +59,20 @@ editit(const char *pathname) while (waitpid(pid, &st, 0) == -1) if (errno != EINTR) goto fail; - free(p); - (void)signal(SIGHUP, sighup); - (void)signal(SIGINT, sigint); - (void)signal(SIGQUIT, sigquit); - if (!WIFEXITED(st)) { + if (!WIFEXITED(st)) errno = EINTR; - return (-1); - } - return (WEXITSTATUS(st)); + else + ret = WEXITSTATUS(st); fail: saved_errno = errno; (void)signal(SIGHUP, sighup); (void)signal(SIGINT, sigint); (void)signal(SIGQUIT, sigquit); + (void)signal(SIGCHLD, sigchld); free(p); errno = saved_errno; - return (-1); + return (ret); } /* diff --git a/usr.bin/sendbug/sendbug.c b/usr.bin/sendbug/sendbug.c index 8492a5853d0..f03f0400ec9 100644 --- a/usr.bin/sendbug/sendbug.c +++ b/usr.bin/sendbug/sendbug.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sendbug.c,v 1.51 2007/09/18 00:38:58 ray Exp $ */ +/* $OpenBSD: sendbug.c,v 1.52 2007/10/17 20:02:33 deraadt Exp $ */ /* * Written by Ray Lai <ray@cyth.net>. @@ -228,9 +228,9 @@ int editit(const char *pathname) { char *argp[] = {"sh", "-c", NULL, NULL}, *ed, *p; - sig_t sighup, sigint, sigquit; + sig_t sighup, sigint, sigquit, sigchld; pid_t pid; - int saved_errno, st; + int saved_errno, st, ret = -1; ed = getenv("VISUAL"); if (ed == NULL || ed[0] == '\0') @@ -244,6 +244,7 @@ editit(const char *pathname) sighup = signal(SIGHUP, SIG_IGN); sigint = signal(SIGINT, SIG_IGN); sigquit = signal(SIGQUIT, SIG_IGN); + sigchld = signal(SIGCHLD, SIG_DFL); if ((pid = fork()) == -1) goto fail; if (pid == 0) { @@ -253,24 +254,20 @@ editit(const char *pathname) while (waitpid(pid, &st, 0) == -1) if (errno != EINTR) goto fail; - free(p); - (void)signal(SIGHUP, sighup); - (void)signal(SIGINT, sigint); - (void)signal(SIGQUIT, sigquit); - if (!WIFEXITED(st)) { + if (!WIFEXITED(st)) errno = EINTR; - return (-1); - } - return (WEXITSTATUS(st)); + else + ret = WEXITSTATUS(st); fail: saved_errno = errno; (void)signal(SIGHUP, sighup); (void)signal(SIGINT, sigint); (void)signal(SIGQUIT, sigquit); + (void)signal(SIGCHLD, sigchld); free(p); errno = saved_errno; - return (-1); + return (ret); } int diff --git a/usr.sbin/cron/crontab.c b/usr.sbin/cron/crontab.c index c058b16f463..f89b324b739 100644 --- a/usr.sbin/cron/crontab.c +++ b/usr.sbin/cron/crontab.c @@ -1,4 +1,4 @@ -/* $OpenBSD: crontab.c,v 1.53 2007/09/01 02:25:26 ray Exp $ */ +/* $OpenBSD: crontab.c,v 1.54 2007/10/17 20:02:33 deraadt Exp $ */ /* Copyright 1988,1990,1993,1994 by Paul Vixie * All rights reserved @@ -21,7 +21,7 @@ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -static char const rcsid[] = "$OpenBSD: crontab.c,v 1.53 2007/09/01 02:25:26 ray Exp $"; +static char const rcsid[] = "$OpenBSD: crontab.c,v 1.54 2007/10/17 20:02:33 deraadt Exp $"; /* crontab - install and manage per-user crontab files * vix 02may87 [RCS has the rest of the log] @@ -598,9 +598,9 @@ int editit(const char *pathname) { char *argp[] = {"sh", "-c", NULL, NULL}, *ed, *p; - sig_t sighup, sigint, sigquit; + sig_t sighup, sigint, sigquit, sigchld; pid_t pid; - int saved_errno, st; + int saved_errno, st, ret = -1; ed = getenv("VISUAL"); if (ed == NULL || ed[0] == '\0') @@ -614,6 +614,7 @@ editit(const char *pathname) sighup = signal(SIGHUP, SIG_IGN); sigint = signal(SIGINT, SIG_IGN); sigquit = signal(SIGQUIT, SIG_IGN); + sigchld = signal(SIGCHLD, SIG_DFL); if ((pid = fork()) == -1) goto fail; if (pid == 0) { @@ -625,24 +626,20 @@ editit(const char *pathname) while (waitpid(pid, &st, 0) == -1) if (errno != EINTR) goto fail; - free(p); - (void)signal(SIGHUP, sighup); - (void)signal(SIGINT, sigint); - (void)signal(SIGQUIT, sigquit); - if (!WIFEXITED(st)) { + if (!WIFEXITED(st)) errno = EINTR; - return (-1); - } - return (WEXITSTATUS(st)); + else + ret = WEXITSTATUS(st); fail: saved_errno = errno; (void)signal(SIGHUP, sighup); (void)signal(SIGINT, sigint); (void)signal(SIGQUIT, sigquit); + (void)signal(SIGCHLD, sigchld); free(p); errno = saved_errno; - return (-1); + return (ret); } static void diff --git a/usr.sbin/edquota/edquota.c b/usr.sbin/edquota/edquota.c index cb04b0c067a..4b41f31890a 100644 --- a/usr.sbin/edquota/edquota.c +++ b/usr.sbin/edquota/edquota.c @@ -38,7 +38,7 @@ static char copyright[] = #ifndef lint /*static char sccsid[] = "from: @(#)edquota.c 8.1 (Berkeley) 6/6/93";*/ -static char *rcsid = "$Id: edquota.c,v 1.47 2007/08/31 23:14:21 ray Exp $"; +static char *rcsid = "$Id: edquota.c,v 1.48 2007/10/17 20:02:33 deraadt Exp $"; #endif /* not lint */ /* @@ -361,9 +361,9 @@ int editit(const char *pathname) { char *argp[] = {"sh", "-c", NULL, NULL}, *ed, *p; - sig_t sighup, sigint, sigquit; + sig_t sighup, sigint, sigquit, sigchld; pid_t pid; - int saved_errno, st; + int saved_errno, st, ret = -1; ed = getenv("VISUAL"); if (ed == NULL || ed[0] == '\0') @@ -377,6 +377,7 @@ editit(const char *pathname) sighup = signal(SIGHUP, SIG_IGN); sigint = signal(SIGINT, SIG_IGN); sigquit = signal(SIGQUIT, SIG_IGN); + sigchld = signal(SIGCHLD, SIG_DFL); if ((pid = fork()) == -1) goto fail; if (pid == 0) { @@ -386,24 +387,20 @@ editit(const char *pathname) while (waitpid(pid, &st, 0) == -1) if (errno != EINTR) goto fail; - free(p); - (void)signal(SIGHUP, sighup); - (void)signal(SIGINT, sigint); - (void)signal(SIGQUIT, sigquit); - if (!WIFEXITED(st)) { + if (!WIFEXITED(st)) errno = EINTR; - return (-1); - } - return (WEXITSTATUS(st)); + else + ret = WEXITSTATUS(st); fail: saved_errno = errno; (void)signal(SIGHUP, sighup); (void)signal(SIGINT, sigint); (void)signal(SIGQUIT, sigquit); + (void)signal(SIGCHLD, sigchld); free(p); errno = saved_errno; - return (-1); + return (ret); } /* |