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
index 931ecb9..3ab1851 100644
--- a/src/if_py_both.h
+++ b/src/if_py_both.h
@@ -607,6 +607,14 @@
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 @@
if (valObject == NULL)
return -1;
- DICTKEY_GET(-1)
+ DICTKEY_GET_NOTEMPTY(-1)
di = dictitem_alloc(key);
@@ -730,7 +738,7 @@
return -1;
}
- DICTKEY_GET(-1)
+ DICTKEY_GET_NOTEMPTY(-1)
valObject = PyTuple_GetItem(litem, 1);
if (valObject == NULL)
@@ -784,16 +792,22 @@
DictionaryItem(PyObject *self, PyObject *keyObject)
{
char_u *key;
- dictitem_T *val;
+ dictitem_T *di;
DICTKEY_DECL
- DICTKEY_GET(NULL)
+ DICTKEY_GET_NOTEMPTY(NULL)
- val = dict_find(((DictionaryObject *) (self))->dict, key, -1);
+ 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 @@
return -1;
}
- DICTKEY_GET(-1)
+ DICTKEY_GET_NOTEMPTY(-1)
di = dict_find(d, key, -1);