]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
updated for version 7.3.1041 v7.3.1041
authorBram Moolenaar <Bram@vim.org>
Wed, 29 May 2013 19:37:35 +0000 (21:37 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 29 May 2013 19:37:35 +0000 (21:37 +0200)
Problem:    Python: Invalid read valgrind errors.
Solution:   Python patch 2: defer DICTKEY_UNREF until key is no longer needed.
            (ZyX)

src/if_py_both.h
src/version.c

index c02cce3516b3da1744cef27f8ddc7cd7fce984d4..4fce4b825f2816401757f1cc053b1c02de76e61f 100644 (file)
@@ -1603,11 +1603,10 @@ OptionsAssItem(OptionsObject *self, PyObject *keyObject, PyObject *valObject)
     flags = get_option_value_strict(key, NULL, NULL,
                                    self->opt_type, self->from);
 
-    DICTKEY_UNREF
-
     if (flags == 0)
     {
        PyErr_SetObject(PyExc_KeyError, keyObject);
+       DICTKEY_UNREF
        return -1;
     }
 
@@ -1617,17 +1616,20 @@ OptionsAssItem(OptionsObject *self, PyObject *keyObject, PyObject *valObject)
        {
            PyErr_SetString(PyExc_ValueError,
                    _("unable to unset global option"));
+           DICTKEY_UNREF
            return -1;
        }
        else if (!(flags & SOPT_GLOBAL))
        {
            PyErr_SetString(PyExc_ValueError, _("unable to unset option "
                                                "without global value"));
+           DICTKEY_UNREF
            return -1;
        }
        else
        {
            unset_global_local_option(key, self->from);
+           DICTKEY_UNREF
            return 0;
        }
     }
@@ -1639,9 +1641,10 @@ OptionsAssItem(OptionsObject *self, PyObject *keyObject, PyObject *valObject)
        int     istrue = PyObject_IsTrue(valObject);
 
        if (istrue == -1)
-           return -1;
-       r = set_option_value_for(key, istrue, NULL,
-                               opt_flags, self->opt_type, self->from);
+           r = -1;
+       else
+           r = set_option_value_for(key, istrue, NULL,
+                                   opt_flags, self->opt_type, self->from);
     }
     else if (flags & SOPT_NUM)
     {
@@ -1657,6 +1660,7 @@ OptionsAssItem(OptionsObject *self, PyObject *keyObject, PyObject *valObject)
        else
        {
            PyErr_SetString(PyExc_TypeError, _("object must be integer"));
+           DICTKEY_UNREF
            return -1;
        }
 
@@ -1670,9 +1674,15 @@ OptionsAssItem(OptionsObject *self, PyObject *keyObject, PyObject *valObject)
        {
 
            if (PyString_AsStringAndSize(valObject, (char **) &val, NULL) == -1)
+           {
+               DICTKEY_UNREF
                return -1;
+           }
            if (val == NULL)
+           {
+               DICTKEY_UNREF
                return -1;
+           }
 
            val = vim_strsave(val);
        }
@@ -1682,12 +1692,21 @@ OptionsAssItem(OptionsObject *self, PyObject *keyObject, PyObject *valObject)
 
            bytes = PyUnicode_AsEncodedString(valObject, (char *)ENC_OPT, NULL);
            if (bytes == NULL)
+           {
+               DICTKEY_UNREF
                return -1;
+           }
 
            if(PyString_AsStringAndSize(bytes, (char **) &val, NULL) == -1)
+           {
+               DICTKEY_UNREF
                return -1;
+           }
            if (val == NULL)
+           {
+               DICTKEY_UNREF
                return -1;
+           }
 
            val = vim_strsave(val);
            Py_XDECREF(bytes);
@@ -1695,6 +1714,7 @@ OptionsAssItem(OptionsObject *self, PyObject *keyObject, PyObject *valObject)
        else
        {
            PyErr_SetString(PyExc_TypeError, _("object must be string"));
+           DICTKEY_UNREF
            return -1;
        }
 
@@ -1703,6 +1723,8 @@ OptionsAssItem(OptionsObject *self, PyObject *keyObject, PyObject *valObject)
        vim_free(val);
     }
 
+    DICTKEY_UNREF
+
     return r;
 }
 
index 62d0babf22885a81ead31d49bef868785046c5f0..55f7afea7bb25f1733c7fbda3c47882ee10a387f 100644 (file)
@@ -728,6 +728,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1041,
 /**/
     1040,
 /**/