]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-109981: Fix support.fd_count() on macOS 14 (#112797)
authorRonald Oussoren <ronaldoussoren@mac.com>
Thu, 7 Dec 2023 09:30:15 +0000 (10:30 +0100)
committerGitHub <noreply@github.com>
Thu, 7 Dec 2023 09:30:15 +0000 (10:30 +0100)
Use scanning "/dev/fd/" on macOS in support.fd_count(). That's both more efficient than scanning all possible file descriptors, and avoids crashing the interpreter when there are open "guarded" file descriptors.

"Guarded" file descriptors are a macOS feature where file descriptors used by system libraries are marked and cause hard crashes when used by "user" code.

Co-authored-by: Victor Stinner <vstinner@python.org>
Lib/test/support/os_helper.py
Misc/NEWS.d/next/macOS/2023-12-06-12-11-13.gh-issue-109981.mOHg10.rst [new file with mode: 0644]

index 46ae53aa11a91f5ac0ae5e4a66cf97787da03acc..7a67d87fb9e846e3b7aaccff2dde7590f4769d08 100644 (file)
@@ -592,10 +592,17 @@ def fd_count():
     """Count the number of open file descriptors.
     """
     if sys.platform.startswith(('linux', 'freebsd', 'emscripten')):
+        fd_path = "/proc/self/fd"
+    elif sys.platform == "darwin":
+        fd_path = "/dev/fd"
+    else:
+        fd_path = None
+
+    if fd_path is not None:
         try:
-            names = os.listdir("/proc/self/fd")
+            names = os.listdir(fd_path)
             # Subtract one because listdir() internally opens a file
-            # descriptor to list the content of the /proc/self/fd/ directory.
+            # descriptor to list the content of the directory.
             return len(names) - 1
         except FileNotFoundError:
             pass
diff --git a/Misc/NEWS.d/next/macOS/2023-12-06-12-11-13.gh-issue-109981.mOHg10.rst b/Misc/NEWS.d/next/macOS/2023-12-06-12-11-13.gh-issue-109981.mOHg10.rst
new file mode 100644 (file)
index 0000000..f86ab2c
--- /dev/null
@@ -0,0 +1,3 @@
+Use ``/dev/fd`` on macOS to determine the number of open files in
+``test.support.os_helper.fd_count`` to avoid a crash with "guarded" file
+descriptors when probing for open files.