forked from aniani/vim
patch 7.4.1939
Problem: Memory access error when reading viminfo. (Dominique Pelle) Solution: Correct index in jumplist when at the end.
This commit is contained in:
@@ -1525,6 +1525,9 @@ handle_viminfo_mark(garray_T *values, int force)
|
|||||||
if (idx < 0 && curwin->w_jumplistlen < JUMPLISTSIZE)
|
if (idx < 0 && curwin->w_jumplistlen < JUMPLISTSIZE)
|
||||||
/* insert as the oldest entry */
|
/* insert as the oldest entry */
|
||||||
idx = 0;
|
idx = 0;
|
||||||
|
else if (idx == 0 && curwin->w_jumplistlen == JUMPLISTSIZE)
|
||||||
|
/* no space to insert as the oldest entry */
|
||||||
|
idx = -1;
|
||||||
}
|
}
|
||||||
else if (curwin->w_jumplistlen < JUMPLISTSIZE)
|
else if (curwin->w_jumplistlen < JUMPLISTSIZE)
|
||||||
/* insert as oldest entry */
|
/* insert as oldest entry */
|
||||||
@@ -1537,6 +1540,7 @@ handle_viminfo_mark(garray_T *values, int force)
|
|||||||
if (curwin->w_jumplistlen == JUMPLISTSIZE)
|
if (curwin->w_jumplistlen == JUMPLISTSIZE)
|
||||||
{
|
{
|
||||||
/* Drop the oldest entry. */
|
/* Drop the oldest entry. */
|
||||||
|
--idx;
|
||||||
vim_free(curwin->w_jumplist[0].fname);
|
vim_free(curwin->w_jumplist[0].fname);
|
||||||
for (i = 0; i < idx; ++i)
|
for (i = 0; i < idx; ++i)
|
||||||
curwin->w_jumplist[i] = curwin->w_jumplist[i + 1];
|
curwin->w_jumplist[i] = curwin->w_jumplist[i + 1];
|
||||||
|
@@ -322,6 +322,7 @@ func Test_viminfo_jumplist()
|
|||||||
clearjumps
|
clearjumps
|
||||||
rviminfo Xviminfo
|
rviminfo Xviminfo
|
||||||
|
|
||||||
|
let last_line = line('.')
|
||||||
exe "normal \<C-O>"
|
exe "normal \<C-O>"
|
||||||
call assert_equal('time 30', getline('.'))
|
call assert_equal('time 30', getline('.'))
|
||||||
exe "normal \<C-O>"
|
exe "normal \<C-O>"
|
||||||
@@ -336,6 +337,20 @@ func Test_viminfo_jumplist()
|
|||||||
exe "normal \<C-O>"
|
exe "normal \<C-O>"
|
||||||
call assert_equal('time 05', getline('.'))
|
call assert_equal('time 05', getline('.'))
|
||||||
|
|
||||||
|
" Test with jumplist full.
|
||||||
|
clearjumps
|
||||||
|
call setline(1, repeat(['match here'], 101))
|
||||||
|
call cursor(1, 1)
|
||||||
|
call test_settime(10)
|
||||||
|
for i in range(100)
|
||||||
|
exe "normal /here\r"
|
||||||
|
endfor
|
||||||
|
rviminfo Xviminfo
|
||||||
|
|
||||||
|
" must be newest mark that comes from viminfo.
|
||||||
|
exe "normal \<C-O>"
|
||||||
|
call assert_equal(last_line, line('.'))
|
||||||
|
|
||||||
bwipe!
|
bwipe!
|
||||||
call delete('Xviminfo')
|
call delete('Xviminfo')
|
||||||
endfunc
|
endfunc
|
||||||
|
@@ -753,6 +753,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 */
|
||||||
|
/**/
|
||||||
|
1939,
|
||||||
/**/
|
/**/
|
||||||
1938,
|
1938,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user