diff options
author | jilles <jilles@FreeBSD.org> | 2016-03-28 18:58:40 +0000 |
---|---|---|
committer | jilles <jilles@FreeBSD.org> | 2016-03-28 18:58:40 +0000 |
commit | a90ad707c5487d6270fc478806ed335203056526 (patch) | |
tree | 11c5a13a8b14c23575e92ba15e8d7ebe8561772f /bin/sh/trap.c | |
parent | 2d884a83b2752861330ec6b2172e81b6c478fd17 (diff) | |
download | FreeBSD-src-a90ad707c5487d6270fc478806ed335203056526.zip FreeBSD-src-a90ad707c5487d6270fc478806ed335203056526.tar.gz |
sh: Fix use-after-free if a trap replaces itself.
MFC after: 1 week
Diffstat (limited to 'bin/sh/trap.c')
-rw-r--r-- | bin/sh/trap.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/bin/sh/trap.c b/bin/sh/trap.c index f562e27..8bfebc1 100644 --- a/bin/sh/trap.c +++ b/bin/sh/trap.c @@ -412,6 +412,7 @@ onsig(int signo) void dotrap(void) { + struct stackmark smark; int i; int savestatus, prev_evalskip, prev_skipcount; @@ -445,7 +446,9 @@ dotrap(void) last_trapsig = i; savestatus = exitstatus; - evalstring(trap[i], 0); + setstackmark(&smark); + evalstring(stsavestr(trap[i]), 0); + popstackmark(&smark); /* * If such a command was not |