mirror of https://github.com/python/cpython
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:
parent
a631f580ea
commit
604ddf80d8
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue