diff options
author | Bram Moolenaar <Bram@vim.org> | 2013-05-29 22:20:01 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2013-05-29 22:20:01 +0200 |
commit | 21642ed1b4aeab32d419f310d2100999482b1079 (patch) | |
tree | 2fc313e149694d6ea5c0a3dcb134512bfb77f01a | |
parent | 9e822c00b1fdf3e0604dbb520f593d8de6c15098 (diff) | |
download | vim-git-21642ed1b4aeab32d419f310d2100999482b1079.tar.gz |
updated for version 7.3.1045v7.3.1045
Problem: Python: No error handling for VimToPython function.
Solution: Python patch 6. (ZyX)
-rw-r--r-- | src/if_py_both.h | 74 | ||||
-rw-r--r-- | src/version.c | 2 |
2 files changed, 53 insertions, 23 deletions
diff --git a/src/if_py_both.h b/src/if_py_both.h index c1464331f..ad6e97008 100644 --- a/src/if_py_both.h +++ b/src/if_py_both.h @@ -432,8 +432,8 @@ VimToPython(typval_T *our_tv, int depth, PyObject *lookupDict) 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, PyObject *lookupDict) list_T *list = our_tv->vval.v_list; listitem_T *curr; - result = PyList_New(0); + if (list == NULL) + return NULL; + + if (!(result = PyList_New(0))) + return NULL; - if (list != NULL) + if (PyDict_SetItemString(lookupDict, ptrBuf, result)) { - PyDict_SetItemString(lookupDict, ptrBuf, result); + Py_DECREF(result); + return NULL; + } - for (curr = list->lv_first; curr != NULL; curr = curr->li_next) + for (curr = list->lv_first; curr != NULL; curr = curr->li_next) + { + if (!(newObj = VimToPython(&curr->li_tv, depth + 1, lookupDict))) + { + Py_DECREF(result); + return NULL; + } + if (PyList_Append(result, newObj)) { - newObj = VimToPython(&curr->li_tv, depth + 1, lookupDict); - 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; + 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; - PyDict_SetItemString(lookupDict, ptrBuf, result); + if (PyDict_SetItemString(lookupDict, ptrBuf, result)) + { + Py_DECREF(result); + return NULL; + } - for (hi = ht->ht_array; todo > 0; ++hi) + for (hi = ht->ht_array; todo > 0; ++hi) + { + if (!HASHITEM_EMPTY(hi)) { - if (!HASHITEM_EMPTY(hi)) - { - --todo; + --todo; - di = dict_lookup(hi); - newObj = VimToPython(&di->di_tv, depth + 1, lookupDict); - PyDict_SetItemString(result, (char *)hi->hi_key, newObj); + di = dict_lookup(hi); + if (!(newObj = VimToPython(&di->di_tv, depth + 1, lookupDict))) + { + 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 index b3bd87493..3afdf0177 100644 --- 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, |