summaryrefslogtreecommitdiffstats
path: root/bin
diff options
context:
space:
mode:
authorjilles <jilles@FreeBSD.org>2015-01-31 13:53:29 +0000
committerjilles <jilles@FreeBSD.org>2015-01-31 13:53:29 +0000
commit1442547d3bc256ea7676cfed7b77b2625432ace1 (patch)
tree1ae2467f1dbef8f92f69923384279e78438bc059 /bin
parent1ccf1fa71bd2dd8de883671e64b8d7b47359cf1f (diff)
downloadFreeBSD-src-1442547d3bc256ea7676cfed7b77b2625432ace1.zip
FreeBSD-src-1442547d3bc256ea7676cfed7b77b2625432ace1.tar.gz
sh: Abort a wait builtin on any trapped signal.
This is required by POSIX. PR: 197210 Reported by: ache MFC after: 2 weeks
Diffstat (limited to 'bin')
-rw-r--r--bin/sh/jobs.c8
-rw-r--r--bin/sh/trap.c3
2 files changed, 6 insertions, 5 deletions
diff --git a/bin/sh/jobs.c b/bin/sh/jobs.c
index 765e6a2..b1bfa09 100644
--- a/bin/sh/jobs.c
+++ b/bin/sh/jobs.c
@@ -87,8 +87,8 @@ static int ttyfd = -1;
/* mode flags for dowait */
#define DOWAIT_BLOCK 0x1 /* wait until a child exits */
-#define DOWAIT_SIG 0x2 /* if DOWAIT_BLOCK, abort on SIGINT/SIGQUIT */
-#define DOWAIT_SIG_ANY 0x4 /* if DOWAIT_SIG, abort on any signal */
+#define DOWAIT_SIG 0x2 /* if DOWAIT_BLOCK, abort on signal */
+#define DOWAIT_SIG_TRAP 0x4 /* if DOWAIT_SIG, abort on trapped signal only */
#if JOBS
static void restartjob(struct job *);
@@ -1028,7 +1028,7 @@ waitforjob(struct job *jp, int *origstatus)
TRACE(("waitforjob(%%%td) called\n", jp - jobtab + 1));
while (jp->state == 0)
if (dowait(DOWAIT_BLOCK | (Tflag ? DOWAIT_SIG |
- DOWAIT_SIG_ANY : 0), jp) == -1)
+ DOWAIT_SIG_TRAP : 0), jp) == -1)
dotrap();
#if JOBS
if (jp->jobctl) {
@@ -1120,7 +1120,7 @@ dowait(int mode, struct job *job)
TRACE(("wait returns %d, status=%d\n", (int)pid, status));
if (pid == 0 && (mode & DOWAIT_SIG) != 0) {
pid = -1;
- if (((mode & DOWAIT_SIG_ANY) != 0 ?
+ if (((mode & DOWAIT_SIG_TRAP) != 0 ?
pendingsig : pendingsig_waitcmd) != 0) {
errno = EINTR;
break;
diff --git a/bin/sh/trap.c b/bin/sh/trap.c
index c23e6bc..4a185b4 100644
--- a/bin/sh/trap.c
+++ b/bin/sh/trap.c
@@ -74,7 +74,7 @@ __FBSDID("$FreeBSD$");
static char sigmode[NSIG]; /* current value of signal */
volatile sig_atomic_t pendingsig; /* indicates some signal received */
-volatile sig_atomic_t pendingsig_waitcmd; /* indicates SIGINT/SIGQUIT received */
+volatile sig_atomic_t pendingsig_waitcmd; /* indicates wait builtin should be interrupted */
static int in_dotrap; /* do we execute in a trap handler? */
static char *volatile trap[NSIG]; /* trap handler commands */
static volatile sig_atomic_t gotsig[NSIG];
@@ -400,6 +400,7 @@ onsig(int signo)
(signo != SIGCHLD || !ignore_sigchld)) {
gotsig[signo] = 1;
pendingsig = signo;
+ pendingsig_waitcmd = signo;
}
}
OpenPOWER on IntegriCloud