diff -rup vim74/src/undo.c vim74-new/src/undo.c
--- vim74/src/undo.c 2013-06-10 11:13:37.000000000 -0700
+++ vim74-new/src/undo.c 2017-03-02 11:04:53.051564315 -0800
@@ -1151,7 +1151,7 @@ unserialize_uep(fp, error, file_name)
{
int i;
u_entry_T *uep;
- char_u **array;
+ char_u **array = NULL;
char_u *line;
int line_len;
@@ -1168,7 +1168,8 @@ unserialize_uep(fp, error, file_name)
uep->ue_size = get4c(fp);
if (uep->ue_size > 0)
{
- array = (char_u **)U_ALLOC_LINE(sizeof(char_u *) * uep->ue_size);
+ if (uep->ue_size < LONG_MAX / (int)sizeof(char_u *))
+ array = (char_u **)U_ALLOC_LINE(sizeof(char_u *) * uep->ue_size);
if (array == NULL)
{
*error = TRUE;
@@ -1176,8 +1177,6 @@ unserialize_uep(fp, error, file_name)
}
vim_memset(array, 0, sizeof(char_u *) * uep->ue_size);
}
- else
- array = NULL;
uep->ue_array = array;
for (i = 0; i < uep->ue_size; ++i)
@@ -1572,7 +1571,7 @@ u_read_undo(name, hash, orig_name)
linenr_T line_lnum;
colnr_T line_colnr;
linenr_T line_count;
- int num_head = 0;
+ long num_head = 0;
long old_header_seq, new_header_seq, cur_header_seq;
long seq_last, seq_cur;
long last_save_nr = 0;
@@ -1745,8 +1744,9 @@ u_read_undo(name, hash, orig_name)
* When there are no headers uhp_table is NULL. */
if (num_head > 0)
{
- uhp_table = (u_header_T **)U_ALLOC_LINE(
- num_head * sizeof(u_header_T *));
+ if (num_head < LONG_MAX / (long)sizeof(u_header_T *))
+ uhp_table = (u_header_T **)U_ALLOC_LINE(
+ num_head * sizeof(u_header_T *));
if (uhp_table == NULL)
goto error;
}