ash: slightly better (more correct) code for "trap hack"
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 25 Sep 2009 00:12:27 +0000 (02:12 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 25 Sep 2009 00:12:27 +0000 (02:12 +0200)
function                                             old     new   delta
changepath                                           194     195      +1
evalvar                                             1373    1371      -2
forkchild                                            602     590     -12

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash.c

index b30dc77286a42ae787240c602b578c8564cc12ce..37bdc701a5490adfff1dc1821db26d9987dc0b21 100644 (file)
@@ -4526,7 +4526,9 @@ clear_traps(void)
        for (tp = trap; tp < &trap[NSIG]; tp++) {
                if (*tp && **tp) {      /* trap not NULL or "" (SIG_IGN) */
                        INT_OFF;
-                       free(*tp);
+                       if (trap_ptr == trap)
+                               free(*tp);
+                       /* else: it "belongs" to trap_ptr vector, don't free */
                        *tp = NULL;
                        if ((tp - trap) != 0)
                                setsignal(tp - trap);
@@ -4602,10 +4604,8 @@ forkchild(struct job *jp, union node *n, int mode)
                /* This is needed to prevent EXIT trap firing and such
                 * (trap_ptr will be freed in trapcmd()) */
                trap_ptr = memcpy(xmalloc(sizeof(trap)), trap, sizeof(trap));
-               memset(trap, 0, sizeof(trap));
-       } else {
-               clear_traps();
        }
+       clear_traps();
 #if JOBS
        /* do job control only in root shell */
        doing_jobctl = 0;