When TTY disappears and there is at least one fd watcher, raw_getbyte() can
enter an infinite loop where it keeps calling poll() over and over again.
To reproduce, open a terminal, start zsh and type this:
rm -f /tmp/fifo
mkfifo /tmp/fifo
exec 3<>/tmp/fifo
do-nothing() {}
zle -F 3 do-nothing
Then make TTY disappear. For example, kill the parent with `kill -9 $PPID`
and close the terminal window if it's still there. Observe that zsh is
consiming 100% CPU. Note that do-nothing() never gets called.
This patch makes the poll() loop in raw_getbyte() terminate when TTY is
signalling POLLHUP. This makes the behavior consistent with the case where
TTY disappears while no fd watchers are installed.
This causes problems with failed ZLE reads that printed a message
in the display area, in particular ignoreEOF warnings.
It appears it's not needed for the overall effect of the fixes in
zsh-workers/40302, commit 34656ec2.
For read -k and read -q where we use ZLE, we just want a single
key and not full ZLE processing. So don't handle timed
ZLE functions when preforming the read.
Back off previous fix as this only covered some subset of problems.
Remaining problems happend after reset-prompt in TRAPINT.
One was in complist and is fixed by not attempting to list after
an error or interrupt.
The other was owing to not resetting clearflag when ZLE
was re-entered.
Save previous vi change and throw away a new change that fails.
Add zle -f vichange to allow shell widget to be a single change.
Fix repeat of command where numeric arguments were multiplied.
Do not free global pointers until after promptexpand() in case they are
referenced from signal handlers, and check for window size changes during
promptexpand().
Combination of 12 commits from interrupt_abort branch.
Basic strategy is to introduce bits to errflag and to set and
reset them separately.
Remove interrupt status on return to main keymap.
Turn off ERRFLAG_INT for always block.
Restore bit thereafter: we probably need a new variable in order
to allow user interrupts to be reset in the always block.
Add TRY_BLOCK_INTERRUPT
This works the same as TRY_BLOCK_ERROR, but for a SIGINT, too.
Ensure propagation of SIGINT from exited job.
If received by foreground job, shell uses ERRFLAG_INT, not
ERRFLAG_ERROR, to set the new state.
Reset errflag before precmd()
Add always block in _main_completion to fix ZLS_COLORS
Ensures we get the right state of $ZLS_COLORS at the end of _main_complete
even if there's an interrupt. However, the "right state" is a bit messy
as it depends on styles.