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.
This commit is contained in:
Guido van Rossum 2001-12-06 20:03:56 +00:00
parent a631f580ea
commit 604ddf80d8
1 changed files with 3 additions and 6 deletions

View 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);
}
}