diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2019-05-27 17:05:49 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-05-27 17:05:49 -0700 |
commit | 0f352d44e7c14c1c93e3999402c85512b9d5a6ca (patch) | |
tree | 0a244c3f70f569c51c37c6086ccd90aa13164627 /Lib | |
parent | abdda3ae2a19326bb10bb6e54400c5d3a904b742 (diff) | |
download | cpython-git-0f352d44e7c14c1c93e3999402c85512b9d5a6ca.tar.gz |
bpo-37054, _pyio: Fix BytesIO and TextIOWrapper __del__() (GH-13601)
Fix destructor _pyio.BytesIO and _pyio.TextIOWrapper: initialize
their _buffer attribute as soon as possible (in the class body),
because it's used by __del__() which calls close().
(cherry picked from commit a3568417c49f36860393075b21c93996a5f6799b)
Co-authored-by: Victor Stinner <vstinner@redhat.com>
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/_pyio.py | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/Lib/_pyio.py b/Lib/_pyio.py index afbd48e000..e81cc51288 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -839,6 +839,10 @@ class BytesIO(BufferedIOBase): """Buffered I/O implementation using an in-memory bytes buffer.""" + # Initialize _buffer as soon as possible since it's used by __del__() + # which calls close() + _buffer = None + def __init__(self, initial_bytes=None): buf = bytearray() if initial_bytes is not None: @@ -866,7 +870,8 @@ class BytesIO(BufferedIOBase): return memoryview(self._buffer) def close(self): - self._buffer.clear() + if self._buffer is not None: + self._buffer.clear() super().close() def read(self, size=-1): @@ -1936,6 +1941,10 @@ class TextIOWrapper(TextIOBase): _CHUNK_SIZE = 2048 + # Initialize _buffer as soon as possible since it's used by __del__() + # which calls close() + _buffer = None + # The write_through argument has no effect here since this # implementation always writes through. The argument is present only # so that the signature can match the signature of the C version. |