summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-06-15 21:44:51 +0200
committerBram Moolenaar <Bram@vim.org>2016-06-15 21:44:51 +0200
commit28607ba2b82668503f8406bc13690d59af46deb3 (patch)
treebcaccb61eded1a03cda2c8d14bc04f9ca3173a1c
parent36f0f0686ca313ef7b76387378cd5dc7acea1924 (diff)
downloadvim-git-28607ba2b82668503f8406bc13690d59af46deb3.tar.gz
patch 7.4.1939v7.4.1939
Problem: Memory access error when reading viminfo. (Dominique Pelle) Solution: Correct index in jumplist when at the end.
-rw-r--r--src/mark.c4
-rw-r--r--src/testdir/test_viminfo.vim15
-rw-r--r--src/version.c2
3 files changed, 21 insertions, 0 deletions
diff --git a/src/mark.c b/src/mark.c
index 5e2ac5507..72a9a923c 100644
--- a/src/mark.c
+++ b/src/mark.c
@@ -1525,6 +1525,9 @@ handle_viminfo_mark(garray_T *values, int force)
if (idx < 0 && curwin->w_jumplistlen < JUMPLISTSIZE)
/* insert as the oldest entry */
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)
/* insert as oldest entry */
@@ -1537,6 +1540,7 @@ handle_viminfo_mark(garray_T *values, int force)
if (curwin->w_jumplistlen == JUMPLISTSIZE)
{
/* Drop the oldest entry. */
+ --idx;
vim_free(curwin->w_jumplist[0].fname);
for (i = 0; i < idx; ++i)
curwin->w_jumplist[i] = curwin->w_jumplist[i + 1];
diff --git a/src/testdir/test_viminfo.vim b/src/testdir/test_viminfo.vim
index 64a7e6fee..76b24403b 100644
--- a/src/testdir/test_viminfo.vim
+++ b/src/testdir/test_viminfo.vim
@@ -322,6 +322,7 @@ func Test_viminfo_jumplist()
clearjumps
rviminfo Xviminfo
+ let last_line = line('.')
exe "normal \<C-O>"
call assert_equal('time 30', getline('.'))
exe "normal \<C-O>"
@@ -336,6 +337,20 @@ func Test_viminfo_jumplist()
exe "normal \<C-O>"
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!
call delete('Xviminfo')
endfunc
diff --git a/src/version.c b/src/version.c
index 1a2b1f3c2..9608a7e55 100644
--- a/src/version.c
+++ b/src/version.c
@@ -754,6 +754,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1939,
+/**/
1938,
/**/
1937,