diff options
-rw-r--r-- | src/nvim/memfile.c | 3 | ||||
-rw-r--r-- | src/nvim/memline.c | 13 | ||||
-rw-r--r-- | src/nvim/spell.c | 2 | ||||
-rw-r--r-- | test/functional/ex_cmds/swapfile_preserve_recover_spec.lua | 16 |
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) |