summaryrefslogtreecommitdiffstats
path: root/bin/sh/histedit.c
diff options
context:
space:
mode:
authorjilles <jilles@FreeBSD.org>2010-12-29 19:39:51 +0000
committerjilles <jilles@FreeBSD.org>2010-12-29 19:39:51 +0000
commit584bccb74d788b3fd416e36c489ca3f6499a17b1 (patch)
tree93e2d7c41af242babeaa67308c0feb83a7029db4 /bin/sh/histedit.c
parentff557d3a614f902f360826bd8074e40e3dc3385e (diff)
downloadFreeBSD-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/sh/histedit.c')
-rw-r--r--bin/sh/histedit.c3
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;
}
OpenPOWER on IntegriCloud