From: Guido van Rossum Date: Thu, 6 Dec 2001 20:03:56 +0000 (+0000) Subject: Fix for #489669 (Neil Norwitz): memory leak in test_descr (unicode). X-Git-Tag: v2.2.1c1~509 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=604ddf80d891f666c677d23b83c3c9f8125ee2b5;p=python Fix for #489669 (Neil Norwitz): memory leak in test_descr (unicode). This is best reproduced by while 1: class U(unicode): pass U(u"xxxxxx") The unicode_dealloc() code wasn't properly freeing the str and defenc fields of the Unicode object when freeing a subtype instance. Fixed this by a subtle refactoring that actually reduces the amount of code slightly. --- diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index c456b5773d..68afaa05c8 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -226,11 +226,8 @@ PyUnicodeObject *_PyUnicode_New(int length) static void unicode_dealloc(register PyUnicodeObject *unicode) { - if (!PyUnicode_CheckExact(unicode)) { - unicode->ob_type->tp_free((PyObject *)unicode); - return; - } - if (unicode_freelist_size < MAX_UNICODE_FREELIST_SIZE) { + if (PyUnicode_CheckExact(unicode) && + unicode_freelist_size < MAX_UNICODE_FREELIST_SIZE) { /* Keep-Alive optimization */ if (unicode->length >= KEEPALIVE_SIZE_LIMIT) { PyMem_DEL(unicode->str); @@ -249,7 +246,7 @@ void unicode_dealloc(register PyUnicodeObject *unicode) else { PyMem_DEL(unicode->str); Py_XDECREF(unicode->defenc); - PyObject_DEL(unicode); + unicode->ob_type->tp_free((PyObject *)unicode); } }