summaryrefslogtreecommitdiff
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
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
-rw-r--r--sbin/disklabel/disklabel.c23
-rw-r--r--usr.bin/mail/edit.c23
-rw-r--r--usr.bin/sdiff/edit.c21
-rw-r--r--usr.bin/sendbug/sendbug.c21
-rw-r--r--usr.sbin/cron/crontab.c23
-rw-r--r--usr.sbin/edquota/edquota.c21
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);
}
/*