If a file is opened with an explicit buffer size >= 1, repeated
close() calls would attempt to free() the buffer already free()ed on
the first close(). [bug introduced with patch #788249]
Making sure that the buffer is free()ed in file object deallocation is
a belt-n-braces bit of insurance against a memory leak.
diff --git a/Objects/fileobject.c b/Objects/fileobject.c
index c973366..6b7e01b 100644
--- a/Objects/fileobject.c
+++ b/Objects/fileobject.c
@@ -312,6 +312,7 @@
(*f->f_close)(f->f_fp);
Py_END_ALLOW_THREADS
}
+ PyMem_Free(f->f_setbuf);
Py_XDECREF(f->f_name);
Py_XDECREF(f->f_mode);
Py_XDECREF(f->f_encoding);
@@ -358,6 +359,7 @@
f->f_fp = NULL;
}
PyMem_Free(f->f_setbuf);
+ f->f_setbuf = NULL;
if (sts == EOF)
return PyErr_SetFromErrno(PyExc_IOError);
if (sts != 0)