-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ commit 717301b5302681e860de49ca12981cec9166e057 ] Add patch to fix CVE-2024-12254: "Unbounded memory buffering in SelectorSocketTransport.writelines()". - https://mail.python.org/archives/list/security-announce@python.org/thread/H4O3UBAOAQQXGT4RE3E4XQYR5XLROORB/ - python/cpython#127655 - python/cpython#127656
- Loading branch information
Daniel Néri
authored and
Takha Polat
committed
Dec 9, 2024
1 parent
442c81e
commit 913761c
Showing
2 changed files
with
67 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
https://github.com/python/cpython/issues/127655 | ||
|
||
From 5d355244e7c4f5d64216647ee0bf510dd8dc2bd6 Mon Sep 17 00:00:00 2001 | ||
From: "J. Nick Koston" <nick@koston.org> | ||
Date: Thu, 5 Dec 2024 22:33:03 -0600 | ||
Subject: [PATCH] gh-127655: Ensure `_SelectorSocketTransport.writelines` | ||
pauses the protocol if needed (GH-127656) | ||
|
||
Ensure `_SelectorSocketTransport.writelines` pauses the protocol if it reaches the high water mark as needed. | ||
(cherry picked from commit e991ac8f2037d78140e417cc9a9486223eb3e786) | ||
|
||
Co-authored-by: J. Nick Koston <nick@koston.org> | ||
Co-authored-by: Kumar Aditya <kumaraditya@python.org> | ||
--- | ||
Lib/asyncio/selector_events.py | 1 + | ||
Lib/test/test_asyncio/test_selector_events.py | 12 ++++++++++++ | ||
.../2024-12-05-21-35-19.gh-issue-127655.xpPoOf.rst | 1 + | ||
3 files changed, 14 insertions(+) | ||
create mode 100644 Misc/NEWS.d/next/Security/2024-12-05-21-35-19.gh-issue-127655.xpPoOf.rst | ||
|
||
diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py | ||
index 790711f834096b..dd79ad18df3b18 100644 | ||
--- a/Lib/asyncio/selector_events.py | ||
+++ b/Lib/asyncio/selector_events.py | ||
@@ -1183,6 +1183,7 @@ def writelines(self, list_of_data): | ||
# If the entire buffer couldn't be written, register a write handler | ||
if self._buffer: | ||
self._loop._add_writer(self._sock_fd, self._write_ready) | ||
+ self._maybe_pause_protocol() | ||
|
||
def can_write_eof(self): | ||
return True | ||
diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py | ||
index 47693ea4d3ce2e..736c19796ef3fc 100644 | ||
--- a/Lib/test/test_asyncio/test_selector_events.py | ||
+++ b/Lib/test/test_asyncio/test_selector_events.py | ||
@@ -805,6 +805,18 @@ def test_writelines_send_partial(self): | ||
self.assertTrue(self.sock.send.called) | ||
self.assertTrue(self.loop.writers) | ||
|
||
+ def test_writelines_pauses_protocol(self): | ||
+ data = memoryview(b'data') | ||
+ self.sock.send.return_value = 2 | ||
+ self.sock.send.fileno.return_value = 7 | ||
+ | ||
+ transport = self.socket_transport() | ||
+ transport._high_water = 1 | ||
+ transport.writelines([data]) | ||
+ self.assertTrue(self.protocol.pause_writing.called) | ||
+ self.assertTrue(self.sock.send.called) | ||
+ self.assertTrue(self.loop.writers) | ||
+ | ||
@unittest.skipUnless(selector_events._HAS_SENDMSG, 'no sendmsg') | ||
def test_write_sendmsg_full(self): | ||
data = memoryview(b'data') | ||
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 | ||
new file mode 100644 | ||
index 00000000000000..76cfc58121d3bd | ||
--- /dev/null | ||
+++ b/Misc/NEWS.d/next/Security/2024-12-05-21-35-19.gh-issue-127655.xpPoOf.rst | ||
@@ -0,0 +1 @@ | ||
+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`. |