diff options
author | deraadt <deraadt@openbsd.org> | 2007-10-17 20:02:30 +0000 |
---|---|---|
committer | deraadt <deraadt@openbsd.org> | 2007-10-17 20:02:30 +0000 |
commit | 43316b18ff37b0feff819091438b5aac1a5cb031 (patch) | |
tree | a15045cfac31930f72ed094e2328423378c04f67 /usr.sbin/cron/crontab.c | |
parent | Convert MALLOC/FREE to malloc/free. (diff) | |
download | wireguard-openbsd-43316b18ff37b0feff819091438b5aac1a5cb031.tar.xz wireguard-openbsd-43316b18ff37b0feff819091438b5aac1a5cb031.zip |
- 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
Diffstat (limited to 'usr.sbin/cron/crontab.c')
-rw-r--r-- | usr.sbin/cron/crontab.c | 23 |
1 files changed, 10 insertions, 13 deletions
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 |