diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-07-08 11:01:46 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2022-07-08 11:11:22 +0800 |
commit | a890c019a3689fc15d8a5710cfc0cb92c5ac041d (patch) | |
tree | 39e3f979e68d8b6f96f4d4dd9b8c9396e953ee02 | |
parent | ca64b589cd74e9f6bd369286a415711ec7197082 (diff) | |
download | rneovim-a890c019a3689fc15d8a5710cfc0cb92c5ac041d.tar.gz rneovim-a890c019a3689fc15d8a5710cfc0cb92c5ac041d.tar.bz2 rneovim-a890c019a3689fc15d8a5710cfc0cb92c5ac041d.zip |
vim-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.
https://github.com/vim/vim/commit/ca33eb256eb910af05e8c9852bc9f716cece1f5c
-rw-r--r-- | src/nvim/ex_cmds2.c | 21 | ||||
-rw-r--r-- | src/nvim/testdir/test_source.vim | 12 |
2 files changed, 24 insertions, 9 deletions
diff --git a/src/nvim/ex_cmds2.c b/src/nvim/ex_cmds2.c index defe22ea9a..82970e2566 100644 --- a/src/nvim/ex_cmds2.c +++ b/src/nvim/ex_cmds2.c @@ -2161,16 +2161,19 @@ scriptitem_T *get_current_script_id(char_u *fname, sctx_T *ret_sctx) bool file_id_ok = os_fileid((char *)fname, &file_id); assert(script_items.ga_len >= 0); - for (script_sctx.sc_sid = script_items.ga_len; script_sctx.sc_sid > 0; - script_sctx.sc_sid--) { + for (script_sctx.sc_sid = script_items.ga_len; script_sctx.sc_sid > 0; script_sctx.sc_sid--) { si = &SCRIPT_ITEM(script_sctx.sc_sid); - // Compare dev/ino when possible, it catches symbolic links. - // Also compare file names, the inode may change when the file was edited. - bool file_id_equal = file_id_ok && si->file_id_valid - && os_fileid_equal(&(si->file_id), &file_id); - if (si->sn_name != NULL - && (file_id_equal || FNAMECMP(si->sn_name, fname) == 0)) { - break; + if (si->sn_name != NULL) { + // 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 (file_id_ok && si->file_id_valid && !os_fileid_equal(&(si->file_id), &file_id)) { + continue; + } + if (FNAMECMP(si->sn_name, fname) == 0) { + // Found it! + break; + } } } if (script_sctx.sc_sid == 0) { diff --git a/src/nvim/testdir/test_source.vim b/src/nvim/testdir/test_source.vim index 09baec0b7d..a5f5d1fd89 100644 --- a/src/nvim/testdir/test_source.vim +++ b/src/nvim/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 |