]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-145030: Fix asyncio write pipe transport for named FIFOs on Solaris (#155110)
authorJakub Kulík <Kulikjak@gmail.com>
Mon, 3 Aug 2026 15:34:23 +0000 (17:34 +0200)
committerGitHub <noreply@github.com>
Mon, 3 Aug 2026 15:34:23 +0000 (15:34 +0000)
Lib/asyncio/unix_events.py
Lib/test/test_asyncio/test_events.py
Misc/NEWS.d/next/Library/2026-07-20-12-40-00.gh-issue-145030.TFJm6k.rst

index bb98f0014f81760b5bf78f45b4d38175c111f50c..94c5fb726e5933378f11e7771e382ac4ba7ba69e 100644 (file)
@@ -658,19 +658,19 @@ class _UnixWritePipeTransport(transports._FlowControlMixin,
         # 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)
index 3fdfffdb213efc20f4741a66f971854c73f51373..f7cd59a54199710fe5477820dc082271f30c6d3a 100644 (file)
@@ -1729,9 +1729,9 @@ class EventLoopTestsMixin:
                          "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)
index 2c6b07a4fa8b76f2f77f1f55a724f35246c28dba..2f1b717b40ea74af19fc58c996c28f1aee66ffdd 100644 (file)
@@ -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.