diff options
| author | Victor Stinner <vstinner@redhat.com> | 2019-05-27 23:44:21 (GMT) |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-05-27 23:44:21 (GMT) |
| commit | a3568417c49f36860393075b21c93996a5f6799b (patch) | |
| tree | 14c6fba772dcbbb737a9bad981640613c757efbd | |
| parent | df9b032f47e4edaf306d95449370e565ee470018 (diff) | |
| download | cpython-a3568417c49f36860393075b21c93996a5f6799b.zip cpython-a3568417c49f36860393075b21c93996a5f6799b.tar.gz cpython-a3568417c49f36860393075b21c93996a5f6799b.tar.bz2 | |
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().
| -rw-r--r-- | Lib/_pyio.py | 11 | ||||
| -rw-r--r-- | Misc/NEWS.d/next/Library/2019-05-28-01-06-44.bpo-37054.sLULGQ.rst | 3 |
2 files changed, 13 insertions, 1 deletions
diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 5baca4d..43c2434 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -873,6 +873,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: @@ -900,7 +904,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): @@ -1970,6 +1975,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. diff --git a/Misc/NEWS.d/next/Library/2019-05-28-01-06-44.bpo-37054.sLULGQ.rst b/Misc/NEWS.d/next/Library/2019-05-28-01-06-44.bpo-37054.sLULGQ.rst new file mode 100644 index 0000000..9a2433a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-28-01-06-44.bpo-37054.sLULGQ.rst @@ -0,0 +1,3 @@ +Fix destructor :class:`_pyio.BytesIO` and :class:`_pyio.TextIOWrapper`: +initialize their ``_buffer`` attribute as soon as possible (in the class +body), because it's used by ``__del__()`` which calls ``close()``. |
