changeset 4595:29b2be2bba0d v7.3.1045

updated for version 7.3.1045 Problem: Python: No error handling for VimToPython function. Solution: Python patch 6. (ZyX)
author Bram Moolenaar <bram@vim.org>
date Wed, 29 May 2013 22:20:01 +0200
parents 3c76a1a28155
children baf9bfa3df3d
files src/if_py_both.h src/version.c
diffstat 2 files changed, 57 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/src/if_py_both.h
+++ b/src/if_py_both.h
@@ -432,8 +432,8 @@ VimToPython(typval_T *our_tv, int depth,
 	sprintf(ptrBuf, "%p",
 		our_tv->v_type == VAR_LIST ? (void *)our_tv->vval.v_list
 					   : (void *)our_tv->vval.v_dict);
-	result = PyDict_GetItemString(lookupDict, ptrBuf);
-	if (result != NULL)
+
+	if ((result = PyDict_GetItemString(lookupDict, ptrBuf)))
 	{
 	    Py_INCREF(result);
 	    return result;
@@ -467,44 +467,72 @@ VimToPython(typval_T *our_tv, int depth,
 	list_T		*list = our_tv->vval.v_list;
 	listitem_T	*curr;
 
-	result = PyList_New(0);
-
-	if (list != NULL)
+	if (list == NULL)
+	    return NULL;
+
+	if (!(result = PyList_New(0)))
+	    return NULL;
+
+	if (PyDict_SetItemString(lookupDict, ptrBuf, result))
 	{
-	    PyDict_SetItemString(lookupDict, ptrBuf, result);
-
-	    for (curr = list->lv_first; curr != NULL; curr = curr->li_next)
+	    Py_DECREF(result);
+	    return NULL;
+	}
+
+	for (curr = list->lv_first; curr != NULL; curr = curr->li_next)
+	{
+	    if (!(newObj = VimToPython(&curr->li_tv, depth + 1, lookupDict)))
 	    {
-		newObj = VimToPython(&curr->li_tv, depth + 1, lookupDict);
-		PyList_Append(result, newObj);
+		Py_DECREF(result);
+		return NULL;
+	    }
+	    if (PyList_Append(result, newObj))
+	    {
 		Py_DECREF(newObj);
+		Py_DECREF(result);
+		return NULL;
 	    }
+	    Py_DECREF(newObj);
 	}
     }
     else if (our_tv->v_type == VAR_DICT)
     {
-	result = PyDict_New();
-
-	if (our_tv->vval.v_dict != NULL)
+
+	hashtab_T	*ht = &our_tv->vval.v_dict->dv_hashtab;
+	long_u	todo = ht->ht_used;
+	hashitem_T	*hi;
+	dictitem_T	*di;
+	if (our_tv->vval.v_dict == NULL)
+	    return NULL;
+
+	if (!(result = PyDict_New()))
+	    return NULL;
+
+	if (PyDict_SetItemString(lookupDict, ptrBuf, result))
 	{
-	    hashtab_T	*ht = &our_tv->vval.v_dict->dv_hashtab;
-	    long_u	todo = ht->ht_used;
-	    hashitem_T	*hi;
-	    dictitem_T	*di;
-
-	    PyDict_SetItemString(lookupDict, ptrBuf, result);
-
-	    for (hi = ht->ht_array; todo > 0; ++hi)
+	    Py_DECREF(result);
+	    return NULL;
+	}
+
+	for (hi = ht->ht_array; todo > 0; ++hi)
+	{
+	    if (!HASHITEM_EMPTY(hi))
 	    {
-		if (!HASHITEM_EMPTY(hi))
+		--todo;
+
+		di = dict_lookup(hi);
+		if (!(newObj = VimToPython(&di->di_tv, depth + 1, lookupDict)))
 		{
-		    --todo;
-
-		    di = dict_lookup(hi);
-		    newObj = VimToPython(&di->di_tv, depth + 1, lookupDict);
-		    PyDict_SetItemString(result, (char *)hi->hi_key, newObj);
+		    Py_DECREF(result);
+		    return NULL;
+		}
+		if (PyDict_SetItemString(result, (char *)hi->hi_key, newObj))
+		{
+		    Py_DECREF(result);
 		    Py_DECREF(newObj);
+		    return NULL;
 		}
+		Py_DECREF(newObj);
 	    }
 	}
     }
--- a/src/version.c
+++ b/src/version.c
@@ -729,6 +729,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1045,
+/**/
     1044,
 /**/
     1043,