sh: Do not ignore INTOFF during a trap

INTOFF postpones SIGINT processing and INTON enables it again. This is
important so an interactive shell can return to the top level prompt when
Ctrl+C is pressed.

Given that INTON is automatically done when a builtin completes, the part
where onsig() ignores suppressint when in_dotrap is true is both unnecessary
and unsafe. If the trap is for some other signal than SIGINT, arbitrary code
could have been interrupted.

Historically, INTOFF remained in effect for longer.

Reviewed by:	bdrewery
MFC after:	2 weeks
Differential Revision:	https://reviews.freebsd.org/D25270
This commit is contained in:
Jilles Tjoelker 2020-07-09 20:53:56 +00:00
parent fe59cb6ba2
commit bd11190091

View File

@ -382,12 +382,7 @@ onsig(int signo)
{
if (signo == SIGINT && trap[SIGINT] == NULL) {
/*
* The !in_dotrap here is safe. The only way we can arrive
* here with in_dotrap set is that a trap handler set SIGINT to
* SIG_DFL and killed itself.
*/
if (suppressint && !in_dotrap)
if (suppressint)
SET_PENDING_INT;
else
onint();