changeset: 96229:7f2e6f236202 user: Nick Coghlan date: Sun May 24 01:03:46 2015 +1000 files: Modules/_testmultiphase.c Objects/moduleobject.c Objects/typeobject.c description: Issue #24268: Address some PEP 489 refleaks - missing DECREF in PyModule_FromDefAndSpec2 - missing DECREF in PyType_FromSpecAndBases2 - missing DECREF in _testmultiphase module Patch by Petr Viktorin diff -r e729b946cc03 -r 7f2e6f236202 Modules/_testmultiphase.c --- a/Modules/_testmultiphase.c Sat May 23 22:24:10 2015 +1000 +++ b/Modules/_testmultiphase.c Sun May 24 01:03:46 2015 +1000 @@ -262,6 +262,7 @@ return NULL; } PyDict_SetItemString(dct, "three", three); + Py_DECREF(three); ns = _PyNamespace_New(dct); Py_DECREF(dct); diff -r e729b946cc03 -r 7f2e6f236202 Objects/moduleobject.c --- a/Objects/moduleobject.c Sat May 23 22:24:10 2015 +1000 +++ b/Objects/moduleobject.c Sun May 24 01:03:46 2015 +1000 @@ -311,6 +311,7 @@ } } + Py_DECREF(nameobj); return m; error: diff -r e729b946cc03 -r 7f2e6f236202 Objects/typeobject.c --- a/Objects/typeobject.c Sat May 23 22:24:10 2015 +1000 +++ b/Objects/typeobject.c Sun May 24 01:03:46 2015 +1000 @@ -2694,6 +2694,7 @@ { PyHeapTypeObject *res = (PyHeapTypeObject*)PyType_GenericAlloc(&PyType_Type, 0); PyTypeObject *type, *base; + PyObject *modname; char *s; char *res_start = (char*)res; PyType_Slot *slot; @@ -2807,11 +2808,15 @@ /* Set type.__module__ */ s = strrchr(spec->name, '.'); - if (s != NULL) - _PyDict_SetItemId(type->tp_dict, &PyId___module__, - PyUnicode_FromStringAndSize( - spec->name, (Py_ssize_t)(s - spec->name))); - else { + if (s != NULL) { + modname = PyUnicode_FromStringAndSize( + spec->name, (Py_ssize_t)(s - spec->name)); + if (modname == NULL) { + goto fail; + } + _PyDict_SetItemId(type->tp_dict, &PyId___module__, modname); + Py_DECREF(modname); + } else { if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, "builtin type %.200s has no __module__ attribute", spec->name))