0
0
mirror of https://github.com/vim/vim.git synced 2025-07-25 10:54:51 -04:00

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.
This commit is contained in:
Bram Moolenaar 2020-01-19 20:18:09 +01:00
parent 479950f6c9
commit ca33eb256e
3 changed files with 26 additions and 10 deletions

View File

@ -1249,18 +1249,20 @@ do_source(
--current_sctx.sc_sid) --current_sctx.sc_sid)
{ {
si = &SCRIPT_ITEM(current_sctx.sc_sid); si = &SCRIPT_ITEM(current_sctx.sc_sid);
if (si->sn_name != NULL if (si->sn_name != NULL)
&& ( {
# ifdef UNIX # ifdef UNIX
// Compare dev/ino when possible, it catches symbolic // Compare dev/ino when possible, it catches symbolic links. Also
// links. Also compare file names, the inode may change // compare file names, the inode may change when the file was
// when the file was edited. // edited or it may be re-used for another script (esp. in tests).
((stat_ok && si->sn_dev_valid) if ((stat_ok && si->sn_dev_valid)
&& (si->sn_dev == st.st_dev && (si->sn_dev != st.st_dev || si->sn_ino != st.st_ino))
&& si->sn_ino == st.st_ino)) || continue;
# endif # endif
fnamecmp(si->sn_name, fname_exp) == 0)) if (fnamecmp(si->sn_name, fname_exp) == 0)
break; // Found it!
break;
}
} }
if (current_sctx.sc_sid == 0) if (current_sctx.sc_sid == 0)
{ {

View File

@ -46,3 +46,15 @@ func Test_source_sandbox()
bwipe! bwipe!
call delete('Xsourcehello') call delete('Xsourcehello')
endfunc 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

View File

@ -742,6 +742,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
132,
/**/ /**/
131, 131,
/**/ /**/