From ca33eb256eb910af05e8c9852bc9f716cece1f5c Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 19 Jan 2020 20:18:09 +0100 Subject: 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. --- src/scriptfile.c | 22 ++++++++++++---------- src/testdir/test_source.vim | 12 ++++++++++++ src/version.c | 2 ++ 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 @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 132, /**/ 131, /**/ -- cgit v1.2.1