summaryrefslogtreecommitdiff
path: root/usr.sbin/cron/crontab.c
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>2007-10-17 20:02:34 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>2007-10-17 20:02:34 +0000
commit4f4368721b2619584d945f74ab23327bad6ac500 (patch)
treeabab3b0ecf47032e485040088bd55f21f3952f39 /usr.sbin/cron/crontab.c
parent1d02ffd46168ad7485a450e43575363fbaa7dca7 (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
Diffstat (limited to 'usr.sbin/cron/crontab.c')
-rw-r--r--usr.sbin/cron/crontab.c23
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