# HG changeset patch # User Bram Moolenaar # Date 1369858801 -7200 # Node ID 29b2be2bba0d369fef85af7aa3196f8b84cce35c # Parent 3c76a1a281557c32432a58d9d0f79be0ac934445 updated for version 7.3.1045 Problem: Python: No error handling for VimToPython function. Solution: Python patch 6. (ZyX) diff --git a/src/if_py_both.h b/src/if_py_both.h --- 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); } } } diff --git a/src/version.c b/src/version.c --- 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,