diff options
author | Bram Moolenaar <bram@vim.org> | 2013-06-10 20:47:36 +0200 |
---|---|---|
committer | Bram Moolenaar <bram@vim.org> | 2013-06-10 20:47:36 +0200 |
commit | 3d30b89e19cb4efc12f1ae63a76edc95aab10937 (patch) | |
tree | 2accc11325341a1da7cc4d33a4050d4317aac49c | |
parent | 1b2c4ecf34e1ee7ad1f697ddcf579f6408e706e8 (diff) | |
download | vim-7-3-1162.tar.gz |
Problem: Python: Memory leaks
Solution: Add more Py_DECREF(). (ZyX)
-rw-r--r-- | src/if_py_both.h | 17 | ||||
-rw-r--r-- | src/if_python.c | 16 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 21 insertions, 14 deletions
diff --git a/src/if_py_both.h b/src/if_py_both.h index be75cc84..287191a4 100644 --- a/src/if_py_both.h +++ b/src/if_py_both.h @@ -5354,6 +5354,7 @@ populate_module(PyObject *m, object_adder add_object, attr_getter get_attr) { int i; PyObject *other_module; + PyObject *attr; for (i = 0; i < (int)(sizeof(numeric_constants) / sizeof(struct numeric_constant)); @@ -5392,14 +5393,26 @@ populate_module(PyObject *m, object_adder add_object, attr_getter get_attr) if (!(py_chdir = PyObject_GetAttrString(other_module, "chdir"))) return -1; ADD_OBJECT(m, "_chdir", py_chdir); - if (PyObject_SetAttrString(other_module, "chdir", get_attr(m, "chdir"))) + if (!(attr = get_attr(m, "chdir"))) return -1; + if (PyObject_SetAttrString(other_module, "chdir", attr)) + { + Py_DECREF(attr); + return -1; + } + Py_DECREF(attr); if ((py_fchdir = PyObject_GetAttrString(other_module, "fchdir"))) { ADD_OBJECT(m, "_fchdir", py_fchdir); - if (PyObject_SetAttrString(other_module,"fchdir",get_attr(m,"fchdir"))) + if (!(attr = get_attr(m, "fchdir"))) return -1; + if (PyObject_SetAttrString(other_module, "fchdir", attr)) + { + Py_DECREF(attr); + return -1; + } + Py_DECREF(attr); } else PyErr_Clear(); diff --git a/src/if_python.c b/src/if_python.c index 318b170e..518b4e3f 100644 --- a/src/if_python.c +++ b/src/if_python.c @@ -210,6 +210,7 @@ struct PyMethodDef { Py_ssize_t a; }; # define PyMapping_Check dll_PyMapping_Check # define PyIter_Next dll_PyIter_Next # define PyModule_GetDict dll_PyModule_GetDict +# define PyModule_AddObject dll_PyModule_AddObject # define PyRun_SimpleString dll_PyRun_SimpleString # define PyRun_String dll_PyRun_String # define PyObject_GetAttrString dll_PyObject_GetAttrString @@ -344,6 +345,7 @@ static PyObject* (*dll_PyObject_CallMethod)(PyObject *, char *, PyObject *); static int (*dll_PyMapping_Check)(PyObject *); static PyObject* (*dll_PyIter_Next)(PyObject *); static PyObject*(*dll_PyModule_GetDict)(PyObject *); +static int(*dll_PyModule_AddObject)(PyObject *, const char *, PyObject *); static int(*dll_PyRun_SimpleString)(char *); static PyObject *(*dll_PyRun_String)(char *, int, PyObject *, PyObject *); static PyObject* (*dll_PyObject_GetAttrString)(PyObject *, const char *); @@ -509,6 +511,7 @@ static struct {"PyMapping_Check", (PYTHON_PROC*)&dll_PyMapping_Check}, {"PyIter_Next", (PYTHON_PROC*)&dll_PyIter_Next}, {"PyModule_GetDict", (PYTHON_PROC*)&dll_PyModule_GetDict}, + {"PyModule_AddObject", (PYTHON_PROC*)&dll_PyModule_AddObject}, {"PyRun_SimpleString", (PYTHON_PROC*)&dll_PyRun_SimpleString}, {"PyRun_String", (PYTHON_PROC*)&dll_PyRun_String}, {"PyObject_GetAttrString", (PYTHON_PROC*)&dll_PyObject_GetAttrString}, @@ -1357,19 +1360,9 @@ python_tabpage_free(tabpage_T *tab) #endif static int -add_object(PyObject *dict, const char *name, PyObject *object) -{ - if (PyDict_SetItemString(dict, (char *) name, object)) - return -1; - Py_DECREF(object); - return 0; -} - - static int PythonMod_Init(void) { PyObject *mod; - PyObject *dict; /* The special value is removed from sys.path in Python_Init(). */ static char *(argv[2]) = {"/must>not&exist/foo", NULL}; @@ -1382,9 +1375,8 @@ PythonMod_Init(void) mod = Py_InitModule4("vim", VimMethods, (char *)NULL, (PyObject *)NULL, PYTHON_API_VERSION); - dict = PyModule_GetDict(mod); - return populate_module(dict, add_object, PyDict_GetItemString); + return populate_module(mod, PyModule_AddObject, PyObject_GetAttrString); } /************************************************************************* diff --git a/src/version.c b/src/version.c index ba277a0a..1bdba020 100644 --- a/src/version.c +++ b/src/version.c @@ -729,6 +729,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1162, +/**/ 1161, /**/ 1160, |