summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-01-19 20:18:09 +0100
committerBram Moolenaar <Bram@vim.org>2020-01-19 20:18:09 +0100
commitca33eb256eb910af05e8c9852bc9f716cece1f5c (patch)
tree0d076fc09027cdd997056b00c83fd7428455404c
parent479950f6c9aee4806f28a2b2fe5471e18a034cff (diff)
downloadvim-git-ca33eb256eb910af05e8c9852bc9f716cece1f5c.tar.gz
patch 8.2.0132: script may be re-used when deleting and creating a new onev8.2.0132
Problem: Script may be re-used when deleting and creating a new one. Solution: When the inode matches, also check the file name.
-rw-r--r--src/scriptfile.c22
-rw-r--r--src/testdir/test_source.vim12
-rw-r--r--src/version.c2
3 files changed, 26 insertions, 10 deletions
diff --git a/src/scriptfile.c b/src/scriptfile.c
index a574bf665..78a80d02b 100644
--- a/src/scriptfile.c
+++ b/src/scriptfile.c
@@ -1249,18 +1249,20 @@ do_source(
--current_sctx.sc_sid)
{
si = &SCRIPT_ITEM(current_sctx.sc_sid);
- if (si->sn_name != NULL
- && (
+ if (si->sn_name != NULL)
+ {
# ifdef UNIX
- // Compare dev/ino when possible, it catches symbolic
- // links. Also compare file names, the inode may change
- // when the file was edited.
- ((stat_ok && si->sn_dev_valid)
- && (si->sn_dev == st.st_dev
- && si->sn_ino == st.st_ino)) ||
+ // Compare dev/ino when possible, it catches symbolic links. Also
+ // compare file names, the inode may change when the file was
+ // edited or it may be re-used for another script (esp. in tests).
+ if ((stat_ok && si->sn_dev_valid)
+ && (si->sn_dev != st.st_dev || si->sn_ino != st.st_ino))
+ continue;
# endif
- fnamecmp(si->sn_name, fname_exp) == 0))
- break;
+ if (fnamecmp(si->sn_name, fname_exp) == 0)
+ // Found it!
+ break;
+ }
}
if (current_sctx.sc_sid == 0)
{
diff --git a/src/testdir/test_source.vim b/src/testdir/test_source.vim
index 09baec0b7..a5f5d1fd8 100644
--- a/src/testdir/test_source.vim
+++ b/src/testdir/test_source.vim
@@ -46,3 +46,15 @@ func Test_source_sandbox()
bwipe!
call delete('Xsourcehello')
endfunc
+
+" When deleting a file and immediately creating a new one the inode may be
+" recycled. Vim should not recognize it as the same script.
+func Test_different_script()
+ call ch_logfile('logfile', 'w')
+ call writefile(['let s:var = "asdf"'], 'XoneScript')
+ source XoneScript
+ call delete('XoneScript')
+ call writefile(['let g:var = s:var'], 'XtwoScript')
+ call assert_fails('source XtwoScript', 'E121:')
+ call delete('XtwoScript')
+endfunc
diff --git a/src/version.c b/src/version.c
index 2d5439809..2fb0fc306 100644
--- a/src/version.c
+++ b/src/version.c
@@ -743,6 +743,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 132,
+/**/
131,
/**/
130,