Fix: interrupting confirm() called in timer causes vim hang #1791
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
repro steps
test-environments:
test.vim
vim -Nu NONE -S test.vim
and input Ctrl-C to interrupt
confirm()
, then vim will hang.Note:
input()
also instead ofconfirm()
.cause
preconditions:
confirm()
andfeedkeys()
are called from timer fired in waiting for input (not indo_sleep()
)confirm()
isn't enclosed bytry
(i.e. exception isn't caught inside timer callback)feedkeys()
in timer setstypebuf_was_filled
to TRUE, sotypebuf_changed()
returns TRUE,but Ctrl-C flushes all input buffer and
typebuf_was_filled
is kept to TRUE, thus cannot exit from this loop: https://github.com/vim/vim/tree/06f1ed2f78c5c03af95054fc3a8665df39dec362/src/getchar.c#L2029proposal of fix
typebuf_was_filled
to FALSE inflush_buffers()
(but but I'm not sure there is no side influence by this change...)
Ozaki Kiichi