|
| 1 | +https://github.com/python/cpython/issues/127655 |
| 2 | + |
| 3 | +From 5d355244e7c4f5d64216647ee0bf510dd8dc2bd6 Mon Sep 17 00:00:00 2001 |
| 4 | +From: "J. Nick Koston" < [email protected]> |
| 5 | +Date: Thu, 5 Dec 2024 22:33:03 -0600 |
| 6 | +Subject: [PATCH] gh-127655: Ensure `_SelectorSocketTransport.writelines` |
| 7 | + pauses the protocol if needed (GH-127656) |
| 8 | + |
| 9 | +Ensure `_SelectorSocketTransport.writelines` pauses the protocol if it reaches the high water mark as needed. |
| 10 | +(cherry picked from commit e991ac8f2037d78140e417cc9a9486223eb3e786) |
| 11 | + |
| 12 | +Co-authored-by: J. Nick Koston < [email protected]> |
| 13 | +Co-authored-by: Kumar Aditya < [email protected]> |
| 14 | +--- |
| 15 | + Lib/asyncio/selector_events.py | 1 + |
| 16 | + Lib/test/test_asyncio/test_selector_events.py | 12 ++++++++++++ |
| 17 | + .../2024-12-05-21-35-19.gh-issue-127655.xpPoOf.rst | 1 + |
| 18 | + 3 files changed, 14 insertions(+) |
| 19 | + create mode 100644 Misc/NEWS.d/next/Security/2024-12-05-21-35-19.gh-issue-127655.xpPoOf.rst |
| 20 | + |
| 21 | +diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py |
| 22 | +index 790711f834096b..dd79ad18df3b18 100644 |
| 23 | +--- a/Lib/asyncio/selector_events.py |
| 24 | ++++ b/Lib/asyncio/selector_events.py |
| 25 | +@@ -1183,6 +1183,7 @@ def writelines(self, list_of_data): |
| 26 | + # If the entire buffer couldn't be written, register a write handler |
| 27 | + if self._buffer: |
| 28 | + self._loop._add_writer(self._sock_fd, self._write_ready) |
| 29 | ++ self._maybe_pause_protocol() |
| 30 | + |
| 31 | + def can_write_eof(self): |
| 32 | + return True |
| 33 | +diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py |
| 34 | +index 47693ea4d3ce2e..736c19796ef3fc 100644 |
| 35 | +--- a/Lib/test/test_asyncio/test_selector_events.py |
| 36 | ++++ b/Lib/test/test_asyncio/test_selector_events.py |
| 37 | +@@ -805,6 +805,18 @@ def test_writelines_send_partial(self): |
| 38 | + self.assertTrue(self.sock.send.called) |
| 39 | + self.assertTrue(self.loop.writers) |
| 40 | + |
| 41 | ++ def test_writelines_pauses_protocol(self): |
| 42 | ++ data = memoryview(b'data') |
| 43 | ++ self.sock.send.return_value = 2 |
| 44 | ++ self.sock.send.fileno.return_value = 7 |
| 45 | ++ |
| 46 | ++ transport = self.socket_transport() |
| 47 | ++ transport._high_water = 1 |
| 48 | ++ transport.writelines([data]) |
| 49 | ++ self.assertTrue(self.protocol.pause_writing.called) |
| 50 | ++ self.assertTrue(self.sock.send.called) |
| 51 | ++ self.assertTrue(self.loop.writers) |
| 52 | ++ |
| 53 | + @unittest.skipUnless(selector_events._HAS_SENDMSG, 'no sendmsg') |
| 54 | + def test_write_sendmsg_full(self): |
| 55 | + data = memoryview(b'data') |
| 56 | +diff --git a/Misc/NEWS.d/next/Security/2024-12-05-21-35-19.gh-issue-127655.xpPoOf.rst b/Misc/NEWS.d/next/Security/2024-12-05-21-35-19.gh-issue-127655.xpPoOf.rst |
| 57 | +new file mode 100644 |
| 58 | +index 00000000000000..76cfc58121d3bd |
| 59 | +--- /dev/null |
| 60 | ++++ b/Misc/NEWS.d/next/Security/2024-12-05-21-35-19.gh-issue-127655.xpPoOf.rst |
| 61 | +@@ -0,0 +1 @@ |
| 62 | ++Fixed the :class:`!asyncio.selector_events._SelectorSocketTransport` transport not pausing writes for the protocol when the buffer reaches the high water mark when using :meth:`asyncio.WriteTransport.writelines`. |
0 commit comments