# HG changeset patch # User Bram Moolenaar # Date 1564938004 -7200 # Node ID 380adf86bf661203da08231ae67a490e2ae072a1 # Parent a85a222d1a34c521f11ad56298825d2ae8a37162 patch 8.1.1812: reading a truncted undo file hangs Vim commit https://github.com/vim/vim/commit/fb06d767a8d76eead5391302fc88115d6e3879d8 Author: Bram Moolenaar 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) diff --git a/src/testdir/test_undo.vim b/src/testdir/test_undo.vim --- 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() diff --git a/src/undo.c b/src/undo.c --- 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); diff --git a/src/version.c b/src/version.c --- 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,