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 c456b57..68afaa0 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -226,11 +226,8 @@
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 @@
else {
PyMem_DEL(unicode->str);
Py_XDECREF(unicode->defenc);
- PyObject_DEL(unicode);
+ unicode->ob_type->tp_free((PyObject *)unicode);
}
}