One null pointer dereference vulnerability is found in src/undo.c 
(https://github.com/vim/vim/blob/master/src/undo.c)

The code snippet is as follows.

1383 static u_entry_T *
1384 unserialize_uep(bufinfo_T *bi, int *error, char_u *file_name)
1385 {
        ...
1402    uep->ue_size = undo_read_4c(bi);
1403    if (uep->ue_size > 0)
1404    {
1405        array = (char_u **)U_ALLOC_LINE(sizeof(char_u *) * uep->ue_size);
1406        if (array == NULL)
1407        {
1408            *error = TRUE;
1409            return uep;
1410        }
1411        vim_memset(array, 0, sizeof(char_u *) * uep->ue_size);
1412    }
1413    else
1414        array = NULL;
1415    uep->ue_array = array;
1416
1417    for (i = 0; i < uep->ue_size; ++i)
        ....
1434    return uep;
1435 }

Variable uep->ue_size is read from user file at line 1402,so its value can be 
controlled by users. Null pointer is assigned to array at line 1414 if 
uep->ue_size is not positive, then uep->ue_array is also null at line 1415. 
After that, uep is returned from this function.

Since no error code is set along this ELSE branch, the calling function 
unserialize_uhp() will link uep into the list uhp through the while-loop at 
line 1332. After that, uhp will be store into uhp_table at line 1991 in 
function u_read_undo, and uhp_table is referred via global pointer 
curbuf->b_u_curhead (at line 2085).

As a result, null pointer dereference vulnerability would occur if the program 
reads the uhp_table and uses uep->ue_array, which might be null pointer. For 
example, one usage place is at line 2680 in function u_undoredo.

One possible workaround is to return an error code for the ELSE branch at line 
1413, just as line 1406 does. Attached please find the patch.

Thanks.

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.
--- ./vim/src/undo.c	2017-02-07 17:04:12.000000000 +0800
+++ undo-patched.c	2017-02-13 12:37:34.000000000 +0800
@@ -1411,7 +1411,11 @@
 	vim_memset(array, 0, sizeof(char_u *) * uep->ue_size);
     }
     else
+	{
 	array = NULL;
+	*error = TRUE;
+	return uep;
+	}
     uep->ue_array = array;
 
     for (i = 0; i < uep->ue_size; ++i)

Raspunde prin e-mail lui