summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2018-05-28 16:04:09 (GMT)
committerYury Selivanov <yury@magic.io>2018-05-28 16:04:09 (GMT)
commit1f21ae710d83a37c872355612b58958cef4d5f95 (patch)
treebe3ee424127e334e124dc39c7d90f878d1425a6d
parent51d0a2c8ddcb9f58d71ff0a62be4e31a1af3f139 (diff)
downloadcpython-1f21ae710d83a37c872355612b58958cef4d5f95.zip
cpython-1f21ae710d83a37c872355612b58958cef4d5f95.tar.gz
cpython-1f21ae710d83a37c872355612b58958cef4d5f95.tar.bz2
bpo-31647: Fix write_eof() after close() for SelectorSocketTransport (GH-7149) (GH-7153)
Fixed bug where calling write_eof() on a _SelectorSocketTransport after it's already closed raises AttributeError. (cherry picked from commit 23f587e395e41bd5e116312b036183f42bc4159b) Co-authored-by: twisteroid ambassador <twisteroidambassador@users.noreply.github.com>
-rw-r--r--Lib/asyncio/selector_events.py2
-rw-r--r--Lib/test/test_asyncio/test_selector_events.py6
-rw-r--r--Misc/NEWS.d/next/Library/2018-05-28-18-40-26.bpo-31467.s4Fad3.rst2
3 files changed, 9 insertions, 1 deletions
diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py
index f9533a1..5473c70 100644
--- a/Lib/asyncio/selector_events.py
+++ b/Lib/asyncio/selector_events.py
@@ -899,7 +899,7 @@ class _SelectorSocketTransport(_SelectorTransport):
self._sock.shutdown(socket.SHUT_WR)
def write_eof(self):
- if self._eof:
+ if self._closing or self._eof:
return
self._eof = True
if not self._buffer:
diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py
index 684c29d..5c4ff57 100644
--- a/Lib/test/test_asyncio/test_selector_events.py
+++ b/Lib/test/test_asyncio/test_selector_events.py
@@ -1263,6 +1263,12 @@ class SelectorSocketTransportTests(test_utils.TestCase):
self.sock.shutdown.assert_called_with(socket.SHUT_WR)
tr.close()
+ def test_write_eof_after_close(self):
+ tr = self.socket_transport()
+ tr.close()
+ self.loop.run_until_complete(asyncio.sleep(0))
+ tr.write_eof()
+
@mock.patch('asyncio.base_events.logger')
def test_transport_close_remove_writer(self, m_log):
remove_writer = self.loop._remove_writer = mock.Mock()
diff --git a/Misc/NEWS.d/next/Library/2018-05-28-18-40-26.bpo-31467.s4Fad3.rst b/Misc/NEWS.d/next/Library/2018-05-28-18-40-26.bpo-31467.s4Fad3.rst
new file mode 100644
index 0000000..61cc8ba
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-05-28-18-40-26.bpo-31467.s4Fad3.rst
@@ -0,0 +1,2 @@
+Fixed bug where calling write_eof() on a _SelectorSocketTransport after it's
+already closed raises AttributeError.