diff --git a/7.3.1041 b/7.3.1041 new file mode 100644 index 0000000..e0a9f9c --- /dev/null +++ b/7.3.1041 @@ -0,0 +1,179 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.3.1041 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.3.1041 +Problem: Python: Invalid read valgrind errors. +Solution: Python patch 2: defer DICTKEY_UNREF until key is no longer needed. + (ZyX) +Files: src/if_py_both.h + + +*** ../vim-7.3.1040/src/if_py_both.h 2013-05-28 22:31:43.000000000 +0200 +--- src/if_py_both.h 2013-05-29 21:36:29.000000000 +0200 +*************** +*** 1603,1613 **** + flags = get_option_value_strict(key, NULL, NULL, + self->opt_type, self->from); + +- DICTKEY_UNREF +- + if (flags == 0) + { + PyErr_SetObject(PyExc_KeyError, keyObject); + return -1; + } + +--- 1603,1612 ---- + flags = get_option_value_strict(key, NULL, NULL, + self->opt_type, self->from); + + if (flags == 0) + { + PyErr_SetObject(PyExc_KeyError, keyObject); ++ DICTKEY_UNREF + return -1; + } + +*************** +*** 1617,1633 **** +--- 1616,1635 ---- + { + 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,1647 **** + 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); + } + else if (flags & SOPT_NUM) + { +--- 1641,1650 ---- + int istrue = PyObject_IsTrue(valObject); + + if (istrue == -1) +! r = -1; +! else +! r = set_option_value_for(key, istrue, NULL, +! opt_flags, self->opt_type, self->from); + } + else if (flags & SOPT_NUM) + { +*************** +*** 1657,1662 **** +--- 1660,1666 ---- + else + { + PyErr_SetString(PyExc_TypeError, _("object must be integer")); ++ DICTKEY_UNREF + return -1; + } + +*************** +*** 1670,1678 **** +--- 1674,1688 ---- + { + + if (PyString_AsStringAndSize(valObject, (char **) &val, NULL) == -1) ++ { ++ DICTKEY_UNREF + return -1; ++ } + if (val == NULL) ++ { ++ DICTKEY_UNREF + return -1; ++ } + + val = vim_strsave(val); + } +*************** +*** 1682,1693 **** +--- 1692,1712 ---- + + 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,1700 **** +--- 1714,1720 ---- + else + { + PyErr_SetString(PyExc_TypeError, _("object must be string")); ++ DICTKEY_UNREF + return -1; + } + +*************** +*** 1703,1708 **** +--- 1723,1730 ---- + vim_free(val); + } + ++ DICTKEY_UNREF ++ + return r; + } + +*** ../vim-7.3.1040/src/version.c 2013-05-29 21:33:34.000000000 +0200 +--- src/version.c 2013-05-29 21:36:47.000000000 +0200 +*************** +*** 730,731 **** +--- 730,733 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 1041, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +18. Your wife drapes a blond wig over your monitor to remind you of what she + looks like. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ an exciting new programming language -- http://www.Zimbu.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org ///