diff options
author | ZyX <kp-pav@yandex.ru> | 2016-09-05 10:16:56 +0300 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2016-09-04 21:45:48 -0400 |
commit | 6127eaef0534d1ff5b96b8ed15854b4bedf8e9b4 (patch) | |
tree | d0fde734dac4ec478db6aa0e04b682aa16d89634 | |
parent | cd321b7d0fb161b77cd7b25da7f9a4721cfb0110 (diff) | |
download | rneovim-6127eaef0534d1ff5b96b8ed15854b4bedf8e9b4.tar.gz rneovim-6127eaef0534d1ff5b96b8ed15854b4bedf8e9b4.tar.bz2 rneovim-6127eaef0534d1ff5b96b8ed15854b4bedf8e9b4.zip |
shada: Fix non-writeable ShaDa directory handling
Before this change,
nvim -i /etc/shada
segfaults on exit if the file does not exist and user does not have
permissions to create the file at /etc/shada.
Closes #5296
Reported in #5277
https://github.com/neovim/neovim/issues/5277#issuecomment-243937255
-rw-r--r-- | src/nvim/shada.c | 2 | ||||
-rw-r--r-- | test/functional/shada/helpers.lua | 8 | ||||
-rw-r--r-- | test/functional/shada/shada_spec.lua | 19 |
3 files changed, 24 insertions, 5 deletions
diff --git a/src/nvim/shada.c b/src/nvim/shada.c index fe62f06e59..d2d0d503b9 100644 --- a/src/nvim/shada.c +++ b/src/nvim/shada.c @@ -2976,7 +2976,7 @@ shada_write_file_nomerge: {} if (sd_writer.cookie == NULL) { xfree(fname); xfree(tempname); - if (sd_reader.close != NULL) { + if (sd_reader.cookie != NULL) { sd_reader.close(&sd_reader); } return FAIL; diff --git a/test/functional/shada/helpers.lua b/test/functional/shada/helpers.lua index cde555f0a7..8e2c0cc1f6 100644 --- a/test/functional/shada/helpers.lua +++ b/test/functional/shada/helpers.lua @@ -8,8 +8,8 @@ local mpack = require('mpack') local tmpname = helpers.tmpname() local additional_cmd = '' -local function nvim_argv() - local argv = {nvim_prog, '-u', 'NONE', '-i', tmpname, '-N', +local function nvim_argv(shada_file) + local argv = {nvim_prog, '-u', 'NONE', '-i', shada_file or tmpname, '-N', '--cmd', 'set shortmess+=I background=light noswapfile', '--cmd', additional_cmd, '--embed'} @@ -20,8 +20,8 @@ local function nvim_argv() end end -local reset = function() - set_session(spawn(nvim_argv())) +local reset = function(shada_file) + set_session(spawn(nvim_argv(shada_file))) meths.set_var('tmpname', tmpname) end diff --git a/test/functional/shada/shada_spec.lua b/test/functional/shada/shada_spec.lua index f6f3a8f826..f845f6f93b 100644 --- a/test/functional/shada/shada_spec.lua +++ b/test/functional/shada/shada_spec.lua @@ -5,6 +5,7 @@ local meths, nvim_command, funcs, eq = local write_file, spawn, set_session, nvim_prog, exc_exec = helpers.write_file, helpers.spawn, helpers.set_session, helpers.nvim_prog, helpers.exc_exec + local lfs = require('lfs') local paths = require('test.config.paths') @@ -14,10 +15,14 @@ local shada_helpers = require('test.functional.shada.helpers') local reset, clear, get_shada_rw = shada_helpers.reset, shada_helpers.clear, shada_helpers.get_shada_rw local read_shada_file = shada_helpers.read_shada_file +local set_additional_cmd = shada_helpers.set_additional_cmd local wshada, _, shada_fname, clean = get_shada_rw('Xtest-functional-shada-shada.shada') +local dirname = 'Xtest-functional-shada-shada.d' +local dirshada = dirname .. '/main.shada' + if helpers.pending_win32(pending) then return end describe('ShaDa support code', function() @@ -25,6 +30,7 @@ describe('ShaDa support code', function() after_each(function() clear() clean() + lfs.rmdir(dirname) end) it('preserves `s` item size limit with unknown entries', function() @@ -232,4 +238,17 @@ describe('ShaDa support code', function() eq('', meths.get_option('viminfo')) eq('', meths.get_option('shada')) end) + + it('does not crash when ShaDa file directory is not writable', function() + funcs.mkdir(dirname, '', 0) + eq(0, funcs.filewritable(dirname)) + set_additional_cmd('set shada=') + reset(dirshada) + meths.set_option('shada', '\'10') + eq('Vim(wshada):E886: System error while opening ShaDa file ' + .. 'Xtest-functional-shada-shada.d/main.shada for reading to merge ' + .. 'before writing it: permission denied', + exc_exec('wshada')) + meths.set_option('shada', '') + end) end) |