From bf3258308412de3402ab02cf193297ba88442fed Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Mon, 6 Mar 2000 14:52:18 +0000 Subject: [PATCH] string_join(): Fix memory leaks discovered by Charles Waldman (and a few other paths through the function that leaked). --- Objects/stringobject.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/Objects/stringobject.c b/Objects/stringobject.c index ec49dd7f96b..bc1bb41538b 100644 --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -709,8 +709,10 @@ string_join(self, args) goto finally; slen = PyString_GET_SIZE(sitem); while (reslen + slen + seplen >= sz) { - if (_PyString_Resize(&res, sz*2)) + if (_PyString_Resize(&res, sz*2)) { + Py_DECREF(sitem); goto finally; + } sz *= 2; p = PyString_AsString(res) + reslen; } @@ -720,6 +722,7 @@ string_join(self, args) reslen += seplen; } memcpy(p, PyString_AS_STRING(sitem), slen); + Py_DECREF(sitem); p += slen; reslen += slen; } @@ -728,14 +731,20 @@ string_join(self, args) for (i = 0; i < seqlen; i++) { PyObject *item = PySequence_GetItem(seq, i); PyObject *sitem; - if (!item || !(sitem = PyObject_Str(item))) { - Py_XDECREF(item); + + if (!item) goto finally; - } + sitem = PyObject_Str(item); + Py_DECREF(item); + if (!sitem) + goto finally; + slen = PyString_GET_SIZE(sitem); while (reslen + slen + seplen >= sz) { - if (_PyString_Resize(&res, sz*2)) + if (_PyString_Resize(&res, sz*2)) { + Py_DECREF(sitem); goto finally; + } sz *= 2; p = PyString_AsString(res) + reslen; } @@ -745,6 +754,7 @@ string_join(self, args) reslen += seplen; } memcpy(p, PyString_AS_STRING(sitem), slen); + Py_DECREF(sitem); p += slen; reslen += slen; }