ash: fix signal5.tests
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 17 May 2010 02:42:40 +0000 (04:42 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 17 May 2010 02:42:40 +0000 (04:42 +0200)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash.c
shell/ash_test/ash-signals/signal5.tests

index ec5e0b8c7400a659f89f81d366a4241c0456de50..ef22da1b68021d88057efc79bfa3812a5fe9bdec 100644 (file)
@@ -3874,9 +3874,9 @@ dowait(int wait_flags, struct job *job)
 }
 
 static int
-blocking_wait_with_raise_on_sig(struct job *job)
+blocking_wait_with_raise_on_sig(void)
 {
-       pid_t pid = dowait(DOWAIT_BLOCK, job);
+       pid_t pid = dowait(DOWAIT_BLOCK, NULL);
        if (pid <= 0 && pending_sig)
                raise_exception(EXSIG);
        return pid;
@@ -4069,14 +4069,21 @@ waitcmd(int argc UNUSED_PARAM, char **argv)
                                jp->waited = 1;
                                jp = jp->prev_job;
                        }
+                       blocking_wait_with_raise_on_sig();
        /* man bash:
         * "When bash is waiting for an asynchronous command via
         * the wait builtin, the reception of a signal for which a trap
         * has been set will cause the wait builtin to return immediately
         * with an exit status greater than 128, immediately after which
         * the trap is executed."
-        * Do we do it that way? */
-                       blocking_wait_with_raise_on_sig(NULL);
+        *
+        * blocking_wait_with_raise_on_sig raises signal handlers
+        * if it gets no pid (pid < 0). However,
+        * if child sends us a signal *and immediately exits*,
+        * blocking_wait_with_raise_on_sig gets pid > 0
+        * and does not handle pending_sig. Check this case: */
+                       if (pending_sig)
+                               raise_exception(EXSIG);
                }
        }
 
@@ -4096,7 +4103,7 @@ waitcmd(int argc UNUSED_PARAM, char **argv)
                        job = getjob(*argv, 0);
                /* loop until process terminated or stopped */
                while (job->state == JOBRUNNING)
-                       blocking_wait_with_raise_on_sig(NULL);
+                       blocking_wait_with_raise_on_sig();
                job->waited = 1;
                retval = getstatus(job);
  repeat: ;
index b75b14917c2e41835800c52a06f445382729a059..5003180f71b1119811a2c354ce11c7f840980e07 100755 (executable)
@@ -1,4 +1,3 @@
-# Not fixed yet
 trap "echo USR1 received" USR1
 stub() {
     echo "sleeping for $1 sec"