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:
parent
ff557d3a61
commit
584bccb74d
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user