[TRAP] Make sure evalskip is zero before running traps

As it is if dotrap is called with evalskip set to a nonzero value,
it'll try to execute any set traps.  The result is that the first
command in the first set trap will be executed while the rest of
the trap will be silently ignored due to evalskip.  This is highly
counterintuitive, even though both bash and ksh exhibit a similar
behaviour.

This patch fixes it by skipping trap processing if evalskip is set
on entry.  It also adds a dotrap call to the top of evaltree to
ensure that

	while continue; do
		continue;
	done

has a chance of running traps.

Finally the pendingsigs check is moved into dotrap for compactness.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
diff --git a/ChangeLog b/ChangeLog
index a56fc5e..81aba60 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,7 @@
 2014-10-02  Herbert Xu <herbert@gondor.apana.org.au>
 
 	* Fix use-after-free in dotrap/evalstring.
+	* Make sure evalskip is zero before running traps.
 
 2014-09-29  Herbert Xu <herbert@gondor.apana.org.au>
 
diff --git a/src/eval.c b/src/eval.c
index 3cfa1e5..7f06931 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -197,6 +197,9 @@
 		TRACE(("evaltree(NULL) called\n"));
 		goto out;
 	}
+
+	dotrap();
+
 #ifndef SMALL
 	displayhist = 1;	/* show history substitutions done with fc */
 #endif
@@ -308,8 +311,7 @@
 	if (checkexit & exitstatus)
 		goto exexit;
 
-	if (pendingsigs)
-		dotrap();
+	dotrap();
 
 	if (flags & EV_EXIT) {
 exexit:
diff --git a/src/trap.c b/src/trap.c
index 17316c9..e34e0f8 100644
--- a/src/trap.c
+++ b/src/trap.c
@@ -316,6 +316,9 @@
 	int i;
 	int savestatus;
 
+	if (!pendingsigs)
+		return;
+
 	savestatus = exitstatus;
 	pendingsigs = 0;
 	barrier();
@@ -323,6 +326,12 @@
 	for (i = 0, q = gotsig; i < NSIG - 1; i++, q++) {
 		if (!*q)
 			continue;
+
+		if (evalskip) {
+			pendingsigs = i + 1;
+			break;
+		}
+
 		*q = 0;
 
 		p = trap[i + 1];
@@ -330,8 +339,6 @@
 			continue;
 		evalstring(p, 0);
 		exitstatus = savestatus;
-		if (evalskip)
-			break;
 	}
 }