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
This commit is contained in:
jilles 2010-12-29 19:39:51 +00:00
parent ff557d3a61
commit 584bccb74d

View File

@ -232,6 +232,7 @@ histcmd(int argc, char **argv)
} }
argc -= optind, argv += optind; argc -= optind, argv += optind;
savehandler = handler;
/* /*
* If executing... * If executing...
*/ */
@ -242,7 +243,6 @@ histcmd(int argc, char **argv)
* Catch interrupts to reset active counter and * Catch interrupts to reset active counter and
* cleanup temp files. * cleanup temp files.
*/ */
savehandler = handler;
if (setjmp(jmploc.loc)) { if (setjmp(jmploc.loc)) {
active = 0; active = 0;
if (editfile) if (editfile)
@ -399,6 +399,7 @@ histcmd(int argc, char **argv)
--active; --active;
if (displayhist) if (displayhist)
displayhist = 0; displayhist = 0;
handler = savehandler;
return 0; return 0;
} }