changeset 17630:380adf86bf66 v8.1.1812

patch 8.1.1812: reading a truncted undo file hangs Vim commit https://github.com/vim/vim/commit/fb06d767a8d76eead5391302fc88115d6e3879d8 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Aug 4 18:55:35 2019 +0200 patch 8.1.1812: reading a truncted undo file hangs Vim Problem: Reading a truncted undo file hangs Vim. Solution: Check for reading EOF. (closes https://github.com/vim/vim/issues/4769)
author Bram Moolenaar <Bram@vim.org>
date Sun, 04 Aug 2019 19:00:04 +0200
parents a85a222d1a34
children 1f3f6e1d69cf
files src/testdir/test_undo.vim src/undo.c src/version.c
diffstat 3 files changed, 26 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_undo.vim
+++ b/src/testdir/test_undo.vim
@@ -335,6 +335,24 @@ func Test_undofile_earlier()
   call delete('Xundofile')
 endfunc
 
+" Check that reading a truncted undo file doesn't hang.
+func Test_undofile_truncated()
+  new
+  call setline(1, 'hello')
+  set ul=100
+  wundo Xundofile
+  let contents = readfile('Xundofile', 'B')
+
+  " try several sizes
+  for size in range(20, 500, 33)
+    call writefile(contents[0:size], 'Xundofile')
+    call assert_fails('rundo Xundofile', 'E825:')
+  endfor
+
+  bwipe!
+"  call delete('Xundofile')
+endfunc
+
 " Test for undo working properly when executing commands from a register.
 " Also test this in an empty buffer.
 func Test_cmd_in_reg_undo()
--- a/src/undo.c
+++ b/src/undo.c
@@ -1317,6 +1317,12 @@ unserialize_uhp(bufinfo_T *bi, char_u *f
 	int len = undo_read_byte(bi);
 	int what;
 
+	if (len == EOF)
+	{
+	    corruption_error("truncated", file_name);
+	    u_free_uhp(uhp);
+	    return NULL;
+	}
 	if (len == 0)
 	    break;
 	what = undo_read_byte(bi);
--- a/src/version.c
+++ b/src/version.c
@@ -774,6 +774,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1812,
+/**/
     1811,
 /**/
     1810,