diff options
author | jilles <jilles@FreeBSD.org> | 2010-12-29 19:39:51 +0000 |
---|---|---|
committer | jilles <jilles@FreeBSD.org> | 2010-12-29 19:39:51 +0000 |
commit | 584bccb74d788b3fd416e36c489ca3f6499a17b1 (patch) | |
tree | 93e2d7c41af242babeaa67308c0feb83a7029db4 /bin | |
parent | ff557d3a614f902f360826bd8074e40e3dc3385e (diff) | |
download | FreeBSD-src-584bccb74d788b3fd416e36c489ca3f6499a17b1.zip FreeBSD-src-584bccb74d788b3fd416e36c489ca3f6499a17b1.tar.gz |
sh: Properly restore exception handler in fc.
If SIGINT arrived at exactly the right moment (unlikely), an exception
handler in a no longer active stack frame would be called.
Because the old handler was not used in the normal path, clang thought it
was a dead value and if an exception happened it would longjmp() to garbage.
This caused builtins/fc1.0 to fail if histedit.c was compiled with clang.
MFC after: 1 week
Diffstat (limited to 'bin')
-rw-r--r-- | bin/sh/histedit.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/bin/sh/histedit.c b/bin/sh/histedit.c index 26d46a8..7ebe5d8 100644 --- a/bin/sh/histedit.c +++ b/bin/sh/histedit.c @@ -232,6 +232,7 @@ histcmd(int argc, char **argv) } argc -= optind, argv += optind; + savehandler = handler; /* * If executing... */ @@ -242,7 +243,6 @@ histcmd(int argc, char **argv) * Catch interrupts to reset active counter and * cleanup temp files. */ - savehandler = handler; if (setjmp(jmploc.loc)) { active = 0; if (editfile) @@ -399,6 +399,7 @@ histcmd(int argc, char **argv) --active; if (displayhist) displayhist = 0; + handler = savehandler; return 0; } |