Commit 4e10ed3b authored by Andrew MacIntyre's avatar Andrew MacIntyre

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.
parent ba813e20
......@@ -109,6 +109,23 @@ f.close()
if not f.closed:
raise TestFailed, 'file.closed should be true'
# make sure that explicitly setting the buffer size doesn't cause
# misbehaviour especially with repeated close() calls
for s in (-1, 0, 1, 512):
try:
f = open(TESTFN, 'w', s)
f.write(str(s))
f.close()
f.close()
f = open(TESTFN, 'r', s)
d = int(f.read())
f.close()
f.close()
except IOError, msg:
raise TestFailed, 'error setting buffer size %d: %s' % (s, str(msg))
if d != s:
raise TestFailed, 'readback failure using buffer size %d'
methods = ['fileno', 'flush', 'isatty', 'next', 'read', 'readinto',
'readline', 'readlines', 'seek', 'tell', 'truncate', 'write',
'xreadlines', '__iter__']
......
......@@ -194,6 +194,10 @@ Core and builtins
the data and the data length. Instead, the appropriate tp_as_buffer
method is called as necessary.
- fixed: 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 call.
Extension modules
-----------------
......
......@@ -312,6 +312,7 @@ file_dealloc(PyFileObject *f)
(*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 @@ file_close(PyFileObject *f)
f->f_fp = NULL;
}
PyMem_Free(f->f_setbuf);
f->f_setbuf = NULL;
if (sts == EOF)
return PyErr_SetFromErrno(PyExc_IOError);
if (sts != 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment