From fa56e2dc409173b0abf497244977fcaeb1a39b1a Mon Sep 17 00:00:00 2001 From: Neal Norwitz Date: Sun, 19 Jan 2003 15:40:09 +0000 Subject: SF # 669553, fix memory (ref) leaks Will backport. --- Modules/pyexpat.c | 38 +++++++++++++++++++++++++------------- Objects/intobject.c | 9 ++++++++- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index f74751b..7e54f0e 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -1332,24 +1332,36 @@ xmlparse_getattr(xmlparseobject *self, char *name) } } +#define APPEND(list, str) \ + do { \ + PyObject *o = PyString_FromString(str); \ + if (o != NULL) \ + PyList_Append(list, o); \ + Py_XDECREF(o); \ + } while (0) + if (strcmp(name, "__members__") == 0) { int i; PyObject *rc = PyList_New(0); for (i = 0; handler_info[i].name != NULL; i++) { - PyList_Append(rc, get_handler_name(&handler_info[i])); + PyObject *o = get_handler_name(&handler_info[i]); + if (o != NULL) + PyList_Append(rc, o); + Py_XDECREF(o); } - PyList_Append(rc, PyString_FromString("ErrorCode")); - PyList_Append(rc, PyString_FromString("ErrorLineNumber")); - PyList_Append(rc, PyString_FromString("ErrorColumnNumber")); - PyList_Append(rc, PyString_FromString("ErrorByteIndex")); - PyList_Append(rc, PyString_FromString("buffer_size")); - PyList_Append(rc, PyString_FromString("buffer_text")); - PyList_Append(rc, PyString_FromString("buffer_used")); - PyList_Append(rc, PyString_FromString("ordered_attributes")); - PyList_Append(rc, PyString_FromString("returns_unicode")); - PyList_Append(rc, PyString_FromString("specified_attributes")); - PyList_Append(rc, PyString_FromString("intern")); - + APPEND(rc, "ErrorCode"); + APPEND(rc, "ErrorLineNumber"); + APPEND(rc, "ErrorColumnNumber"); + APPEND(rc, "ErrorByteIndex"); + APPEND(rc, "buffer_size"); + APPEND(rc, "buffer_text"); + APPEND(rc, "buffer_used"); + APPEND(rc, "ordered_attributes"); + APPEND(rc, "returns_unicode"); + APPEND(rc, "specified_attributes"); + APPEND(rc, "intern"); + +#undef APPEND return rc; } return Py_FindMethod(xmlparse_methods, (PyObject *)self, name); diff --git a/Objects/intobject.c b/Objects/intobject.c index d9e4d31..805f3b7 100644 --- a/Objects/intobject.c +++ b/Objects/intobject.c @@ -606,9 +606,16 @@ int_neg(PyIntObject *v) a = v->ob_ival; x = -a; if (a < 0 && x < 0) { + PyObject *o; if (err_ovf("integer negation")) return NULL; - return PyNumber_Negative(PyLong_FromLong(a)); + o = PyLong_FromLong(a); + if (o != NULL) { + PyObject *result = PyNumber_Negative(o); + Py_DECREF(o); + return result; + } + return NULL; } return PyInt_FromLong(x); } -- cgit v0.12