diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 8b47d4b461..a03c4902ae 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -4897,6 +4897,9 @@ A jump table for the options with a short description can be found at |Q_op|. |lambda| or a |Funcref|. See |option-value-function| for more information. + It is not allowed to change text or jump to another window while + evaluating 'qftf' |textlock|. + This option cannot be set from a |modeline| or in the |sandbox|, for security reasons. diff --git a/runtime/lua/vim/_meta/options.lua b/runtime/lua/vim/_meta/options.lua index bed8a7a7ee..8c771c265d 100644 --- a/runtime/lua/vim/_meta/options.lua +++ b/runtime/lua/vim/_meta/options.lua @@ -5115,6 +5115,9 @@ vim.go.pyx = vim.go.pyxversion --- `lambda` or a `Funcref`. See `option-value-function` for more --- information. --- +--- It is not allowed to change text or jump to another window while +--- evaluating 'qftf' `textlock`. +--- --- This option cannot be set from a `modeline` or in the `sandbox`, for --- security reasons. --- diff --git a/src/nvim/options.lua b/src/nvim/options.lua index 8510dccdd2..028905953f 100644 --- a/src/nvim/options.lua +++ b/src/nvim/options.lua @@ -6729,6 +6729,9 @@ local options = { |lambda| or a |Funcref|. See |option-value-function| for more information. + It is not allowed to change text or jump to another window while + evaluating 'qftf' |textlock|. + This option cannot be set from a |modeline| or in the |sandbox|, for security reasons. ]=], diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c index 03487b3636..84a8e26bf9 100644 --- a/src/nvim/quickfix.c +++ b/src/nvim/quickfix.c @@ -4327,6 +4327,7 @@ static list_T *call_qftf_func(qf_list_T *qfl, int qf_winid, int start_idx, int e args[0].v_type = VAR_DICT; args[0].vval.v_dict = dict; + textlock++; if (callback_call(cb, 1, args, &rettv)) { if (rettv.v_type == VAR_LIST) { qftf_list = rettv.vval.v_list; @@ -4334,6 +4335,7 @@ static list_T *call_qftf_func(qf_list_T *qfl, int qf_winid, int start_idx, int e } tv_clear(&rettv); } + textlock--; tv_dict_unref(dict); } diff --git a/test/old/testdir/test_quickfix.vim b/test/old/testdir/test_quickfix.vim index fd134b8548..7470e7d8ff 100644 --- a/test/old/testdir/test_quickfix.vim +++ b/test/old/testdir/test_quickfix.vim @@ -6991,4 +6991,27 @@ func Test_quickfix_restore_current_win() bw! Xb endfunc +func Test_quickfixtextfunc_wipes_buffer() + let g:crash="" + new + fu QFexpr(dummy) + bw + endfu + try + set quickfixtextfunc=QFexpr + lad "['0:4:e']" + lw + catch /^Vim\%((\S\+)\)\=:E565:/ + let g:crash='caught' + endtry + " close location list window + bw + delfunc QFexpr + set quickfixtextfunc= + call assert_equal('caught', g:crash) + unlet g:crash + " close the newly opened window + bw +endfunc + " vim: shiftwidth=2 sts=2 expandtab