aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZyX <kp-pav@yandex.ru>2016-09-05 10:16:56 +0300
committerJustin M. Keyes <justinkz@gmail.com>2016-09-04 21:45:48 -0400
commit6127eaef0534d1ff5b96b8ed15854b4bedf8e9b4 (patch)
treed0fde734dac4ec478db6aa0e04b682aa16d89634
parentcd321b7d0fb161b77cd7b25da7f9a4721cfb0110 (diff)
downloadrneovim-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.c2
-rw-r--r--test/functional/shada/helpers.lua8
-rw-r--r--test/functional/shada/shada_spec.lua19
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)