# HG changeset patch # User Bram Moolenaar # Date 1346863528 -7200 # Node ID 73557eda70271b49015265b7147562b63a7a094d # Parent e70503274f3a36b6628e552ff91783aaa62e7663 updated for version 7.3.654 Problem: When creating a Vim dictionary from Python objects an empty key might be used. Solution: Do not use empty keys, throw an IndexError. (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 @@ -607,6 +607,14 @@ pyll_add(PyObject *self, pylinkedlist_T static PyTypeObject DictionaryType; +#define DICTKEY_GET_NOTEMPTY(err) \ + DICTKEY_GET(err) \ + if (*key == NUL) \ + { \ + PyErr_SetString(PyExc_ValueError, _("empty keys are not allowed")); \ + return err; \ + } + typedef struct { PyObject_HEAD @@ -659,7 +667,7 @@ pydict_to_tv(PyObject *obj, typval_T *tv if (valObject == NULL) return -1; - DICTKEY_GET(-1) + DICTKEY_GET_NOTEMPTY(-1) di = dictitem_alloc(key); @@ -730,7 +738,7 @@ pymap_to_tv(PyObject *obj, typval_T *tv, return -1; } - DICTKEY_GET(-1) + DICTKEY_GET_NOTEMPTY(-1) valObject = PyTuple_GetItem(litem, 1); if (valObject == NULL) @@ -784,16 +792,22 @@ DictionaryLength(PyObject *self) DictionaryItem(PyObject *self, PyObject *keyObject) { char_u *key; - dictitem_T *val; + dictitem_T *di; DICTKEY_DECL - DICTKEY_GET(NULL) - - val = dict_find(((DictionaryObject *) (self))->dict, key, -1); + DICTKEY_GET_NOTEMPTY(NULL) + + di = dict_find(((DictionaryObject *) (self))->dict, key, -1); + + if (di == NULL) + { + PyErr_SetString(PyExc_IndexError, _("no such key in dictionary")); + return NULL; + } DICTKEY_UNREF - return ConvertToPyObject(&val->di_tv); + return ConvertToPyObject(&di->di_tv); } static PyInt @@ -811,7 +825,7 @@ DictionaryAssItem(PyObject *self, PyObje return -1; } - DICTKEY_GET(-1) + DICTKEY_GET_NOTEMPTY(-1) di = dict_find(d, key, -1); diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -720,6 +720,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 654, +/**/ 653, /**/ 652,