updated for version 7.3.654 v7.3.654
authorBram Moolenaar <Bram@vim.org>
Wed, 5 Sep 2012 16:45:28 +0000 (18:45 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 5 Sep 2012 16:45:28 +0000 (18:45 +0200)
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)

src/if_py_both.h
src/version.c

index 931ecb98a78ffc1f730bea327d389911cacc9230..3ab18516eb1089e76841f9e83c7972200aae413b 100644 (file)
@@ -607,6 +607,14 @@ pyll_add(PyObject *self, pylinkedlist_T *ref, pylinkedlist_T **last)
 
 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, PyObject *lookupDict)
        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, PyObject *lookupDict)
            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)
+    DICTKEY_GET_NOTEMPTY(NULL)
+
+    di = dict_find(((DictionaryObject *) (self))->dict, key, -1);
 
-    val = 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, PyObject *keyObject, PyObject *valObject)
        return -1;
     }
 
-    DICTKEY_GET(-1)
+    DICTKEY_GET_NOTEMPTY(-1)
 
     di = dict_find(d, key, -1);
 
index 4c31c9761f01b57601c93aeb20479717b78c8f15..b3daa7d61caa47411c6b1ee93350d0b0a369ad3b 100644 (file)
@@ -719,6 +719,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    654,
 /**/
     653,
 /**/