neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit e5a424d78ed72613dd5ccc161578f9f6f853a0e8
parent aa62579a684277d86b1f4a7588464e0ec4227b94
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Sun, 15 Oct 2023 17:02:17 +0800

vim-patch:9.0.2030: no max callback recursion limit (#25655)

Problem:  no max callback recursion limit
Solution: bail out, if max call recursion for callback functions
          has been reached.

This checks the 'maxfuncdepth' setting and throws E169 when a callback
function recursively calls itself.

closes: vim/vim#13337
closes: vim/vim#13339

https://github.com/vim/vim/commit/47510f3d6598a1218958c03ed11337a43b73f48d

Co-authored-by: Christian Brabandt <cb@256bit.org>
Diffstat:
Mruntime/doc/options.txt | 1+
Mruntime/lua/vim/_meta/options.lua | 1+
Msrc/nvim/eval.c | 5+++++
Msrc/nvim/options.lua | 1+
4 files changed, 8 insertions(+), 0 deletions(-)

diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt @@ -4024,6 +4024,7 @@ A jump table for the options with a short description can be found at |Q_op|. Increasing this limit above 200 also changes the maximum for Ex command recursion, see |E169|. See also |:function|. + Also used for maximum depth of callback functions. *'maxmapdepth'* *'mmd'* *E223* 'maxmapdepth' 'mmd' number (default 1000) diff --git a/runtime/lua/vim/_meta/options.lua b/runtime/lua/vim/_meta/options.lua @@ -4035,6 +4035,7 @@ vim.go.mat = vim.go.matchtime --- Increasing this limit above 200 also changes the maximum for Ex --- command recursion, see `E169`. --- See also `:function`. +--- Also used for maximum depth of callback functions. --- --- @type integer vim.o.maxfuncdepth = 100 diff --git a/src/nvim/eval.c b/src/nvim/eval.c @@ -6064,6 +6064,11 @@ bool callback_call(Callback *const callback, const int argcount_in, typval_T *co typval_T *const rettv) FUNC_ATTR_NONNULL_ALL { + if (callback_depth > p_mfd) { + emsg(_(e_command_too_recursive)); + return false; + } + partial_T *partial; char *name; Array args = ARRAY_DICT_INIT; diff --git a/src/nvim/options.lua b/src/nvim/options.lua @@ -5154,6 +5154,7 @@ return { Increasing this limit above 200 also changes the maximum for Ex command recursion, see |E169|. See also |:function|. + Also used for maximum depth of callback functions. ]=], full_name = 'maxfuncdepth', scope = { 'global' },