aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/memfile.c3
-rw-r--r--src/nvim/memline.c13
-rw-r--r--src/nvim/spell.c2
-rw-r--r--test/functional/ex_cmds/swapfile_preserve_recover_spec.lua16
4 files changed, 23 insertions, 11 deletions
diff --git a/src/nvim/memfile.c b/src/nvim/memfile.c
index fe4d24ba11..0a16f8aafb 100644
--- a/src/nvim/memfile.c
+++ b/src/nvim/memfile.c
@@ -76,7 +76,8 @@
/// @param flags Flags for open() call.
///
-/// @return The open memory file.
+/// @return - The open memory file, on success.
+/// - NULL, on failure (e.g. file does not exist).
memfile_T *mf_open(char_u *fname, int flags)
{
memfile_T *mfp = xmalloc(sizeof(memfile_T));
diff --git a/src/nvim/memline.c b/src/nvim/memline.c
index 95f3b0c623..4c4f7d65bd 100644
--- a/src/nvim/memline.c
+++ b/src/nvim/memline.c
@@ -277,6 +277,9 @@ int ml_open(buf_T *buf)
// Open the memfile. No swap file is created yet.
memfile_T *mfp = mf_open(NULL, 0);
+ if (mfp == NULL) {
+ goto error;
+ }
buf->b_ml.ml_mfp = mfp;
buf->b_ml.ml_flags = ML_EMPTY;
@@ -360,10 +363,12 @@ int ml_open(buf_T *buf)
return OK;
error:
- if (hp) {
- mf_put(mfp, hp, false, false);
+ if (mfp != NULL) {
+ if (hp) {
+ mf_put(mfp, hp, false, false);
+ }
+ mf_close(mfp, true); // will also xfree(mfp->mf_fname)
}
- mf_close(mfp, true); // will also xfree(mfp->mf_fname)
buf->b_ml.ml_mfp = NULL;
return FAIL;
}
@@ -839,7 +844,7 @@ void ml_recover(void)
mf_open() will consume "fname_used"! */
mfp = mf_open(fname_used, O_RDONLY);
fname_used = p;
- if (mfp->mf_fd < 0) {
+ if (mfp == NULL || mfp->mf_fd < 0) {
EMSG2(_("E306: Cannot open %s"), fname_used);
goto theend;
}
diff --git a/src/nvim/spell.c b/src/nvim/spell.c
index 518bd0922e..aaec0fe0b1 100644
--- a/src/nvim/spell.c
+++ b/src/nvim/spell.c
@@ -2510,7 +2510,7 @@ buf_T *open_spellbuf(void)
buf->b_spell = true;
buf->b_p_swf = true; // may create a swap file
if (ml_open(buf) == FAIL) {
- abort();
+ ELOG("Error opening a new memline");
}
ml_open_file(buf); // create swap file now
diff --git a/test/functional/ex_cmds/swapfile_preserve_recover_spec.lua b/test/functional/ex_cmds/swapfile_preserve_recover_spec.lua
index 3fcffd422f..bbab1471f6 100644
--- a/test/functional/ex_cmds/swapfile_preserve_recover_spec.lua
+++ b/test/functional/ex_cmds/swapfile_preserve_recover_spec.lua
@@ -1,10 +1,11 @@
local Screen = require('test.functional.ui.screen')
local helpers = require('test.functional.helpers')(after_each)
local lfs = require('lfs')
-local feed_command, eq, eval, expect, source =
- helpers.feed_command, helpers.eq, helpers.eval, helpers.expect, helpers.source
+local eq, eval, expect, source =
+ helpers.eq, helpers.eval, helpers.expect, helpers.source
local clear = helpers.clear
local command = helpers.command
+local expect_err = helpers.expect_err
local feed = helpers.feed
local nvim_prog = helpers.nvim_prog
local ok = helpers.ok
@@ -17,9 +18,14 @@ describe(':recover', function()
before_each(clear)
it('fails if given a non-existent swapfile', function()
- local swapname = 'bogus-swapfile'
- feed_command('recover '..swapname) -- This should not segfault. #2117
- eq('E305: No swap file found for '..swapname, eval('v:errmsg'))
+ local swapname = 'bogus_swapfile'
+ local swapname2 = 'bogus_swapfile.swp'
+ expect_err('E305: No swap file found for '..swapname,
+ command, 'recover '..swapname) -- Should not segfault. #2117
+ -- Also check filename ending with ".swp". #9504
+ expect_err('Vim%(recover%):E306: Cannot open '..swapname2,
+ command, 'recover '..swapname2) -- Should not segfault. #2117
+ eq(2, eval('1+1')) -- Still alive?
end)
end)