From: Meador Inge Date: Thu, 19 Jul 2012 18:45:43 +0000 (-0500) Subject: Issue #15394: Fix ref leaks in PyModule_Create. X-Git-Tag: v3.3.0b2~162^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=29e49d63942cc75ead85a4cb77dea34285be9fcc;p=thirdparty%2FPython%2Fcpython.git Issue #15394: Fix ref leaks in PyModule_Create. Patch by Julia Lawall. --- diff --git a/Misc/ACKS b/Misc/ACKS index 3bf81a266bcc..16847be1f84c 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -542,6 +542,7 @@ Soren Larsen Piers Lauder Ben Laurie Simon Law +Julia Lawall Chris Lawrence Brian Leair James Lee diff --git a/Misc/NEWS b/Misc/NEWS index 5793aec6b610..0136a4425b25 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ What's New in Python 3.2.4 Core and Builtins ----------------- +- Issue #15394: An issue in PyModule_Create that caused references to + be leaked on some error paths has been fixed. Patch by Julia Lawall. + - Issue #15368: An issue that caused bytecode generation to be non-deterministic when using randomized hashing (-R) has been fixed. diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index f31b5da26d57..533db46efa81 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -117,8 +117,10 @@ PyModule_Create2(struct PyModuleDef* module, int module_api_version) d = PyModule_GetDict((PyObject*)m); if (module->m_methods != NULL) { n = PyUnicode_FromString(name); - if (n == NULL) + if (n == NULL) { + Py_DECREF(m); return NULL; + } for (ml = module->m_methods; ml->ml_name != NULL; ml++) { if ((ml->ml_flags & METH_CLASS) || (ml->ml_flags & METH_STATIC)) { @@ -126,16 +128,19 @@ PyModule_Create2(struct PyModuleDef* module, int module_api_version) "module functions cannot set" " METH_CLASS or METH_STATIC"); Py_DECREF(n); + Py_DECREF(m); return NULL; } v = PyCFunction_NewEx(ml, (PyObject*)m, n); if (v == NULL) { Py_DECREF(n); + Py_DECREF(m); return NULL; } if (PyDict_SetItemString(d, ml->ml_name, v) != 0) { Py_DECREF(v); Py_DECREF(n); + Py_DECREF(m); return NULL; } Py_DECREF(v); @@ -146,6 +151,7 @@ PyModule_Create2(struct PyModuleDef* module, int module_api_version) v = PyUnicode_FromString(module->m_doc); if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0) { Py_XDECREF(v); + Py_DECREF(m); return NULL; } Py_DECREF(v);