Hi,
I found a series of minor memory leak. minor because they only occurs in
situations
where a call like PyDict_SetItemString of PyModule_AddObject fails which means
things are already pretty bad anyway.
Nevertheless here is the bug description:
In "color.c" in the "MODINIT_DEFINE (color)" function at the end the "apiobj"
leaks if the call to "PyDict_SetItemString" fails.
In "font.c" and "mask.c" the "apiobj" leaks if the call to "PyModule_AddObject"
fails. Note that normally "PyModule_AddObject" steals a reference, but it only
does so on success.
In "pixelarray.c" the leaking object is "PyPixelArray_Type" also with the
failing
call to "PyModule_AddObject".
I attached a patch.
yours
//Lorenz
Index: src/font.c
===
--- src/font.c (revision 2356)
+++ src/font.c (working copy)
@@ -806,6 +806,7 @@
MODINIT_ERROR;
}
if (PyModule_AddObject (module, PYGAMEAPI_LOCAL_ENTRY, apiobj) == -1) {
+Py_DECREF (apiobj);
DECREF_MOD (module);
MODINIT_ERROR;
}
Index: src/color.c
===
--- src/color.c (revision 2356)
+++ src/color.c (working copy)
@@ -1608,7 +1608,6 @@
{
PyObject *colordict;
PyObject *module;
-PyObject *dict;
PyObject *apiobj;
static void* c_api[PYGAMEAPI_COLOR_NUMSLOTS];
@@ -1677,7 +1676,6 @@
DECREF_MOD(module);
MODINIT_ERROR;
}
-dict = PyModule_GetDict (module);
c_api[0] = &PyColor_Type;
c_api[1] = PyColor_New;
@@ -1689,11 +1687,11 @@
DECREF_MOD(module);
MODINIT_ERROR;
}
-if (PyDict_SetItemString (dict, PYGAMEAPI_LOCAL_ENTRY, apiobj)) {
+if (PyModule_AddObject (module, PYGAMEAPI_LOCAL_ENTRY, apiobj)) {
+Py_DECREF (apiobj);
Py_DECREF (_COLORDICT);
DECREF_MOD(module);
MODINIT_ERROR;
}
-Py_DECREF (apiobj);
MODINIT_RETURN (module);
}
Index: src/pixelarray.c
===
--- src/pixelarray.c(revision 2356)
+++ src/pixelarray.c(working copy)
@@ -2164,6 +2164,7 @@
if (PyModule_AddObject (module, "PixelArray",
(PyObject *) &PyPixelArray_Type) == -1)
{
+Py_DECREF ((PyObject *) &PyPixelArray_Type);
DECREF_MOD (module);
MODINIT_ERROR;
}
Index: src/mask.c
===
--- src/mask.c (revision 2356)
+++ src/mask.c (working copy)
@@ -1538,6 +1538,7 @@
MODINIT_ERROR;
}
if (PyModule_AddObject (module, PYGAMEAPI_LOCAL_ENTRY, apiobj) == -1) {
+Py_DECREF (apiobj);
DECREF_MOD (module);
MODINIT_ERROR;
}