]> granicus.if.org Git - python/commitdiff
Fix for #489669 (Neil Norwitz): memory leak in test_descr (unicode).
authorGuido van Rossum <guido@python.org>
Thu, 6 Dec 2001 20:03:56 +0000 (20:03 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 6 Dec 2001 20:03:56 +0000 (20:03 +0000)
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.

Objects/unicodeobject.c

index c456b5773dd99bf832ded16d04bc44c08a9c858f..68afaa05c85fb25c5e3c1a7932b0878d36f2ee9f 100644 (file)
@@ -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);
     }
 }