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;
        }
 }
 
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to