provider/RPC: apply_autocmds_group(): fix double-free
During provider dispatch, eval_call_provider() saves global state--including pointers, such as `autocmd_fname`--into `provider_caller_scope` which is later restored by f_rpcrequest(). But `autocmd_fname` is special-cased in eval_vars(), for performance (see Vim patch 7.2.021; this is also the singular purpose of the `autocmd_fname_full` global. Yay!) If eval_vars() frees `autocmd_fname` then its provider-RPC-scoped alias becomes a problem. Solution: Don't free autocmd_fname in eval_vars(), just copy into it. closes #5245 closes #5617 Reference ------------------------------------------------------------------------ Vim patch 7.2.021 https://github.com/vim/vim/commit/f6dad43c98f47da1ff9d8c99b320fc3674f83c63 Problem: When executing autocommands getting the full file name may be slow. (David Kotchan) Solution: Postpone calling FullName_save() until autocmd_fname is used. vim_dev discussion (2008): "Problem with CursorMoved AutoCommand when Editing Files on a Remote WIndows Share" https://groups.google.com/d/msg/vim_dev/kj95weZa_eE/GTgj4aq5sIgJ
This commit is contained in:
1 parent
9627325684
commit
189c5abeba
5 files changed
+49
-19
No files matched your search
@@ -3,6 +3,7 @@ local eval, command, feed = helpers.eval, helpers.command, helpers.feed
|
||||
local eq, clear, insert = helpers.eq, helpers.clear, helpers.insert
|
||||
local expect, write_file = helpers.expect, helpers.write_file
|
||||
local feed_command = helpers.feed_command
|
||||
local source = helpers.source
|
||||
local missing_provider = helpers.missing_provider
|
||||
|
||||
do
|
||||
@@ -13,7 +14,7 @@ do
|
||||
end
|
||||
end
|
||||
|
||||
describe('python3 commands and functions', function()
|
||||
describe('python3 provider', function()
|
||||
before_each(function()
|
||||
clear()
|
||||
command('python3 import vim')
|
||||
@@ -82,4 +83,20 @@ describe('python3 commands and functions', function()
|
||||
it('py3eval', function()
|
||||
eq({1, 2, {['key'] = 'val'}}, eval([[py3eval('[1, 2, {"key": "val"}]')]]))
|
||||
end)
|
||||
|
||||
it('RPC call to expand("<afile>") during BufDelete #5245 #5617', function()
|
||||
source([=[
|
||||
python3 << EOF
|
||||
import vim
|
||||
def foo():
|
||||
vim.eval('expand("<afile>:p")')
|
||||
vim.eval('bufnr(expand("<afile>:p"))')
|
||||
EOF
|
||||
autocmd BufDelete * python3 foo()
|
||||
autocmd BufUnload * python3 foo()]=])
|
||||
feed_command("exe 'split' tempname()")
|
||||
feed_command("bwipeout!")
|
||||
feed_command('help help')
|
||||
eq(2, eval('1+1')) -- Still alive?
|
||||
end)
|
||||
end)
|
||||
Reference in new issue
Block a user