svn commit: r277973 - head/bin/sh
Jilles Tjoelker
jilles at FreeBSD.org
Sat Jan 31 13:53:31 UTC 2015
Author: jilles
Date: Sat Jan 31 13:53:29 2015
New Revision: 277973
URL: https://svnweb.freebsd.org/changeset/base/277973
Log:
sh: Abort a wait builtin on any trapped signal.
This is required by POSIX.
PR: 197210
Reported by: ache
MFC after: 2 weeks
Modified:
head/bin/sh/jobs.c
head/bin/sh/trap.c
Modified: head/bin/sh/jobs.c
==============================================================================
--- head/bin/sh/jobs.c Sat Jan 31 12:58:04 2015 (r277972)
+++ head/bin/sh/jobs.c Sat Jan 31 13:53:29 2015 (r277973)
@@ -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 *origstat
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;
Modified: head/bin/sh/trap.c
==============================================================================
--- head/bin/sh/trap.c Sat Jan 31 12:58:04 2015 (r277972)
+++ head/bin/sh/trap.c Sat Jan 31 13:53:29 2015 (r277973)
@@ -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;
}
}
More information about the svn-src-head
mailing list