]> granicus.if.org Git - vim/commitdiff
patch 8.2.0132: script may be re-used when deleting and creating a new one v8.2.0132
authorBram Moolenaar <Bram@vim.org>
Sun, 19 Jan 2020 19:18:09 +0000 (20:18 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 19 Jan 2020 19:18:09 +0000 (20:18 +0100)
Problem:    Script may be re-used when deleting and creating a new one.
Solution:   When the inode matches, also check the file name.

src/scriptfile.c
src/testdir/test_source.vim
src/version.c

index a574bf665bb8a75d627a2bc9a4dc0c97a27aa82b..78a80d02bcffb41162320d712cec049041c7cd0d 100644 (file)
@@ -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)
     {
index 09baec0b7d11b2c00424e799acbc004b39fafbe9..a5f5d1fd89a132452fde36e0127fdd1854b24f4a 100644 (file)
@@ -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
index 2d54398090383bf523279fbc56614af7e2ea9376..2fb0fc3067c173336b0421abd3bf9949a4368573 100644 (file)
@@ -742,6 +742,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    132,
 /**/
     131,
 /**/