changeset 19145:ea3ac1de7704 v8.2.0132

patch 8.2.0132: script may be re-used when deleting and creating a new one Commit: https://github.com/vim/vim/commit/ca33eb256eb910af05e8c9852bc9f716cece1f5c Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jan 19 20:18:09 2020 +0100 patch 8.2.0132: script may be re-used when deleting and creating a new one Problem: Script may be re-used when deleting and creating a new one. Solution: When the inode matches, also check the file name.
author Bram Moolenaar <Bram@vim.org>
date Sun, 19 Jan 2020 20:30:04 +0100
parents fc7387b02e42
children ba690b26dc16
files src/scriptfile.c src/testdir/test_source.vim src/version.c
diffstat 3 files changed, 26 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- 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)
     {
--- 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
--- 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,