aboutsummaryrefslogtreecommitdiff
path: root/test/functional/provider/ruby_spec.lua
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2018-03-20 23:57:41 +0100
committerJustin M. Keyes <justinkz@gmail.com>2018-03-24 11:01:24 +0100
commit189c5abeba4fb508d879ebbf5fa07965c4092cf2 (patch)
tree5b96ee3b3c3e1d73606c19e1e8b8b4a8904b50c0 /test/functional/provider/ruby_spec.lua
parent96273256843ea357d62696ef307d6610ba97334c (diff)
downloadrneovim-189c5abeba4fb508d879ebbf5fa07965c4092cf2.tar.gz
rneovim-189c5abeba4fb508d879ebbf5fa07965c4092cf2.tar.bz2
rneovim-189c5abeba4fb508d879ebbf5fa07965c4092cf2.zip
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
Diffstat (limited to 'test/functional/provider/ruby_spec.lua')
-rw-r--r--test/functional/provider/ruby_spec.lua22
1 files changed, 16 insertions, 6 deletions
diff --git a/test/functional/provider/ruby_spec.lua b/test/functional/provider/ruby_spec.lua
index a2c6c6a10e..e049ac7c41 100644
--- a/test/functional/provider/ruby_spec.lua
+++ b/test/functional/provider/ruby_spec.lua
@@ -1,16 +1,18 @@
local helpers = require('test.functional.helpers')(after_each)
+local clear = helpers.clear
+local command = helpers.command
+local curbufmeths = helpers.curbufmeths
local eq = helpers.eq
+local eval = helpers.eval
+local expect = helpers.expect
local feed = helpers.feed
-local clear = helpers.clear
+local feed_command = helpers.feed_command
local funcs = helpers.funcs
-local meths = helpers.meths
local insert = helpers.insert
-local expect = helpers.expect
-local command = helpers.command
-local write_file = helpers.write_file
-local curbufmeths = helpers.curbufmeths
+local meths = helpers.meths
local missing_provider = helpers.missing_provider
+local write_file = helpers.write_file
do
clear()
@@ -90,3 +92,11 @@ describe(':rubydo command', function()
eq(false, curbufmeths.get_option('modified'))
end)
end)
+
+describe('ruby provider', function()
+ it('RPC call to expand("<afile>") during BufDelete #5245 #5617', function()
+ command([=[autocmd BufDelete * ruby VIM::evaluate('expand("<afile>")')]=])
+ feed_command('help help')
+ eq(2, eval('1+1')) -- Still alive?
+ end)
+end)