From fa451d1c0cf9565bd741f26e326ca23fa64aa73d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Kul=C3=ADk?= Date: Mon, 3 Aug 2026 11:03:10 +0200 Subject: [PATCH 1/2] gh-145030: Fix asyncio write pipe transport for named FIFOs on Solaris --- Lib/asyncio/unix_events.py | 14 +++++++------- Lib/test/test_asyncio/test_events.py | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index bb98f0014f81760..94c5fb726e59333 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -658,19 +658,19 @@ def __init__(self, loop, pipe, protocol, waiter=None, extra=None): # On AIX, the reader trick (to be notified when the read end of the # socket is closed) only works for sockets. On other platforms it # works for pipes and sockets. (Exception: OS X 10.4? Issue #19294.) - # On macOS, the trick misfires for named FIFOs (but not for pipes - # created with os.pipe(), which have st_nlink == 0): the write end - # polls as readable whenever unread data sits in the FIFO, and no + # On macOS and Solaris, the trick misfires for named FIFOs (but not for + # pipes created with os.pipe(), which have st_nlink == 0): the write + # end polls as readable whenever unread data sits in the FIFO, and no # event is delivered when the read end is closed, so it can only - # ever report a false disconnection (gh-145030). The same xnu + # ever report a false disconnection (gh-145030). The same XNU # behaviour applies on iOS/tvOS/watchOS (sys.platform is not # "darwin" there). - is_named_fifo_on_apple = ( - sys.platform in {"darwin", "ios", "tvos", "watchos"} + is_named_fifo_without_close_event = ( + sys.platform in {"darwin", "ios", "tvos", "watchos", "sunos5"} and is_fifo and pipe_stat.st_nlink > 0) if is_socket or (is_fifo and not sys.platform.startswith("aix") - and not is_named_fifo_on_apple): + and not is_named_fifo_without_close_event): # only start reading when connection_made() has been called self._loop.call_soon(self._loop._add_reader, self._fileno, self._read_ready) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index 3fdfffdb213efc2..f7cd59a54199710 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -1729,9 +1729,9 @@ def reader(data): "Don't support pipes for Windows") @unittest.skipUnless(hasattr(os, 'mkfifo'), 'requires os.mkfifo()') def test_write_named_fifo_unread_data(self): - # gh-145030: on macOS, the write end of a named FIFO polls as - # readable while unread data sits in the FIFO, which made the - # transport misinterpret the event as the reader hanging up + # gh-145030: on macOS and Solaris, the write end of a named FIFO + # polls as readable while unread data sits in the FIFO, which made + # the transport misinterpret the event as the reader hanging up # and close itself. path = os_helper.TESTFN os.mkfifo(path) From 85ace7e2a620413a74d7e40ee7488347637514dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Kul=C3=ADk?= Date: Mon, 3 Aug 2026 11:04:22 +0200 Subject: [PATCH 2/2] update the NEWS entry --- .../Library/2026-07-20-12-40-00.gh-issue-145030.TFJm6k.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Misc/NEWS.d/next/Library/2026-07-20-12-40-00.gh-issue-145030.TFJm6k.rst b/Misc/NEWS.d/next/Library/2026-07-20-12-40-00.gh-issue-145030.TFJm6k.rst index 2c6b07a4fa8b76f..2f1b717b40ea74a 100644 --- a/Misc/NEWS.d/next/Library/2026-07-20-12-40-00.gh-issue-145030.TFJm6k.rst +++ b/Misc/NEWS.d/next/Library/2026-07-20-12-40-00.gh-issue-145030.TFJm6k.rst @@ -1,3 +1,3 @@ -Fix :mod:`asyncio` write pipe transports for named FIFOs on macOS. Unread -data sitting in the FIFO made the transport misinterpret a poll event as -the reader disconnecting, wrongly closing the transport. +Fix :mod:`asyncio` write pipe transports for named FIFOs on macOS and Solaris. +Unread data sitting in the FIFO made the transport misinterpret a poll event +as the reader disconnecting, wrongly closing the transport.