Skip to content

test_socket leaks file descriptors on macOS #80931

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
tirkarthi opened this issue Apr 29, 2019 · 24 comments
Open

test_socket leaks file descriptors on macOS #80931

tirkarthi opened this issue Apr 29, 2019 · 24 comments
Labels
3.11 only security fixes 3.12 only security fixes 3.13 bugs and security fixes OS-mac tests Tests in the Lib/test dir type-bug An unexpected behavior, bug, or error

Comments

@tirkarthi
Copy link
Member

tirkarthi commented Apr 29, 2019

BPO 36750
Nosy @vstinner, @giampaolo, @pablogsal, @remilapeyre, @tirkarthi

Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

Show more details

GitHub fields:

assignee = None
closed_at = None
created_at = <Date 2019-04-29.08:26:44.616>
labels = ['3.8', 'type-bug', 'library', '3.9', '3.10']
title = 'test_socket leaks file descriptors on macOS'
updated_at = <Date 2020-06-07.17:06:50.594>
user = 'https://github.com/tirkarthi'

bugs.python.org fields:

activity = <Date 2020-06-07.17:06:50.594>
actor = 'remi.lapeyre'
assignee = 'none'
closed = False
closed_date = None
closer = None
components = ['Library (Lib)']
creation = <Date 2019-04-29.08:26:44.616>
creator = 'xtreak'
dependencies = []
files = []
hgrepos = []
issue_num = 36750
keywords = []
message_count = 4.0
messages = ['341052', '341053', '341136', '370908']
nosy_count = 5.0
nosy_names = ['vstinner', 'giampaolo.rodola', 'pablogsal', 'remi.lapeyre', 'xtreak']
pr_nums = []
priority = 'normal'
resolution = None
stage = None
status = 'open'
superseder = None
type = 'behavior'
url = 'https://bugs.python.org/issue36750'
versions = ['Python 3.8', 'Python 3.9', 'Python 3.10']

Linked PRs

@tirkarthi
Copy link
Member Author

tirkarthi commented Apr 29, 2019

This PR #12271 has consistent build failures in test_socket even after merging the master branch.

Sample build failure : https://dev.azure.com/Python/cpython/_build/results?buildId=41411

I tried reproducing this and I can't reproduce it in Ubuntu. Mac OS seems to fail with leaked references which I think is unrelated to the above Azure failure. The Mac issue is open (bpo-35092 reported by Victor closed as duplicate of bpo-23828) but it was about warning though running with regrtest seems to leak references in addition to warnings.

Ubuntu build :

karthi@ubuntu-s-1vcpu-1gb-blr1-01:~/cpython$ ./python -m test -R 3:3 test_socket
Run tests sequentially
0:00:00 load avg: 0.01 [1/1] test_socket
beginning 6 repetitions
123456
......
test_socket passed in 3 min 7 sec

== Tests result: SUCCESS ==

1 test OK.

Total duration: 3 min 7 sec
Tests result: SUCCESS

Mac OS build (Mac OS 10.10.4 (14E46))

➜  cpython git:(master) ./python.exe -m test -R 3:3 test_socket
Run tests sequentially
0:00:00 load avg: 2.00 [1/1] test_socket
beginning 6 repetitions
123456
/Users/karthikeyansingaravelan/stuff/python/cpython/Lib/test/test_socket.py:2419: RuntimeWarning: received malformed or improperly-truncated ancillary data
  result = sock.recvmsg(bufsize, \*args)
/Users/karthikeyansingaravelan/stuff/python/cpython/Lib/test/test_socket.py:2510: RuntimeWarning: received malformed or improperly-truncated ancillary data
  result = sock.recvmsg_into([buf], \*args)
./Users/karthikeyansingaravelan/stuff/python/cpython/Lib/test/test_socket.py:2419: RuntimeWarning: received malformed or improperly-truncated ancillary data
  result = sock.recvmsg(bufsize, \*args)
/Users/karthikeyansingaravelan/stuff/python/cpython/Lib/test/test_socket.py:2510: RuntimeWarning: received malformed or improperly-truncated ancillary data
  result = sock.recvmsg_into([buf], \*args)
./Users/karthikeyansingaravelan/stuff/python/cpython/Lib/test/test_socket.py:2419: RuntimeWarning: received malformed or improperly-truncated ancillary data
  result = sock.recvmsg(bufsize, \*args)
/Users/karthikeyansingaravelan/stuff/python/cpython/Lib/test/test_socket.py:2510: RuntimeWarning: received malformed or improperly-truncated ancillary data
  result = sock.recvmsg_into([buf], \*args)
./Users/karthikeyansingaravelan/stuff/python/cpython/Lib/test/test_socket.py:2419: RuntimeWarning: received malformed or improperly-truncated ancillary data
  result = sock.recvmsg(bufsize, \*args)
/Users/karthikeyansingaravelan/stuff/python/cpython/Lib/test/test_socket.py:2510: RuntimeWarning: received malformed or improperly-truncated ancillary data
  result = sock.recvmsg_into([buf], \*args)
./Users/karthikeyansingaravelan/stuff/python/cpython/Lib/test/test_socket.py:2419: RuntimeWarning: received malformed or improperly-truncated ancillary data
  result = sock.recvmsg(bufsize, \*args)
/Users/karthikeyansingaravelan/stuff/python/cpython/Lib/test/test_socket.py:2510: RuntimeWarning: received malformed or improperly-truncated ancillary data
  result = sock.recvmsg_into([buf], \*args)
./Users/karthikeyansingaravelan/stuff/python/cpython/Lib/test/test_socket.py:2419: RuntimeWarning: received malformed or improperly-truncated ancillary data
  result = sock.recvmsg(bufsize, \*args)
/Users/karthikeyansingaravelan/stuff/python/cpython/Lib/test/test_socket.py:2510: RuntimeWarning: received malformed or improperly-truncated ancillary data
  result = sock.recvmsg_into([buf], \*args)
.
test_socket leaked [20, 20, 20] file descriptors, sum=60
test_socket failed in 2 min 31 sec

== Tests result: FAILURE ==

1 test failed:
    test_socket

Total duration: 2 min 31 sec
Tests result: FAILURE

@tirkarthi tirkarthi added 3.8 (EOL) end of life stdlib Python modules in the Lib dir type-bug An unexpected behavior, bug, or error labels Apr 29, 2019
@tirkarthi
Copy link
Member Author

bpo-35092 reported by Victor closed as duplicate of bpo-23828

Sorry, it was reported by Pablo in bpo-35092. I haven't seen any old reports of this in search. The other buildbots on Ubuntu run fine so not sure if it's only for Azure and Ubuntu for the PR since master is green on Azure and the buildbots so feel free to close this if needed.

@vstinner vstinner changed the title test_socket failed (env changed) on Azure pipeline test_socket leaks file descriptors on macOS Apr 29, 2019
@tirkarthi
Copy link
Member Author

tirkarthi commented Apr 30, 2019

The test failure is reproducible on the PR 12271 merging master branch on Ubuntu with -R 3:3 test_socket. Sorry, I tried it initially on master thinking it was a master branch problem. I don't see C related code in the PR. There was a merge commit [0] after which the failure is consistently reproducible. I tried reverting parts of the PR to narrow down the failure and happened to come across the below statement in the diff where the test object and elapsed test for time are stored to be printed later. Commenting out the call makes tests pass for test_socket and much more baffling is that changing the code to use list instead of tuple causes the error to go away. Also I tried changing append to use extend or just to append test object instead of a tuple of test object and elapsed time which all pass. Instead of using test object in tuple just using (object(), elapsed) as a tuple also causes failure. I guess there is something with tuples here but it doesn't make much sense.

On trying to bisect the merge commit I have narrowed down the below commits where the PR passes with tuple itself and then fails. In between the success and failure commit there were some changes made to hunterleaks and socket.create_server utility was added.

f66e336 (success)
58721a9 (success)
2b00db6 (fails)

# Sample failure on PR's HEAD on Ubuntu

⋊\> \~/cpython on pr_12271  ./python -m test --fail-env-changed -R 3:3 test_socket                                                                                                                    05:45:52
Run tests sequentially
0:00:00 load avg: 0.22 [1/1] test_socket
beginning 6 repetitions
123456
Warning -- threading_cleanup() failed to cleanup 0 threads (count: 0, dangling: 5)
Dangling thread: \<Thread(Thread-3, stopped 140152613795584)\>
Dangling thread: \<Thread(Thread-1, stopped 140152613795584)\>
Dangling thread: \<Thread(Thread-4, stopped 140152613795584)\>
Dangling thread: \<Thread(Thread-2, stopped 140152613795584)\>
Dangling thread: \<_MainThread(MainThread, started 140152731227904)\>
......
test_socket failed (env changed) in 3 min 6 sec

== Tests result: ENV CHANGED ==

1 test altered the execution environment:
    test_socket

Total duration: 3 min 6 sec
Tests result: ENV CHANGED

The below patch on the PR to use list causes the tests to pass but I am highly confused over how changing to tuple to list fixes this and this might potentially be hiding a bug.

$ git diff
diff --git a/Lib/unittest/result.py b/Lib/unittest/result.py
index 273ca3beef..b8fd714679 100644
--- a/Lib/unittest/result.py
+++ b/Lib/unittest/result.py
@@ -160,7 +160,7 @@ class TestResult(object):
     def addDuration(self, test, elapsed):
         """Called when a test finished to run, regardless of its outcome."""
-        self.collectedDurations.append((test, elapsed))
+        self.collectedDurations.append([test, elapsed])
     def wasSuccessful(self):
         """Tells whether or not this result was a success."""

[0] 3c4af91

@remilapeyre
Copy link
Mannequin

remilapeyre mannequin commented Jun 7, 2020

I think I stumbled on this too, I think the test that causes some issue is testCmsgTrunc2Int:

./python -m test -R: test_socket -m testCmsgTrunc2Int    
0:00:00 load avg: 1.66 Run tests sequentially
0:00:00 load avg: 1.66 [1/1] test_socket
beginning 9 repetitions
123456789
.........
test_socket leaked [2, 2, 2, 2] file descriptors, sum=8
test_socket failed

== Tests result: FAILURE ==

1 test failed:
    test_socket

Total duration: 2.0 sec
Tests result: FAILURE

There is some file descriptors that are created by newFDs() but they are supposed to be cleaned up, maybe it is some race condition as I see that test_socket create a thread for each test?

@remilapeyre remilapeyre mannequin added 3.9 only security fixes 3.10 only security fixes labels Jun 7, 2020
@ezio-melotti ezio-melotti transferred this issue from another repository Apr 10, 2022
@Eclips4 Eclips4 added the OS-mac label Aug 12, 2023
@Eclips4
Copy link
Member

Eclips4 commented Aug 12, 2023

This still reproducible on current main and seems that hasn't been fixed yet.
Trace:

./python.exe -m test -q test_socket
0:00:00 load avg: 2.44 Run tests sequentially
/Users/admin/Projects/cpython/Lib/test/test_socket.py:2940: RuntimeWarning: received malformed or improperly-truncated ancillary data
  result = sock.recvmsg_into([buf], *args)
/Users/admin/Projects/cpython/Lib/test/test_socket.py:2849: RuntimeWarning: received malformed or improperly-truncated ancillary data
  result = sock.recvmsg(bufsize, *args)
test_socket passed in 58.0 sec

== Tests result: SUCCESS ==

Total duration: 58.0 sec
Tests result: SUCCESS

Refleaks:

./python.exe -m test -R 3:3 test_socket -m testCmsgTrunc2Int
0:00:00 load avg: 3.14 Run tests sequentially
0:00:00 load avg: 3.14 [1/1] test_socket
beginning 6 repetitions
123456
......
test_socket leaked [2, 2, 2] file descriptors, sum=6
test_socket failed (reference leak)

== Tests result: FAILURE ==

1 test failed:
    test_socket

Total duration: 354 ms
Tests result: FAILURE

@Eclips4 Eclips4 added tests Tests in the Lib/test dir 3.11 only security fixes 3.12 only security fixes 3.13 bugs and security fixes and removed 3.10 only security fixes 3.9 only security fixes 3.8 (EOL) end of life stdlib Python modules in the Lib dir labels Aug 12, 2023
@sobolevn
Copy link
Member

sobolevn commented Aug 17, 2023

Looks like this condition is never executed on macos:

if (cmsg_level == socket.SOL_SOCKET and
cmsg_type == socket.SCM_RIGHTS):
fds = array.array("i")
fds.frombytes(cmsg_data[:
len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
for fd in fds:
os.close(fd)
Because recvmsg_result is something like: (b'Michael Gilfix was here\xe1\x88\xb4\r\n', [], 32, None)

Ideas? :)

@corona10
Copy link
Member

corona10 commented Jan 14, 2024

lsof output:

➜  ~ lsof -p 56481
COMMAND     PID USER   FD      TYPE             DEVICE  SIZE/OFF                NODE NAME
python.ex 56481 user  cwd       DIR               1,17        64           128492460 /Users/user/oss/cpython/build/test_python_worker_56481æ
python.ex 56481 user  txt       REG               1,17   7899879           128473815 /Users/user/oss/cpython/python.exe
python.ex 56481 user  txt       REG               1,17     47012           128389057 /Library/Preferences/Logging/.plist-cache.ZPpiyLmd
python.ex 56481 user  txt       REG               1,17     57195           128473577 /Users/user/oss/cpython/Modules/_bisect.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17     59659           128473585 /Users/user/oss/cpython/Modules/_random.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17   2177216 1152921500312782999 /usr/lib/dyld
python.ex 56481 user  txt       REG               1,17    114952           128473594 /Users/user/oss/cpython/Modules/math.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17     60475           128473584 /Users/user/oss/cpython/Modules/_opcode.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17     59194           128473579 /Users/user/oss/cpython/Modules/_heapq.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17     96363           128473588 /Users/user/oss/cpython/Modules/_struct.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17     53673           128473627 /Users/user/oss/cpython/Modules/fcntl.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17     60036           128473631 /Users/user/oss/cpython/Modules/_posixsubprocess.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17    178443           128473587 /Users/user/oss/cpython/Modules/_pickle.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17     63816           128473602 /Users/user/oss/cpython/Modules/_bz2.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17     85242           128473633 /Users/user/oss/cpython/Modules/select.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17     90424           128473606 /Users/user/oss/cpython/Modules/zlib.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17     55020           128473632 /Users/user/oss/cpython/Modules/resource.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17     87385           128473603 /Users/user/oss/cpython/Modules/_lzma.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17     86473           128473580 /Users/user/oss/cpython/Modules/_json.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17    625229           128473654 /Users/user/oss/cpython/Modules/_testcapi.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17     61242           128473586 /Users/user/oss/cpython/Modules/_queue.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17    184864           120064543 /opt/homebrew/Cellar/xz/5.4.5/lib/liblzma.5.dylib
python.ex 56481 user  txt       REG               1,17    135979           128487579 /Users/user/oss/cpython/Modules/_socket.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17    119017           128473575 /Users/user/oss/cpython/Modules/array.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17     79900           128473601 /Users/user/oss/cpython/Modules/binascii.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17    746959           128473628 /Users/user/oss/cpython/Modules/unicodedata.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17    157469           128473600 /Users/user/oss/cpython/Modules/_datetime.cpython-313d-darwin.so
python.ex 56481 user  txt       REG               1,17    261435           128473670 /Users/user/oss/cpython/Modules/pyexpat.cpython-313d-darwin.so
python.ex 56481 user    0u      CHR               16,0 0t1803801                 701 /dev/ttys000
python.ex 56481 user    1u      CHR               16,0 0t1803801                 701 /dev/ttys000
python.ex 56481 user    2u      CHR               16,0 0t1803801                 701 /dev/ttys000
python.ex 56481 user    3   NPOLICY
python.ex 56481 user    4u    systm 0xb5ae8c0ef32ea761       0t0                     [ctl com.apple.netsrc id 6 unit 54]
python.ex 56481 user    5u     unix 0xb5ae8c0ef3931251       0t0                     ->0xb5ae8c0ef3931319
python.ex 56481 user    6u     IPv4 0xb5ae8c1d573a8c49       0t0                 TCP localhost:53294 (LISTEN)
python.ex 56481 user    7u      REG               1,17         1           128492488 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp8d9yz1z8
python.ex 56481 user    8u      REG               1,17         1           128492491 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpe3f4kyuv
python.ex 56481 user    9u      REG               1,17         1           128492494 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpcwva8lfd
python.ex 56481 user   10u      REG               1,17         1           128492497 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpc9xqbwic
python.ex 56481 user   11u      REG               1,17         1           128492500 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpba79keg7
python.ex 56481 user   12u      REG               1,17         1           128492503 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpq83gpo6a
python.ex 56481 user   13u      REG               1,17         1           128492515 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp96c_gy91
python.ex 56481 user   14u      REG               1,17         1           128492575 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpjnj7lxzo
python.ex 56481 user   15u      REG               1,17         1           128492578 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpsspue4yk
python.ex 56481 user   16u      REG               1,17         1           128492504 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpl6ao8_ph
python.ex 56481 user   17u      REG               1,17         1           128492581 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpkngzx9dl
python.ex 56481 user   18u      REG               1,17         1           128492508 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpk2k63ghe
python.ex 56481 user   19u      REG               1,17         1           128492512 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp852qdk1h
python.ex 56481 user   20u      REG               1,17         1           128492584 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpu662of98
python.ex 56481 user   21u      REG               1,17         1           128492587 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpt38b29ow
python.ex 56481 user   22u      REG               1,17         1           128492590 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpuqwilz5d
python.ex 56481 user   23u      REG               1,17         1           128492602 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp27nusgha
python.ex 56481 user   24u      REG               1,17         1           128492758 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpqlg14c5b
python.ex 56481 user   25u      REG               1,17         1           128492761 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpr_lg4967
python.ex 56481 user   26u      REG               1,17         1           128492591 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp44dcueos
python.ex 56481 user   27u      REG               1,17         1           128492764 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpzdw475e_
python.ex 56481 user   28u      REG               1,17         1           128492595 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpk05x8vsn
python.ex 56481 user   29u      REG               1,17         1           128492599 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp8lkjppvw
python.ex 56481 user   30u      REG               1,17         1           128492767 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp9jca0anz
python.ex 56481 user   31u      REG               1,17         1           128492770 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp27104sem
python.ex 56481 user   32u      REG               1,17         1           128492773 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpuus1ll3s
python.ex 56481 user   33u      REG               1,17         1           128492785 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpb22lccjg
python.ex 56481 user   34u      REG               1,17         1           128492846 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpc9h0bjtt
python.ex 56481 user   35u      REG               1,17         1           128492849 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpdwhdue2p
python.ex 56481 user   36u      REG               1,17         1           128492774 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpaolycr15
python.ex 56481 user   37u      REG               1,17         1           128492852 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmptd1ct8oj
python.ex 56481 user   38u      REG               1,17         1           128492778 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp2t7_fysy
python.ex 56481 user   39u      REG               1,17         1           128492782 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpfutqt0kx
python.ex 56481 user   40u      REG               1,17         1           128492855 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpj74p5c_u
python.ex 56481 user   41u      REG               1,17         1           128492858 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp19v1s9wa
python.ex 56481 user   42u      REG               1,17         1           128492861 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpkdy7ol4a
python.ex 56481 user   43u      REG               1,17         1           128492873 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp3xe9i6_w
python.ex 56481 user   44u      REG               1,17         1           128493018 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmprutjq5gr
python.ex 56481 user   45u      REG               1,17         1           128493021 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmppkwsti0n
python.ex 56481 user   46u      REG               1,17         1           128492862 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpe1hl1swe
python.ex 56481 user   47u      REG               1,17         1           128493024 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpvex61j8a
python.ex 56481 user   48u      REG               1,17         1           128492866 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpabur0894
python.ex 56481 user   49u      REG               1,17         1           128492870 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpg9zmkt6a
python.ex 56481 user   50u      REG               1,17         1           128493027 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp7wvdu_e2
python.ex 56481 user   51u      REG               1,17         1           128493030 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp6cdue4mi
python.ex 56481 user   52u      REG               1,17         1           128493033 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpcmzcvs6z
python.ex 56481 user   53u      REG               1,17         1           128493045 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpcm_e6ovu
python.ex 56481 user   54u      REG               1,17         1           128493108 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp8909f6mr
python.ex 56481 user   55u      REG               1,17         1           128493111 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpmqllvgfu
python.ex 56481 user   56u      REG               1,17         1           128493034 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpxyoe7qdd
python.ex 56481 user   57u      REG               1,17         1           128493114 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp003a_xj0
python.ex 56481 user   58u      REG               1,17         1           128493038 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpbu6poz1b
python.ex 56481 user   59u      REG               1,17         1           128493042 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpusmf03j9
python.ex 56481 user   60u      REG               1,17         1           128493117 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpgsc0pa7n
python.ex 56481 user   61u      REG               1,17         1           128493120 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmprtg_2gjw
python.ex 56481 user   62u      REG               1,17         1           128493123 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp2guehqvg
python.ex 56481 user   63u      REG               1,17         1           128493135 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpvde1y3vk
python.ex 56481 user   64u      REG               1,17         1           128493286 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp6octnw6o
python.ex 56481 user   65u      REG               1,17         1           128493289 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpzmxc40du
python.ex 56481 user   66u      REG               1,17         1           128493124 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp8ch64rp9
python.ex 56481 user   67u      REG               1,17         1           128493292 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp2ehixcv8
python.ex 56481 user   68u      REG               1,17         1           128493128 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpj8u156jx
python.ex 56481 user   69u      REG               1,17         1           128493132 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpe7wozth4
python.ex 56481 user   70u      REG               1,17         1           128493295 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpersl_nhv
python.ex 56481 user   71u      REG               1,17         1           128493298 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpiaw87k07
python.ex 56481 user   72u      REG               1,17         1           128493301 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpnahrjuba
python.ex 56481 user   73u      REG               1,17         1           128493313 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp564eauc0
python.ex 56481 user   74u      REG               1,17         1           128493374 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmppm_cgyde
python.ex 56481 user   75u      REG               1,17         1           128493377 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpvoz9n1b7
python.ex 56481 user   76u      REG               1,17         1           128493302 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp2bg1129h
python.ex 56481 user   77u      REG               1,17         1           128493380 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp7o858_h6
python.ex 56481 user   78u      REG               1,17         1           128493306 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpbgtgj71r
python.ex 56481 user   79u      REG               1,17         1           128493310 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpx1dfbt8n
python.ex 56481 user   80u      REG               1,17         1           128493383 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp5vwmjz9g
python.ex 56481 user   81u      REG               1,17         1           128493386 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp4r6yojjz
python.ex 56481 user   82u      REG               1,17         1           128493389 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpbw0t54mg
python.ex 56481 user   83u      REG               1,17         1           128493401 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp7wdzgfkd
python.ex 56481 user   84u      REG               1,17         1           128493545 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp6tc00jey
python.ex 56481 user   85u      REG               1,17         1           128493548 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpi8gp70em
python.ex 56481 user   86u      REG               1,17         1           128493390 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpi73e8nte
python.ex 56481 user   87u      REG               1,17         1           128493551 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp2m2jxxh5
python.ex 56481 user   88u      REG               1,17         1           128493394 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp5_jjuhef
python.ex 56481 user   89u      REG               1,17         1           128493398 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp35xbm31l
python.ex 56481 user   90u      REG               1,17         1           128493554 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp9804km54
python.ex 56481 user   91u      REG               1,17         1           128493557 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp9iw2v7u7
python.ex 56481 user   92u      REG               1,17         1           128493560 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpoidwe45p
python.ex 56481 user   93u      REG               1,17         1           128493572 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp908lv7fc
python.ex 56481 user   94u      REG               1,17         1           128493641 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpje3pb529
python.ex 56481 user   95u      REG               1,17         1           128493644 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpxvplifx7
python.ex 56481 user   96u      REG               1,17         1           128493561 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpm2n2_vmn
python.ex 56481 user   97u      REG               1,17         1           128493647 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpa_bo2bjm
python.ex 56481 user   98u      REG               1,17         1           128493565 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpknmom1kw
python.ex 56481 user   99u      REG               1,17         1           128493569 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp4ne0yag7
python.ex 56481 user  100u      REG               1,17         1           128493650 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp63cyoxr9
python.ex 56481 user  101u      REG               1,17         1           128493653 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpcyq0lcbk
python.ex 56481 user  102u      REG               1,17         1           128493656 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp7c9hox50
python.ex 56481 user  103u      REG               1,17         1           128493669 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpc11lnj1w
python.ex 56481 user  104u      REG               1,17         1           128493855 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpp707y0ul
python.ex 56481 user  105u      REG               1,17         1           128493858 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp8poa90pg
python.ex 56481 user  106u      REG               1,17         1           128493657 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpis93xg3d
python.ex 56481 user  107u      REG               1,17         1           128493861 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpxn5uvsa7
python.ex 56481 user  108u      REG               1,17         1           128493662 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpi0zc8a2o
python.ex 56481 user  109u      REG               1,17         1           128493666 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpwxbe8xks
python.ex 56481 user  110u      REG               1,17         1           128493864 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpuuawl2z7
python.ex 56481 user  111u      REG               1,17         1           128493867 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp1pgapom_
python.ex 56481 user  112u      REG               1,17         1           128493870 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpkjvjyjpg
python.ex 56481 user  113u      REG               1,17         1           128493882 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp09u70ffy
python.ex 56481 user  114u      REG               1,17         1           128493943 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpuj0tor7l
python.ex 56481 user  115u      REG               1,17         1           128493946 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp8d91hlnl
python.ex 56481 user  116u      REG               1,17         1           128493871 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpsgcqnhb7
python.ex 56481 user  117u      REG               1,17         1           128493949 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp53_ks9k0
python.ex 56481 user  118u      REG               1,17         1           128493875 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmphm9uxt07
python.ex 56481 user  119u      REG               1,17         1           128493879 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpt65kazu9
python.ex 56481 user  120u      REG               1,17         1           128493952 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp1ue7_3ea
python.ex 56481 user  121u      REG               1,17         1           128493955 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmps_r9o_s2
python.ex 56481 user  122u      REG               1,17         1           128493958 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpg55pm3hs
python.ex 56481 user  123u      REG               1,17         1           128493970 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmp3hatg7ke
python.ex 56481 user  124u     IPv4 0xb5ae8c1d5854f719       0t0                 TCP localhost:53295->localhost:53294 (ESTABLISHED)
python.ex 56481 user  125u     IPv4 0xb5ae8c1d5739a179       0t0                 TCP localhost:53294->localhost:53295 (ESTABLISHED)
python.ex 56481 user  126u      REG               1,17         1           128493959 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpak0h03b5
python.ex 56481 user  128u      REG               1,17         1           128493963 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpgscvkdc5
python.ex 56481 user  129u      REG               1,17         1           128493967 /private/var/folders/xf/8mmvc8hx4ld687g2bp49zmkw0000gn/T/tmpj0cymroc

My research for #114049 was that temp files are not closed at all and it's increased for every iteration.

@Eclips4
Copy link
Member

Eclips4 commented Jan 14, 2024

My research for #114049 was that temp files are not closed at all and it's increased for every iteration.

Yep, read the #80931 (comment)

@corona10
Copy link
Member

corona10 commented Jan 14, 2024

@Eclips4

Yep, read the #80931 (comment)

So, what's the conclusion of this issue?
IMO, #80931 (comment) is not an accurate point
because it is actually executed in macOS. if you remove the os.close from LINE 3602, more files are leaked.

test_socket leaked [44, 44, 44] file descriptors, sum=132
test_socket failed (reference leak) in 3 min 4 sec

@corona10
Copy link
Member

@ncoghlan Can you please take a look at this issue?

@corona10
Copy link
Member

corona10 commented Jan 14, 2024

10 leaks from RecvmsgSCMRightsStreamTest of #80931 (comment)
10 leaks from RecvmsgIntoSCMRightsStreamTest of #80931 (comment)

It's a cross-checked point with other comments.

@ncoghlan
Copy link
Contributor

ncoghlan commented Jan 14, 2024

Adding some of the historical links that are a bit hard to trace post GitHub migration:

Re-reading #57167 in particular suggests that the tests were working around some things simply not working on Mac OS X at the time, and hence may no longer be doing the right thing if the underlying macOS issues have subsequently been fixed.

@ronaldoussoren
Copy link
Contributor

Looks like this condition is never executed on macos:

if (cmsg_level == socket.SOL_SOCKET and
cmsg_type == socket.SCM_RIGHTS):
fds = array.array("i")
fds.frombytes(cmsg_data[:
len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
for fd in fds:
os.close(fd)

Because recvmsg_result is something like: (b'Michael Gilfix was here\xe1\x88\xb4\r\n', [], 32, None)
Ideas? :)

This could be due to a bug in macOS. Do you known what the sender tries to send?

@corona10
Copy link
Member

corona10 commented Jan 14, 2024

@ronaldoussoren
I recorded some packet data that can be matched with randomly generated integer keys.
array('i') meant there was no data.

sent: b'58Michael Gilfix was here\xe1\x88\xb4\r\n', [15]
sent: b'51Michael Gilfix was here\xe1\x88\xb4\r\n', [20]
sent: b'12Michael Gilfix was here\xe1\x88\xb4\r\n', [20]
sent: b'99Michael Gilfix was here\xe1\x88\xb4\r\n', [20]
recv: b'99Michael Gilfix was here\xe1\x88\xb4', array('i')
sent: b'25Michael Gilfix was here\xe1\x88\xb4\r\n', [23]
sent: b'7Michael Gilfix was here\xe1\x88\xb4\r\n', [24, 25]
recv: b'7Michael Gilfix was here\xe1\x88\xb4\r', array('i')
sent: b'93Michael Gilfix was here\xe1\x88\xb4\r\n', [25, 27]
recv: b'93Michael Gilfix was here\xe1\x88\xb4', array('i', [23])
sent: b'51Michael Gilfix was here\xe1\x88\xb4\r\n', [24, 27]
recv: b'51Michael Gilfix was here\xe1\x88\xb4', array('i', [23])
sent: b'81Michael Gilfix was here\xe1\x88\xb4\r\n', [25]
sent: b'68Michael Gilfix was here\xe1\x88\xb4\r\n', [27]
recv: b'68Michael Gilfix was here\xe1\x88\xb4', array('i', [24])
sent: b'0Michael Gilfix was here\xe1\x88\xb4\r\n', [27, 30, 31, 32]
recv: b'0Michael Gilfix was here\xe1\x88\xb4\r', array('i', [24, 33, 34, 35])
sent: b'Michael Gilfix was here\xe1\x88\xb4\r\n', [27]
recv: b'Michael Gilfix was here\xe1\x88\xb4\r\n', array('i', [24])
sent: b'16Michael Gilfix was here\xe1\x88\xb4\r\n', [27, 30, 31, 32]
recv: b'16Michael Gilfix was here\xe1\x88\xb4\r\n', array('i', [24, 33, 34, 35])

@ronaldoussoren
Copy link
Contributor

ronaldoussoren commented Jan 14, 2024

I'm doing some old school elimination by commenting out tests...

Tests which cause fd leaks when enabled:

  • testCmsgTruncNoBufSize
  • testCmsgTrunc0
  • testCmsgTrunc1
  • testCmsgTrunc2Int

I expected the other truncating tests below testCmsgTrunc2Int will also fail, which would explain all fd leaks.

The commonality with all these tests is that they send fds, but don't receive them due to (in general) not having the buffer space for that.

I guess we should try to reproduce this using a C program that does the same thing as one of these tests. If that works then (1) file a bug with Apple and (2) either disable these tests on macOS or come up implement a workaround for the tests.

@corona10
Copy link
Member

corona10 commented Jan 14, 2024

Since the issue is quite old(?) can we just exclude specific tests from refleak tests only on macOS for the temporal action?
I am worried that we will miss other refleak failures from buildbot that we misrecognize other failures as the current issue from the free-threading refleak test.

(Sorry.. difficult to explain in English what I worry about, I am simply worrying that we can miss true-negative failure for other cases)

@ronaldoussoren
Copy link
Contributor

That would be best, but I don't know if there's an easy way to detect if we're running ref leaks tests. From what I've found so far there is no way to get from a test function / test case to the RunTests object that knows if we're hunting for releaks.

Disabling these tests entirely on macOS is easy, but suboptimal.

It should be possible to add helpers to check for this with some changes to (lib)regrtest.

@ronaldoussoren
Copy link
Contributor

The linked draft PR avoids the FD leaks by effectively skipping the problematic tests when detecting a refleak hunting run on macOS.

The way the PR detects such a run is gross and shouldn't be merged. If the general approach is OK (that is, detect a refleak hunting run and skip tests) there should be a better interface.

Something we could do:

  • Have a test.support.hunting_for_refleaks function that checks a global flag in that module
  • Have test.libregrtest.refleaks.runtest_refleak set this flag while running tests

The integration into the test functions is also not optimal, could be make nicer with two new decorators:

@skipForRefleakingHuntingIf(sys.platform == "darwin")
def testCmsgTrunc0(self):
     ...

@testCmsgTrunk0.client_skip
def _testCmsgTrunc0(self):
    ...

The latter mirrors skipWithClientIf, but would have a different implementation because the skipForRefleakingHuntingIf decorator needs to do something at test time instead of at load time.

@ronaldoussoren
Copy link
Contributor

I've updated the PR:

  • Testing for a ref leaking run is not integrated into test.libregrtest and test.support.refleak_helper
  • Using decorators to skip tests while hunting for refleaks

The decorators are still part of test_socket, but that's primarily because I mirrored the client_skip functionality as sketched in my previous message. Maybe it is better to move the skip function to test.support.refleak_helper and have a new decorator in test_socket that replaces the client_skip logic.

@itamaro
Copy link
Contributor

itamaro commented Jan 14, 2024

thanks for the @-mention on the other issue @corona10 !
just wanted to mention that this buildbot is now covering refleaks on macOS. it was originally intended to provide free-threaded macOS refleaks coverage, but since it was consistently failing (due to this issue), I changed it to cover the default (with GIL) configuration until it is fixed.
this means you can invoke this builder on PRs using the correct incantation :)

I don't think it's related, but worth calling out that the ASAN macOS builder has also been failing consistently (3 failing tests: test_cmd_line test_posix test_subprocess). I can file a separate issue (or search for an existing one).

@corona10
Copy link
Member

@itamaro

Well, it's not reproducible on my local machine.
But all failures are about missing file descriptors; it could be a local system issue.
Apparently, it's worth creating an issue on the build bot repo.

➜  cpython git:(main) ✗ ./python.exe -m test test_cmd_line test_posix test_subprocess -R 3:3
Using random seed: 2522577964
Raised RLIMIT_NOFILE: 256 -> 1024
0:00:00 load avg: 2.02 Run 3 tests sequentially
0:00:00 load avg: 2.02 [1/3] test_cmd_line
beginning 6 repetitions
123456
......
0:00:22 load avg: 2.80 [2/3] test_posix
beginning 6 repetitions
123456
......
0:00:30 load avg: 2.73 [3/3] test_subprocess
beginning 6 repetitions
123456
......
test_subprocess passed in 1 min 51 sec

== Tests result: SUCCESS ==

All 3 tests OK.

Total duration: 2 min 22 sec
Total tests: run=485 skipped=85
Total test files: run=3/3
Result: SUCCESS

@itamaro
Copy link
Contributor

itamaro commented Jan 15, 2024

@itamaro

Well, it's not reproducible on my local machine. But all failures are about missing file descriptors; it could be a local system issue. Apparently, it's worth creating an issue on the build bot repo.
...

python/buildmaster-config#450

ronaldoussoren added a commit to ronaldoussoren/cpython that referenced this issue Jan 21, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
ronaldoussoren added a commit that referenced this issue Jan 21, 2024
…114057)

Some socket tests related to sending file descriptors cause a file descriptor leak on macOS, all of them tests that send one or more descriptors than cannot be received on the read end.  This appears to be a platform bug.

This PR skips those tests when doing a refleak test run to avoid hiding other problems.
@ronaldoussoren
Copy link
Contributor

I've filed an issue with Apple about this: FB1354223

The attached program reproduces the issue. When run without arguments it sends and receives two file descriptors, when run with arguments the receive buffer is too small and the proces leaks file descriptors.

/*
 * This program sends and receives a number of file descriptors between
 * a socket pair.
 *
 * To build:
 * $ cc -o repro repro.c
 *
 * There are two options to run:
 *
 * - Run with a buffer that's the right size to receive file descriptors:
 *
 *   $ ./repro
 *
 * - Run with a too small buffer:
 *
 *   $ ./repro arg
 *
 * The former works as expected, the latter leaks a file descriptor.
 */
#include <dirent.h>
#include <stdio.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>

#define NUM_FD 2


int fd_count()
{
    int count = 0;
    DIR* dir;
    struct dirent* ent;

    dir = opendir("/dev/fd");
    if (dir == NULL) {
        perror("opendir");
        return -1;
    }

    for (ent = readdir(dir); ent != NULL; ent = readdir(dir)) {
        count += 1;
    }

    closedir(dir);

    /* opendir uses a file descriptor */
    count -= 1;
    return count;
}



int main(int argc, char** argv)
{
    int fd[2];
    int r;
    int data_fds[NUM_FD];
    int before, after;
    int data;
    int xit = 0;

    /*
     * Setup: Create a socket pair for sending an receving
     *        and open a file to send.
     */

    r = socketpair(AF_UNIX, SOCK_STREAM, 0, fd);
    if (r == -1) {
        perror("socketpair");
        return 1;
    }

    for (int i = 0; i < NUM_FD; i++) {
        data_fds[i] = open("/dev/zero", O_RDONLY);
        if (data_fds[i] == -1) {
            perror("open data_fd");
            return 1;
        }
    }

    before = fd_count();
    if (before == -1) {
        return 1;
    }

    /*
     * Send file desciptors using SCM_RIGHTS
     */
    {
        struct msghdr msg = { 0 };
        struct cmsghdr* cmsg;
        union {
            char buf[CMSG_SPACE(sizeof(data_fds))];
            struct cmsghdr align;
        } u;
        struct iovec vec;

        msg.msg_name = NULL;
        msg.msg_namelen = 0;
        msg.msg_control = u.buf;
        msg.msg_controllen = sizeof(u.buf);

        data = 1234;
        msg.msg_iov = &vec;
        msg.msg_iovlen = 1;
        vec.iov_base = &data;
        vec.iov_len = sizeof(data);

        cmsg = CMSG_FIRSTHDR(&msg);
        cmsg->cmsg_level = SOL_SOCKET;
        cmsg->cmsg_type = SCM_RIGHTS;
        cmsg->cmsg_len = CMSG_LEN(sizeof(int) * NUM_FD);
        memcpy((int *)CMSG_DATA(cmsg), data_fds, NUM_FD * sizeof(int));

        r = sendmsg(fd[0], &msg, 0);
        if (r == -1) {
            perror("sendmsg");
            return 1;
        }
    }

    /*
     * Receive file descriptors
     */

    {
        struct msghdr recv_msg = { 0 };
        int recv_fds[NUM_FD];
        int recv_data;
        struct iovec recv_vec;
        struct cmsghdr* recv_cmsg;
        char recv_ch;

        union {
            char buf[CMSG_SPACE(sizeof(recv_fds))];
            struct cmsghdr align;
        } recv_u;

        union {
            char buf[0];
            struct cmsghdr align;
        } recv_u_small;

        recv_msg.msg_name = NULL;
        recv_msg.msg_namelen = 0;
        recv_msg.msg_iov = &recv_vec;
        recv_msg.msg_iovlen = 1;
        recv_vec.iov_base = &recv_data;
        recv_vec.iov_len = sizeof(recv_data);

        if (argc == 1) {
            recv_msg.msg_control = recv_u.buf;
            recv_msg.msg_controllen = sizeof(recv_u.buf);
        } else {
            recv_msg.msg_control = recv_u_small.buf;
            recv_msg.msg_controllen = sizeof(recv_u_small.buf);
        }

        r = recvmsg(fd[1], &recv_msg, 0);
        if (r == -1) {
            perror("recvmsg");
            return 1;
        }

        recv_cmsg = CMSG_FIRSTHDR(&recv_msg);
        if (recv_cmsg == NULL) {
            fputs("No control message received\n", stderr);
            xit = 3;
            goto done;
        }

        if (recv_cmsg->cmsg_level != SOL_SOCKET || recv_cmsg->cmsg_type != SCM_RIGHTS) {
            fputs("Unexpected control message", stderr);
            xit = 3;
            goto done;
        }

        memcpy(recv_fds, CMSG_DATA(recv_cmsg), sizeof(recv_fds));
        fputs("Received fds", stdout);
        for (int i = 0; i < NUM_FD; i++) {
            printf("%c %d", i == 0?':':',', recv_fds[i]);
            close(recv_fds[i]);
        }
        fputs("\n", stdout);
    }

    /* Test assertions */

done:
    after = fd_count();
    if (after == -1) {
        return 1;
    }

    if (after != before) {
        printf("Number of open descriptors changed: before=%d after=%d\n", before, after);
        return 2;
    }

    return xit;
}

miss-islington pushed a commit to miss-islington/cpython that referenced this issue Jan 21, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
…macOS (pythonGH-114057)

Some socket tests related to sending file descriptors cause a file descriptor leak on macOS, all of them tests that send one or more descriptors than cannot be received on the read end.  This appears to be a platform bug.

This PR skips those tests when doing a refleak test run to avoid hiding other problems.
(cherry picked from commit 5adff3f)

Co-authored-by: Ronald Oussoren <ronaldoussoren@mac.com>
miss-islington pushed a commit to miss-islington/cpython that referenced this issue Jan 21, 2024
…macOS (pythonGH-114057)

Some socket tests related to sending file descriptors cause a file descriptor leak on macOS, all of them tests that send one or more descriptors than cannot be received on the read end.  This appears to be a platform bug.

This PR skips those tests when doing a refleak test run to avoid hiding other problems.
(cherry picked from commit 5adff3f)

Co-authored-by: Ronald Oussoren <ronaldoussoren@mac.com>
Dev-Mw added a commit to Dev-Mw/cpython that referenced this issue Jan 21, 2024
* gh-111926: Set up basic sementics of weakref API for freethreading (gh-113621)

---------

Co-authored-by: Sam Gross <colesbury@gmail.com>

* gh-113603: Compiler no longer tries to maintain the no-empty-block invariant (#113636)

* gh-113258: Write frozen modules to the build tree on Windows (GH-113303)

This ensures the source directory is not modified at build time, and different builds (e.g. different versions or GIL vs no-GIL) do not have conflicts.

* Document the `co_lines` method on code objects (#113682)

Co-authored-by: Hugo van Kemenade <hugovk@users.noreply.github.com>

* gh-52161: Enhance Cmd support for docstrings (#110987)

In `cmd.Cmd.do_help` call `inspect.cleandoc()`,
to clean indentation and remove leading/trailing empty
lines from a dosctring before printing.

* GH-113689: Fix broken handling of invalid executors (GH-113694)

* gh-113696: Docs: Annotate PyObject_CallOneArg and PyObject_CallNoArgs as returning a strong reference (#113697)

* gh-113569: Display calls in Mock.assert_has_calls failure when empty (GH-113573)

* gh-113538: Don't error in stream reader protocol callback when task is cancelled (#113690)

* GH-113225: Speed up `pathlib.Path.glob()` (#113226)

Use `os.DirEntry.path` as the string representation of child paths, unless
the parent path is empty, in which case we use the entry `name`.

* gh-112532: Isolate abandoned segments by interpreter (#113717)

* gh-112532: Isolate abandoned segments by interpreter

Mimalloc segments are data structures that contain memory allocations along
with metadata. Each segment is "owned" by a thread. When a thread exits,
it abandons its segments to a global pool to be later reclaimed by other
threads. This changes the pool to be per-interpreter instead of process-wide.

This will be important for when we use mimalloc to find GC objects in the
`--disable-gil` builds. We want heaps to only store Python objects from a
single interpreter. Absent this change, the abandoning and reclaiming process
could break this isolation.

* Add missing '&_mi_abandoned_default' to 'tld_empty'

* gh-113320: Reduce the number of dangerous `getattr()` calls when constructing protocol classes (#113401)

- Only attempt to figure out whether protocol members are "method members" or not if the class is marked as a runtime protocol. This information is irrelevant for non-runtime protocols; we can safely skip the risky introspection for them.
- Only do the risky getattr() calls in one place (the runtime_checkable class decorator), rather than in three places (_ProtocolMeta.__init__, _ProtocolMeta.__instancecheck__ and _ProtocolMeta.__subclasscheck__). This reduces the number of locations in typing.py where the risky introspection could go wrong.
- For runtime protocols, if determining whether a protocol member is callable or not fails, give a better error message. I think it's reasonable for us to reject runtime protocols that have members which raise strange exceptions when you try to access them. PEP-544 clearly states that all protocol member must be callable for issubclass() calls against the protocol to be valid -- and if a member raises when we try to access it, there's no way for us to figure out whether it's a callable member or not!

* GH-113486: Do not emit spurious PY_UNWIND events for optimized calls to classes. (GH-113680)

* gh-113703: Correctly identify incomplete f-strings in the codeop module (#113709)

* gh-101100: Fix Sphinx warnings for 2.6 deprecations and removals (#113725)

Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
Co-authored-by: Hugo van Kemenade <hugovk@users.noreply.github.com>

* gh-80532: Do not set ipv6type when cross-compiling (#17956)

Co-authored-by: Xavier de Gaye <xdegaye@gmail.com>

* gh-101100: Fix Sphinx warnings in `library/pyclbr.rst` (#113739)

Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>

* gh-112532: Tag mimalloc heaps and pages (#113742)

* gh-112532: Tag mimalloc heaps and pages

Mimalloc pages are data structures that contain contiguous allocations
of the same block size. Note that they are distinct from operating
system pages. Mimalloc pages are contained in segments.

When a thread exits, it abandons any segments and contained pages that
have live allocations. These segments and pages may be later reclaimed
by another thread. To support GC and certain thread-safety guarantees in
free-threaded builds, we want pages to only be reclaimed by the
corresponding heap in the claimant thread. For example, we want pages
containing GC objects to only be claimed by GC heaps.

This allows heaps and pages to be tagged with an integer tag that is
used to ensure that abandoned pages are only claimed by heaps with the
same tag. Heaps can be initialized with a tag (0-15); any page allocated
by that heap copies the corresponding tag.

* Fix conversion warning

* gh-113688: Split up gcmodule.c (gh-113715)

This splits part of Modules/gcmodule.c of into Python/gc.c, which
now contains the core garbage collection implementation. The Python
module remain in the Modules/gcmodule.c file.

* GH-113568: Stop raising auditing events from pathlib ABCs (#113571)

Raise auditing events in `pathlib.Path.glob()`, `rglob()` and `walk()`,
but not in `pathlib._abc.PathBase` methods. Also move generation of a
deprecation warning into `pathlib.Path` so it gets the right stack level.

* gh-85567: Fix resouce warnings in pickle and pickletools CLIs (GH-113618)

Explicitly open and close files instead of using FileType.

* gh-113360: Fix the documentation of module's attribute __test__ (GH-113393)

It can only be a dict since Python 2.4.

* GH-113568: Stop raising deprecation warnings from pathlib ABCs (#113757)

* gh-113750: Fix object resurrection in free-threaded builds (gh-113751)

gh-113750: Fix object resurrection on free-threaded builds

This avoids the undesired re-initializing of fields like `ob_gc_bits`,
`ob_mutex`, and `ob_tid` when an object is resurrected due to its
finalizer being called.

This change has no effect on the default (with GIL) build.

* gh-113729: Fix IDLE's Help -> "IDLE Help" menu bug in 3.12.1 and 3.11.7 (#113731)

Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>

* gh-113537: support loads str in plistlib.loads (#113582)

Add support for loading XML plists from a string value instead of a only bytes value.

* gh-111488: Changed error message in case of no 'in' keyword after 'for' in cmp (#113656)

* gh-107901: synthetic jumps which are not at end of loop no longer check the eval breaker (#113721)

* GH-113528: pathlib ABC tests: add repr to dummy path classes. (#113777)

The `DummyPurePath` and `DummyPath` test classes are simple subclasses of
`PurePathBase` and `PathBase`. This commit adds `__repr__()` methods to the
dummy classes, which makes debugging test failures less painful.

* GH-113528: Split up pathlib tests for invalid basenames. (#113776)

Split test cases for invalid names into dedicated test methods. This will
make it easier to refactor tests for invalid name handling in ABCs later.

No change of coverage, just a change of test suite organisation.

* GH-113528: Slightly improve `pathlib.Path.glob()` tests for symlink loop handling (#113763)

Slightly improve `pathlib.Path.glob()` tests for symlink loop handling

When filtering results, ignore paths with more than one `linkD/` segment,
rather than all paths below the first `linkD/` segment. This allows us
to test that other paths under `linkD/` are correctly returned.

* GH-113528: Deoptimise `pathlib._abc.PurePathBase.name` (#113531)

Replace usage of `_from_parsed_parts()` with `with_segments()` in
`with_name()`, and take a similar approach in `name` for consistency's
sake.

* GH-113528: Deoptimise `pathlib._abc.PurePathBase.parent` (#113530)

Replace use of `_from_parsed_parts()` with `with_segments()`, and move
assignments to `_drv`, `_root`, _tail_cached` and `_str` slots into
`PurePath`.

* GH-113528: Deoptimise `pathlib._abc.PurePathBase.relative_to()` (#113529)

Replace use of `_from_parsed_parts()` with `with_segments()` in
`PurePathBase.relative_to()`, and move the assignment of `_drv`, `_root`
and `_tail_cached` slots into `PurePath.relative_to()`.

* gh-89532: Remove LibreSSL workarounds (#28728)

Remove LibreSSL specific workaround ifdefs from `_ssl.c` and delete the non-version-specific `_ssl_data.h` file (relevant for OpenSSL < 1.1.1, which we no longer support per PEP 644).

Co-authored-by: Christian Heimes <christian@python.org>
Co-authored-by: Gregory P. Smith <greg@krypto.org>

* gh-112795: Allow `/` folder in a zipfile (#112932)

Allow extraction (no-op) of a "/" folder in a zipfile, they are commonly added by some archive creation tools.

Co-authored-by: Erlend E. Aasland <erlend@python.org>
Co-authored-by: Gregory P. Smith <greg@krypto.org>

* gh-73965: New environment variable PYTHON_HISTORY (#13208)

It can be used to set the location of a .python_history file

---------

Co-authored-by: Levi Sabah <0xl3vi@gmail.com>
Co-authored-by: Hugo van Kemenade <hugovk@users.noreply.github.com>

* gh-73965: Move PYTHON_HISTORY into the correct usage section (#113798)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>

* gh-80109: Fix io.TextIOWrapper dropping the internal buffer during write() (GH-22535)

io.TextIOWrapper was dropping the internal decoding buffer
during read() and write() calls.

* gh-74678: Increase base64 test coverage (GH-21913)

Ensure the character y is disallowed within an Ascii85 5-tuple.

Co-authored-by: Lee Cannon <leecannon@leecannon.xyz>

* gh-110721: Remove unused code from suggestions.c after moving PyErr_Display to use the traceback module (#113712)

* gh-113391: fix outdated PyObject_HasAttr docs (#113420)

After #53875: PyObject_HasAttr is not an equivalent of hasattr.
PyObject_HasAttrWithError is; it already has the note.

* gh-113787: Fix refleaks in test_capi (gh-113816)

Fix refleaks and a typo.

* gh-113755: Fully adapt gcmodule.c to Argument Clinic (#113756)

Adapt the following functions to Argument Clinic:

- gc.set_threshold
- gc.get_referrers
- gc.get_referents

* Minor algebraic simplification for the totient() recipe (gh-113822)

* GH-113528: Move a few misplaced pathlib tests (#113527)

`PurePathBase` does not define `__eq__()`, and so we have no business checking path equality in `test_eq_common` and `test_equivalences`. The tests only pass at the moment because we define the test class's `__eq__()` for use elsewhere.

Also move `test_parse_path_common` into the main pathlib test suite. It exercises a private `_parse_path()` method that will be moved to `PurePath` soon.

Lastly move a couple more tests concerned with optimisations and path normalisation.

* gh-113688: fix dtrace build on Solaris (#113814)

(the gcmodule -> gc refactoring broke it)

* GH-113528: Speed up pathlib ABC tests. (#113788)

- Add `__slots__` to dummy path classes.
- Return namedtuple rather than `os.stat_result` from `DummyPath.stat()`.
- Reduce maximum symlink count in `DummyPathWithSymlinks.resolve()`.

* gh-113791: Expose CLOCK_MONOTONIC_RAW_APPROX and CLOCK_UPTIME_RAW_APROX on macOS in the time module (#113792)

* GH-111693: Propagate correct asyncio.CancelledError instance out of asyncio.Condition.wait() (#111694)

Also fix a race condition in `asyncio.Semaphore.acquire()` when cancelled.

* gh-113827: Move Windows frozen modules directory to allow PGO builds (GH-113828)

* gh-113027: Fix test_variable_tzname in test_email (#113821)

Determine the support of the Kyiv timezone by checking the result of
astimezone() which uses the system tz database and not the one
populated by zoneinfo.

* readme: fix displaying issue of command (#113719)

Avoid line break in command as this causes displaying issues on GH.

* gh-112806: Remove unused function warnings during mimalloc build on Solaris (#112807)

* gh-112808: Fix mimalloc build on Solaris (#112809)

* gh-112087: Update list.{pop,clear,reverse,remove} to use CS (gh-113764)

* Docs: Link tokens in the format string grammars (#108184)

Co-authored-by: Adam Turner <9087854+aa-turner@users.noreply.github.com>
Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com>

* gh-113692: skip a test if multiprocessing isn't available. (GH-113704)

* gh-101100: Fix Sphinx warnings for 2.6 port-specific deprecations (#113752)

* gh-113842: Add missing error check for PyIter_Next() in Python/symtable.c (GH-113843)

* gh-87868: Sort and remove duplicates in getenvironment() (GH-102731)

Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
Co-authored-by: Pieter Eendebak <pieter.eendebak@gmail.com>
Co-authored-by: Erlend E. Aasland <erlend.aasland@protonmail.com>

* gh-103092: Test _ctypes type hierarchy and features (#113727)

Test the following features for _ctypes types:
- disallow instantiation
- inheritance (MRO)
- immutability
- type name

The following _ctypes types are tested:
- Array
- CField
- COMError
- PyCArrayType
- PyCFuncPtrType
- PyCPointerType
- PyCSimpleType
- PyCStructType
- Structure
- Union
- UnionType
- _CFuncPtr
- _Pointer
- _SimpleCData

Co-authored-by: Erlend E. Aasland <erlend.aasland@protonmail.com>

* gh-113650: Add workaround option for MSVC ARM64 bug affecting string encoding (GH-113836)

* Fix opcode name printing in debug mode (#113870)

Fix a few places where the lltrace debug output printed ``(null)`` instead of an opcode name, because it was calling ``_PyUOpName()`` on a Tier-1 opcode.

* Simplify binomial approximation example with random.binomialvariate() (gh-113871)

* GH-113528: Deoptimise `pathlib._abc.PathBase._make_child_relpath()` (#113532)

Call straight through to `joinpath()` in `PathBase._make_child_relpath()`.
Move optimised/caching code to `pathlib.Path._make_child_relpath()`

* gh-113848: Use PyErr_GivenExceptionMatches() for check for CancelledError (GH-113849)

* gh-113848: Handle CancelledError subclasses in asyncio TaskGroup() and timeout() (GH-113850)

* gh-113781: Silence AttributeError in warning module during Python finalization (GH-113813)

The tracemalloc module can already be cleared.

* GH-113661: unittest runner: Don't exit 5 if tests were skipped (#113856)

The intention of exiting 5 was to detect issues where the test suite
wasn't discovered at all. If we skipped tests, it was correctly
discovered.

* GH-113528: Deoptimise `pathlib._abc.PathBase.resolve()` (#113782)

Replace use of `_from_parsed_parts()` with `with_segments()` in
`resolve()`.

No effect on `Path.resolve()`, which uses `os.path.realpath()`.

* gh-66060: Use actual class name in _io type's __repr__ (#30824)

Use the object's actual class name in the following _io type's __repr__:
- FileIO
- TextIOWrapper
- _WindowsConsoleIO

* GH-113528: Deoptimise `pathlib._abc.PurePathBase.parts` (#113883)

Implement `parts` using `_stack`, which itself calls `pathmod.split()`
repeatedly. This avoids use of `_tail`, which will be moved to `PurePath`
shortly.

* GH-113528: Deoptimise `pathlib._abc.PurePathBase.relative_to()` (again) (#113882)

Restore full battle-tested implementations of `PurePath.[is_]relative_to()`. These were recently split up in 3375dfe and a15a773.

In `PurePathBase`, add entirely new implementations based on `_stack`, which itself calls `pathmod.split()` repeatedly to disassemble a path. These new implementations preserve features like trailing slashes where possible, while still observing that a `..` segment cannot be added to traverse an empty or `.` segment in *walk_up* mode. They do not rely on `parents` nor `__eq__()`, nor do they spin up temporary path objects.

Unfortunately calling `pathmod.relpath()` isn't an option, as it calls `abspath()` and in turn `os.getcwd()`, which is impure.

* gh-111968: Introduce _PyFreeListState and _PyFreeListState_GET API (gh-113584)

* GH-113528: Deoptimise `pathlib._abc.PurePathBase` (#113559)

Apply pathlib's normalization and performance tuning in `pathlib.PurePath`, but not `pathlib._abc.PurePathBase`.

With this change, the pathlib ABCs do not normalize away alternate path separators, empty segments, or dot segments. A single string given to the initialiser will round-trip by default, i.e. `str(PurePathBase(my_string)) == my_string`. Implementors can set their own path domain-specific normalization scheme by overriding `__str__()`

Eliminating path normalization makes maintaining and caching the path's parts and string representation both optional and not very useful, so this commit moves the `_drv`, `_root`, `_tail_cached` and `_str` slots from `PurePathBase` to `PurePath`. Only `_raw_paths` and `_resolving` slots remain in `PurePathBase`. This frees the ABCs from the burden of some of pathlib's hardest-to-understand code.

* pathlib ABCs: Require one or more initialiser arguments (#113885)

Refuse to guess what a user means when they initialise a pathlib ABC
without any positional arguments. In mainline pathlib it's normalised to
`.`, but in the ABCs this guess isn't appropriate; for example, the path
type may not represent the current directory as `.`, or may have no concept
of a "current directory" at all.

* gh-112182: Replace StopIteration with RuntimeError for future (#113220)

When an `StopIteration` raises into `asyncio.Future`, this will cause
a thread to hang. This commit address this by not raising an exception
and silently transforming the `StopIteration` with a `RuntimeError`,
which the caller can reconstruct from `fut.exception().__cause__`

* GH-113858: GitHub Actions config: Only save ccache on pushes (GH-113859)

* gh-113877: Fix Tkinter method winfo_pathname() on 64-bit Windows (GH-113900)

winfo_id() converts the result of "winfo id" command to integer, but
"winfo pathname" command requires an argument to be a hexadecimal number
on Win64.

* gh-113879: Fix ResourceWarning in test_asyncio.test_server (GH-113881)

* gh-96037: Always insert TimeoutError when exit an expired asyncio.timeout() block (GH-113819)

If other exception was raised during exiting an expired
asyncio.timeout() block, insert TimeoutError in the exception context
just above the CancelledError.

* gh-70835: Clarify error message for CSV file opened with wrong newline (GH-113786)

Based on patch by SilentGhost.

* gh-113594: Fix UnicodeEncodeError in TokenList.fold() (GH-113730)

It occurred when try to re-encode an unknown-8bit part combined with non-unknown-8bit part.

* gh-113664: Improve style of Big O notation (GH-113695)

Use cursive to make it looking like mathematic formulas.

* gh-58032: Do not use argparse.FileType in module CLIs and scripts (GH-113649)

Open and close files manually. It prevents from leaking files,
preliminary creation of output files, and accidental closing of stdin
and stdout.

* gh-89850: Add default C implementations of persistent_id() and persistent_load() (GH-113579)

Previously the C implementation of pickle.Pickler and pickle.Unpickler
classes did not have such methods and they could only be used if
they were overloaded in subclasses or set as instance attributes.

Fixed calling super().persistent_id() and super().persistent_load() in
subclasses of the C implementation of pickle.Pickler and pickle.Unpickler
classes. It no longer causes an infinite recursion.

* gh-66515: Fix locking of an MH mailbox without ".mh_sequences" file (GH-113482)

Guarantee that it either open an existing ".mh_sequences" file or create
a new ".mh_sequences" file, but do not replace existing ".mh_sequences"
file.

* gh-111789: Use PyDict_GetItemRef() in Modules/_zoneinfo.c (GH-112078)

* gh-109858: Protect zipfile from "quoted-overlap" zipbomb (GH-110016)

Raise BadZipFile when try to read an entry that overlaps with other entry or
central directory.

* gh-111139: Optimize math.gcd(int, int) (#113887)

Add a fast-path for the common case.

Benchmark:

    python -m pyperf timeit \
        -s 'import math; gcd=math.gcd; x=2*3; y=3*5' \
        'gcd(x,y)'

Result: 1.07x faster (-3.4 ns)

    Mean +- std dev: 52.6 ns +- 4.0 ns -> 49.2 ns +- 0.4 ns: 1.07x faster

* GH-113860: All executors are now defined in terms of micro ops. Convert counter executor to use uops. (GH-113864)

* gh-111968: Use per-thread freelists for float in free-threading (gh-113886)

* Add @requires_zlib() decorator for gh-109858 tests (GH-113918)

* gh-113625: Align object addresses in the Descriptor HowTo Guide (#113894)

* gh-113753: Clear finalized bit when putting PyAsyncGenASend back into free list (#113754)

* gh-112302: Point core developers to SBOM devguide on errors (#113490)

Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>

* gh-77046: os.pipe() sets _O_NOINHERIT flag on fds (#113817)

On Windows, set _O_NOINHERIT flag on file descriptors
created by os.pipe() and io.WindowsConsoleIO.

Add test_pipe_spawnl() to test_os.

Co-authored-by: Zackery Spytz <zspytz@gmail.com>

* gh-87868: Skip `test_one_environment_variable` in `test_subprocess` when the platform or build cannot do that (#113867)

* improve the assert for test_one_environment_variable
* skip some test in test_subprocess when python is configured with shared
* also skip the test if AddressSanitizer is enabled

---------

Co-authored-by: Steve Dower <steve.dower@microsoft.com>

* gh-113896: Fix test_builtin.BuiltinTest.test___ne__() (#113897)

Fix DeprecationWarning in test___ne__().

Co-authored-by: Nikita Sobolev <mail@sobolevn.me>

* gh-111968: Unify naming scheme for freelist (gh-113919)

* gh-89811: Check for valid tp_version_tag in specializer (GH-113558)

* gh-112640: Add `kwdefaults` parameter to `types.FunctionType.__new__` (#112641)

* gh-112419: Document removal of sys.meta_path's 'find_module' fallback (#112421)

Co-authored-by: Erlend E. Aasland <erlend@python.org>

* gh-113932: assert ``SyntaxWarning`` in test_compile.TestSpecifics.test_… (#113933)

* gh-91960: Remove Cirrus CI configuration (#113938)

Remove .cirrus.yml which was already disabled by being renamed to
.cirrus-DISABLED.yml. In total, Cirrus CI only run for less than one
month.

* gh-107901: jump leaving an exception handler doesn't need an eval break check (#113943)

* GH-113853: Guarantee forward progress in executors (GH-113854)

* gh-113845: Fix a compiler warning in Python/suggestions.c (GH-113949)

* gh-111968: Use per-thread freelists for tuple in free-threading (gh-113921)

* Update KDE recipe to match the standard use of the h parameter (gh-#113958)

* gh-81489: Use Unicode APIs for mmap tagname on Windows (GH-14133)

Co-authored-by: Erlend E. Aasland <erlend@python.org>

* GH-107678: Improve Unicode handling clarity in ``library/re.rst`` (#107679)

* Improve kde graph with better caption and number formatting (gh-113967)

* gh-111968: Explicit handling for finalized freelist (gh-113929)

* gh-113903: Fix an IDLE configdialog test (#113973)

test_configdialog.HighPageTest.test_highlight_target_text_mouse fails
if a line of the Highlight tab text sample is not visible. If so, bbox()
in click_char() returns None and the unpacking iteration fails.

This occurred on a Devuan Linux system. Fix by moving the
'see character' call inside click_char, just before the bbox call.

Also, reduce the click_char calls to just one per tag name and
replace the other nested function with a dict comprehension.

* gh-113937 Fix failures in type cache tests due to re-running (GH-113953)

* gh-113858: Cut down ccache size (GH-113945)

Cut down ccache size

- Only save the ccache in the main reusable builds, not on builds that
  don't use special build options:
  - Generated files check
  - OpenSSL tests
  - Hypothesis tests
- Halve the max cache size, to 200M

* gh-108364: In sqlite3, disable foreign keys before dumping SQL schema (#113957)

sqlite3.Connection.iterdump now ensures that foreign key support is
disabled before dumping the database schema, if there is any foreign key
violation.

Co-authored-by: Erlend E. Aasland <erlend@python.org>

* gh-113027: Fix timezone check in test_variable_tzname in test_email (GH-113835)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>

* GH-113860: Get rid of `_PyUOpExecutorObject` (GH-113954)

* Docs: Amend codeobject.co_lines docs; end number is exclusive (#113970)

The end number should be exclusive, not inclusive.

* gh-111877: Fixes stat() handling for inaccessible files on Windows (GH-113716)

* gh-113980: Fix resource warnings in test_asyncgen (GH-113984)

* gh-107901: duplicate blocks with no lineno that have an eval break and multiple predecessors (#113950)

* gh-113868: Add a number of MAP_* flags from macOS to module mmap (#113869)

The new flags were extracted from the macOS 14.2 SDK.

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>

* gh-113710: Add types to the interpreter DSL (#113711)

Co-authored-by: Jules <57632293+JuliaPoo@users.noreply.github.com>
Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>

* gh-113971: Make `zipfile.ZipInfo._compresslevel` public as `.compress_level` (#113969)

Make zipfile.ZipInfo.compress_level public.

A property is used to retain the behavior of the ._compresslevel.

People constructing zipfile.ZipInfo instances to pass into existing APIs to control per-file compression levels already treat this as public, there was never a reason for it not to be.

I used the more modern name compress_level instead of compresslevel as the keyword argument on other ZipFile APIs is called to be consistent with compress_type and a general long term preference of not runningwordstogether without a separator in names.

* GH-111802: set a low recursion limit for `test_bad_getattr()` in `test.pickletester` (GH-113996)

* gh-95649: Document that asyncio contains uvloop code (#107536)

Some of the asyncio SSL changes in GH-31275 [1] were taken from
v0.16.0 of the uvloop project [2]. In order to comply with the MIT
license, we need to just need to document the copyright information.

[1]: https://github.com/python/cpython/pull/31275
[2]: https://github.com/MagicStack/uvloop/tree/v0.16.0

* gh-101100: Fix Sphinx Lint warnings in `Misc/` (#113946)

Fix Sphinx Lint warnings in Misc/

* Fix a grammatical error in `pycore_pymem.h` (#112993)

* Tutorial: Clarify 'nonzero exit status' in the appendix (#112039)

* Link to the glossary for "magic methods" in ``MagicMock`` (#111292)

The MagicMock documentation mentions magic methods several times without
actually pointing to the term in the glossary. This can be helpful for
people to fully understand what those magic methods are.

* datamodel: Fix a typo in ``object.__init_subclass__`` (#111599)

* GH-111801: set a lower recursion limit for `test_infintely_many_bases()` in `test_isinstance` (#113997)

* gh-89159: Document missing TarInfo members (#91564)

* GH-111798: skip `test_super_deep()` from `test_call` under pydebug builds on WASI (GH-114010)

* GH-44626, GH-105476: Fix `ntpath.isabs()` handling of part-absolute paths (#113829)

On Windows, `os.path.isabs()` now returns `False` when given a path that
starts with exactly one (back)slash. This is more compatible with other
functions in `os.path`, and with Microsoft's own documentation.

Also adjust `pathlib.PureWindowsPath.is_absolute()` to call
`ntpath.isabs()`, which corrects its handling of partial UNC/device paths
like `//foo`.

Co-authored-by: Jon Foster <jon@jon-foster.co.uk>

* pathlib ABCs: add `_raw_path` property (#113976)

It's wrong for the `PurePathBase` methods to rely so much on `__str__()`.
Instead, they should treat the raw path(s) as opaque objects and leave the
details to `pathmod`.

This commit adds a `PurePathBase._raw_path` property and uses it through
many of the other ABC methods. These methods are all redefined in
`PurePath` and `Path`, so this has no effect on the public classes.

* Add module docstring for `pathlib._abc`. (#113691)

* gh-101225: Increase the socket backlog when creating a multiprocessing.connection.Listener (#113567)

Increase the backlog for multiprocessing.connection.Listener` objects created
 by `multiprocessing.manager` and `multiprocessing.resource_sharer` to
 significantly reduce the risk of getting a connection refused error when creating
 a `multiprocessing.connection.Connection` to them.

* gh-114014: Update `fractions.Fraction()`'s rational parsing regex (#114015)

Fix a bug in the regex used for parsing a string input to the `fractions.Fraction` constructor. That bug led to an inconsistent exception message being given for some inputs.

---------

Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
Co-authored-by: Mark Dickinson <dickinsm@gmail.com>

* gh-111803: Support loading more deeply nested lists in binary plist format (GH-114024)

It no longer uses the C stack. The depth of nesting is only limited by
Python recursion limit setting.

* gh-113317: Move global utility functions into libclinic (#113986)

Establish Tools/clinic/libclinic/utils.py and move the following
functions over there:

- compute_checksum()
- create_regex()
- write_file()

* gh-101100: Fix Sphinx warnings in `howto/urllib2.rst` and `library/http.client.rst` (#114060)

* Add `pathlib._abc.PathModuleBase` (#113893)

Path modules provide a subset of the `os.path` API, specifically those
functions needed to provide `PurePathBase` functionality. Each
`PurePathBase` subclass references its path module via a `pathmod` class
attribute.

This commit adds a new `PathModuleBase` class, which provides abstract
methods that unconditionally raise `UnsupportedOperation`. An instance of
this class is assigned to `PurePathBase.pathmod`, replacing `posixpath`.
As a result, `PurePathBase` is no longer POSIX-y by default, and
all its methods raise `UnsupportedOperation` courtesy of `pathmod`.

Users who subclass `PurePathBase` or `PathBase` should choose the path
syntax by setting `pathmod` to `posixpath`, `ntpath`, `os.path`, or their
own subclass of `PathModuleBase`, as circumstances demand.

* Replace `pathlib._abc.PathModuleBase.splitroot()` with `splitdrive()` (#114065)

This allows users of the `pathlib-abc` PyPI package to use `posixpath` or
`ntpath` as a path module in versions of Python lacking
`os.path.splitroot()` (3.11 and before).

* gh-113317: Move FormatCounterFormatter into libclinic (#114066)

* gh-109862: Fix test_create_subprocess_with_pidfd when it was run separately (GH-113991)

* gh-114075: Capture `test_compileall` stdout output  (#114076)

Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>

* gh-113666: Adding missing UF_ and SF_ flags to module 'stat' (#113667)

Add some constants to module 'stat' that are used on macOS.

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>

* GH-112354: `_GUARD_IS_TRUE_POP` side-exits to target the next instruction, not themselves. (GH-114078)

* gh-109598: make PyComplex_RealAsDouble/ImagAsDouble use __complex__ (GH-109647)

`PyComplex_RealAsDouble()`/`PyComplex_ImagAsDouble` now try to convert
an object to a `complex` instance using its `__complex__()` method
before falling back to the ``__float__()`` method.

PyComplex_ImagAsDouble() also will not silently return 0.0 for
non-complex types anymore.  Instead we try to call PyFloat_AsDouble()
and return 0.0 only if this call is successful.

* gh-112532: Fix memory block count for free-threaded build (gh-113995)

This fixes `_PyInterpreterState_GetAllocatedBlocks()` and
`_Py_GetGlobalAllocatedBlocks()` in the free-threaded builds. The
gh-113263 change that introduced multiple mimalloc heaps per-thread
broke the logic for counting the number of allocated blocks. For subtle
reasons, this led to reported reference count leaks in the refleaks
buildbots.

* gh-111968: Use per-thread slice_cache in free-threading (gh-113972)

* gh-99437: runpy: decode path-like objects before setting globals

* gh-114070: correct the specification of ``digit`` in the float() docs (#114080)

* gh-91539: Small performance improvement of urrlib.request.getproxies_environment() (#108771)

 Small performance improvement of getproxies_environment() when there are many environment variables. In a benchmark with 5k environment variables not related to proxies, and 5 specifying proxies, we get a 10% walltime improvement.

* gh-112087: Update list impl to be thread-safe with manual CS (gh-113863)

* gh-78502: Add a trackfd parameter to mmap.mmap() (GH-25425)

If *trackfd* is False, the file descriptor specified by *fileno*
will not be duplicated.

Co-authored-by: Erlend E. Aasland <erlend@python.org>
Co-authored-by: Petr Viktorin <encukou@gmail.com>
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>

* gh-114101: Correct PyErr_Format arguments in _testcapi module (#114102)

- use PyErr_SetString() iso. PyErr_Format() in parse_tuple_and_keywords()
- fix misspelled format specifier in CHECK_SIGNNESS() macro

* GH-113655: Lower the C recursion limit on various platforms (GH-113944)

* gh-113358: Fix rendering tracebacks with exceptions with a broken __getattr__ (GH-113359)

Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>

* gh-113238: add Anchor to importlib.resources (#113801)

Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>

* gh-114077: Fix OverflowError in socket.sendfile() when pass count >2GiB (GH-114079)

* Docs: Align multiprocessing.shared_memory docs with Sphinx recommendations (#114103)

- add :class: and :mod: markups where needed
- fix incorrect escaping of a star in ShareableList arg spec
- mark up parameters with stars: *val*
- mark up list of built-in types using list markup
- remove unneeded parentheses from :meth: markups

* gh-113858: GH Actions: Limit max ccache size for the asan build (GH-114113)

* gh-114107: Fix importlib.resources symlink test if symlinks aren't supported (#114108)

gh-114107: Fix symlink test if symlinks aren't supported

* gh-102468: Document `PyCFunction_New*` and `PyCMethod_New` (GH-112557)

Co-authored-by: Erlend E. Aasland <erlend.aasland@protonmail.com>

* gh-113626: Add allow_code parameter in marshal functions (GH-113648)

Passing allow_code=False prevents serialization and de-serialization of
code objects which is incompatible between Python versions.

* gh-111968: Use per-thread freelists for PyContext in free-threading (gh-114122)

* gh-114107: test.pythoninfo logs Windows Developer Mode (#114121)

Also, don't skip the whole collect_windows() if ctypes is missing.

Log also ctypes.windll.shell32.IsUserAnAdmin().

* Fix an incorrect comment in iobase_is_closed (GH-102952)

This comment appears to have been mistakenly copied from what is now
called iobase_check_closed() in commit 4d9aec022063.

Also unite the iobase_check_closed() code with the relevant comment.

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>

* gh-114069: Revise Tutorial Methods paragraph (#114127)

Remove excess words in the first and third sentences.

* gh-114096: Restore privileges in _winapi.CreateJunction after creating the junction (GH-114089)

This avoids impact on later parts of the application which may be able to do things they otherwise shouldn't.

* Docs: Improve multiprocessing.SharedMemory reference (#114093)

Align the multiprocessing shared memory docs with Diatáxis's
recommendations for references.

- use a parameter list for the SharedMemory.__init__() argument spec
- use the imperative mode
- use versionadded, not versionchanged, for added parameters
- reflow touched lines according to SemBr

* Fix 'expresion' typo in IDLE doc (#114130)

The substantive change is on line 577/593. Rest is header/footer stuff ignored when displaying.

* gh-113659: Skip hidden .pth files (GH-113660)

Skip .pth files with names starting with a dot or hidden file attribute.

* Clean up backslash avoiding code in ast, fix typo (#113605)

As of #108553, the `_avoid_backslashes` code path is dead

`scape_newlines` was introduced in #110271. Happy to drop the typo fix
if we don't want it

* GH-114013: fix setting `HOSTRUNNER` for `Tools/wasm/wasi.py` (GH-114097)

Also fix tests found failing under a pydebug build of WASI thanks to `make test` working due to this change.

* Update copyright years to 2024. (GH-113608)

Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>

* gh-112529: Track if debug allocator is used as underlying allocator (#113747)

* gh-112529: Track if debug allocator is used as underlying allocator

The GC implementation for free-threaded builds will need to accurately
detect if the debug allocator is used because it affects the offset of
the Python object from the beginning of the memory allocation. The
current implementation of `_PyMem_DebugEnabled` only considers if the
debug allocator is the outer-most allocator; it doesn't handle the case
of "hooks" like tracemalloc being used on top of the debug allocator.

This change enables more accurate detection of the debug allocator by
tracking when debug hooks are enabled.

* Simplify _PyMem_DebugEnabled

* gh-113655: Increase default stack size for PGO builds to avoid C stack exhaustion (GH-114148)

* GH-78988: Document `pathlib.Path.glob()` exception propagation. (#114036)

We propagate the `OSError` from the `is_dir()` call on the top-level
directory, and suppress all others.

* gh-94220: Align fnmatch docs with the implementation and amend markup (#114152)

- Align the argument spec for fnmatch functions with the actual
  implementation.
- Update Sphinx markup to recent recommandations.
- Add link to 'iterable' glossary entry.

Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>

* Fix typo in c_annotations.py comment (#108773)

"compatability" => "compatibility"

* GH-110109: pathlib docs: bring `from_uri()` and `as_uri()` together. (#110312)

This is a very soft deprecation of `PurePath.as_uri()`. We instead document
it as a `Path` method, and add a couple of sentences mentioning that it's
also available in `PurePath`.

Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>

* gh-106293: Fix typos in Objects/object_layout.md (#106294)

Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>

* gh-88531 Fix dataclass __post_init__/__init__ interplay documentation (gh-107404)

* Simplify __post_init__ example usage. It applies to all base classes, not just dataclasses.

* gh-112043: Align concurrent.futures.Executor.map docs with implementation (#114153)

The first parameter is named 'fn', not 'func'.

* gh-81479: For Help => IDLE Doc, stop double-spacing some lists. (#114168)

This matches Firefox format.  Edge double-spaces non-simple
list but I think it looks worse.

* gh-72284: Revise lists in IDLE doc  (#114174)

Tkinter is a fact, not necessarily a feature.

Reorganize editor key bindings in a logical order
and remove those that do not work, at least on Windows.

Improve shell bindings list.

* gh-86179: Skip test case that fails on POSIX with unversioned binary (GH-114136)

* Python 3.13.0a3

* gh-104282: Fix null pointer dereference in `lzma._decode_filter_properties` (GH-104283)

* gh-111301: Advertise importlib methods removal in What's new in Python 3.12 (GH-111630)

* gh-112343: pdb: Use tokenize to replace convenience variables (#112380)

* Post 3.13.0a3

* gh-114178: Fix generate_sbom.py for out-of-tree builds (#114179)

* gh-114070: fix token reference warnings in expressions.rst (#114169)

* gh-114149: [Enum] fix tuple subclass handling when using custom __new__ (GH-114160)

* gh-105102: Fix nested unions in structures when the system byteorder is the opposite (GH-105106)

* Fix typo in tkinter.ttk.rst (GH-106157)

* gh-38807: Fix race condition in Lib/trace.py (GH-110143)

Instead of checking if a directory does not exist and thereafter
creating it, directly call os.makedirs() with the exist_ok=True.

* gh-112984 Update Windows build and installer for free-threaded builds (GH-113129)

* gh-112984: Fix test_ctypes.test_loading.test_load_dll_with_flags when directory name includes a dot (GH-114217)

* gh-114149: [Enum] revert #114160 and add more tuple-subclass tests (GH-114215)

This reverts commit 05e142b1543eb9662d6cc33722e7e16250c9219f.

* gh-104522: Fix OSError raised when run a subprocess (#114195)

Only set filename to cwd if it was caused by failed chdir(cwd).

_fork_exec() now returns "noexec:chdir" for failed chdir(cwd).

Co-authored-by: Robert O'Shea <PurityLake@users.noreply.github.com>

* gh-113205: test_multiprocessing.test_terminate: Test the API on threadpools (#114186)

gh-113205: test_multiprocessing.test_terminate: Test the API works on threadpools

Threads can't be forced to terminate (without potentially corrupting too much
state), so the  expected behaviour of `ThreadPool.terminate` is to wait for
the currently executing tasks to finish.

The entire test was skipped in GH-110848 (0e9c364f4ac18a2237bdbac702b96bcf8ef9cb09).
Instead of skipping it entirely, we should ensure the API eventually succeeds:
use a shorter timeout.

For the record: on my machine, when the test is un-skipped, the task manages to
start in about 1.5% cases.

* gh-114211: Update EmailMessage doc about ordered keys (#114224)

Ordered keys are no longer unlike 'real dict's.

* gh-96905: In IDLE code, stop redefining built-ins 'dict' and 'object' (#114227)

Prefix 'dict' with 'o', 'g', or 'l' for 'object', 'global', or 'local'.
Suffix 'object' with '_'.

* gh-114231: Fix indentation in enum.rst (#114232)

* gh-104522: Fix test_subprocess failure when build Python in the root home directory (GH-114236)

* gh-104522: Fix test_subprocess failure when build Python in the root home directory

EPERM is raised when setreuid() fails.
EACCES is set in execve() when the test user has not access to sys.executable.

* gh-114050: Fix crash when more than two arguments are passed to int() (GH-114067)

Co-authored-by: Kirill Podoprigora <kirill.bast9@mail.ru>

* gh-103092: Convert some `_ctypes` metatypes to heap types (GH-113620)


Co-authored-by: Erlend E. Aasland <erlend@python.org>

* gh-110345: show Tcl/Tk patchlevel in `tkinter._test()` (GH-110350)

* Delete unused macro (GH-114238)

* gh-108303: Move all doctest related files and tests to `Lib/test/test_doctest/` (#112109)

Co-authored-by: Brett Cannon <brett@python.org>

* gh-114198: Rename dataclass __replace__ argument to 'self' (gh-114251)

This change renames the dataclass __replace__ method's first argument
name from 'obj' to 'self'.

* gh-114087: Speed up dataclasses._asdict_inner (#114088)

* gh-111968: Use per-thread freelists for generator in free-threading (gh-114189)

* gh-112092: clarify unstable ABI recompilation requirements (#112093)

Use different versions in the examples for when extensions do and do not need to be recompiled to make the examples easier to understand.

* gh-114123: Migrate docstring from _csv to csv (#114124)

Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
Co-authored-by: Éric <merwok@netwok.org>

* gh-112087: Remove duplicated critical_section (gh-114268)

* gh-111968: Fix --without-freelists build (gh-114270)

* gh-114286: Fix `maybe-uninitialized` warning in `Modules/_io/fileio.c` (GH-114287)

* gh-113884: Refactor `queue.SimpleQueue` to use a ring buffer to store items (#114259)

Use a ring buffer instead of a Python list in order to simplify the
process of making queue.SimpleQueue thread-safe in free-threaded
builds. The ring buffer implementation has no places where critical
sections may be released.

* gh-114275: Skip doctests that use `asyncio` in `test_pdb` for WASI builds (#114309)

* gh-114265: move line number propagation before cfg optimization, remove guarantee_lineno_for_exits (#114267)

* Retain shorter tables of contents for Sphinx 5.2.3+ (#114318)

Disable toc_object_entries, new in Sphinx 5.2.3

* Add a `clean` subcommand to `Tools/wasm/wasi.py` (GH-114274)

* GH-79634: Accept path-like objects as pathlib glob patterns. (#114017)

Allow `os.PathLike` objects to be passed as patterns to `pathlib.Path.glob()` and `rglob()`. (It's already possible to use them in `PurePath.match()`)

While we're in the area:

- Allow empty glob patterns in `PathBase` (but not `Path`)
- Speed up globbing in `PathBase` by generating paths with trailing slashes only as a final step, rather than for every intermediate directory.
- Simplify and speed up handling of rare patterns involving both `**` and `..` segments.

* GH-113225: Speed up `pathlib.Path.walk(top_down=False)` (#113693)

Use `_make_child_entry()` rather than `_make_child_relpath()` to retrieve
path objects for directories to visit. This saves the allocation of one
path object per directory in user subclasses of `PathBase`, and avoids a
second loop.

This trick does not apply when walking top-down, because users can affect
the walk by modifying *dirnames* in-place.

A side effect of this change is that, in bottom-up mode, subdirectories of
each directory are visited in reverse order, and that this order doesn't
match that of the names in *dirnames*. I suspect this is fine as the
order is arbitrary anyway.

* gh-114332: Fix the flags reference for ``re.compile()`` (#114334)

The GH-93000 change set inadvertently caused a sentence in re.compile()
documentation to refer to details that no longer followed. Correct this
with a link to the Flags sub-subsection.

Co-authored-by: Adam Turner <9087854+aa-turner@users.noreply.github.com>

* GH-99380: Update to Sphinx 7 (#99381)

* Docs: structure the ftplib reference (#114317)

Introduce the following headings and subheadings:

- Reference
  * FTP objects
  * FTP_TLS objects
  * Module variables

* gh-112529: Use GC heaps for GC allocations in free-threaded builds (gh-114157)

* gh-112529: Use GC heaps for GC allocations in free-threaded builds

The free-threaded build's garbage collector implementation will need to
find GC objects by traversing mimalloc heaps. This hooks up the
allocation calls with the correct heaps by using a thread-local
"current_obj_heap" variable.

* Refactor out setting heap based on type

* gh-114281: Remove incorrect type hints from `asyncio.staggered` (#114282)

Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>

* Docs: Add missing line continuation to FTP_TLS class docs (#114352)

Regression introduced by b1ad5a5d4.

* Remove the non-test Lib/test/time_hashlib.py. (#114354)

I believe I added this while chasing some performance of hash functions
when I first created hashlib.  It hasn't been used since, is frankly
trivial, and not a test.

* Remove deleted `time_hashlib.py` from `Lib/test/.ruff.toml` (#114355)

* Fix the confusing "User-defined methods" reference in the datamodel (#114276)

Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com>

* Docs: mark up the FTP debug levels as a list (#114360)

Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>

* gh-101100: Fix sphinx warnings in `Doc/c-api/memory.rst` (#114373)

* gh-80931: Skip some socket tests while hunting for refleaks on macOS (#114057)

Some socket tests related to sending file descriptors cause a file descriptor leak on macOS, all of them tests that send one or more descriptors than cannot be received on the read end.  This appears to be a platform bug.

This PR skips those tests when doing a refleak test run to avoid hiding other problems.

* Docs: mark up FTP() constructor with param list (#114359)

Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>

* gh-114384: Align sys.set_asyncgen_hooks signature in docs to reflect implementation (#114385)

* Docs: link to sys.stdout in ftplib docs (#114396)

---------

Co-authored-by: Donghee Na <donghee.na@python.org>
Co-authored-by: Sam Gross <colesbury@gmail.com>
Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
Co-authored-by: Itamar Oren <itamarost@gmail.com>
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
Co-authored-by: Hugo van Kemenade <hugovk@users.noreply.github.com>
Co-authored-by: Filip Łapkiewicz <80906036+fipachu@users.noreply.github.com>
Co-authored-by: Brandt Bucher <brandtbucher@microsoft.com>
Co-authored-by: Jamie Phan <jamie@ordinarylab.dev>
Co-authored-by: wookie184 <wookie1840@gmail.com>
Co-authored-by: Guido van Rossum <guido@python.org>
Co-authored-by: Barney Gale <barney.gale@gmail.com>
Co-authored-by: Mark Shannon <mark@hotpy.org>
Co-authored-by: Pablo Galindo Salgado <Pablogsal@gmail.com>
Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
Co-authored-by: Zackery Spytz <zspytz@gmail.com>
Co-authored-by: Xavier de Gaye <xdegaye@gmail.com>
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Co-authored-by: Ronald Oussoren <ronaldoussoren@mac.com>
Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
Co-authored-by: AN Long <aisk@users.noreply.github.com>
Co-authored-by: Grigoriev Semyon <33061489+grigoriev-semyon@users.noreply.github.com>
Co-authored-by: Rami <72725910+ramikg@users.noreply.github.com>
Co-authored-by: Christian Heimes <christian@python.org>
Co-authored-by: Gregory P. Smith <greg@krypto.org>
Co-authored-by: Erlend E. Aasland <erlend@python.org>
Co-authored-by: Levi Sabah <0xl3vi@gmail.com>
Co-authored-by: Lee Cannon <leecannon@leecannon.xyz>
Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com>
Co-authored-by: neonene <53406459+neonene@users.noreply.github.com>
Co-authored-by: Raymond Hettinger <rhettinger@users.noreply.github.com>
Co-authored-by: Jakub Kulík <Kulikjak@gmail.com>
Co-authored-by: Kristján Valur Jónsson <sweskman@gmail.com>
Co-authored-by: Steve Dower <steve.dower@python.org>
Co-authored-by: mara004 <geisserml@gmail.com>
Co-authored-by: William Andrea <william.j.andrea@gmail.com>
Co-authored-by: Adam Turner <9087854+aa-turner@users.noreply.github.com>
Co-authored-by: Vinay Sajip <vinay_sajip@yahoo.co.uk>
Co-authored-by: Yan Yanchii <yyanchiy@gmail.com>
Co-authored-by: Pieter Eendebak <pieter.eendebak@gmail.com>
Co-authored-by: Erlend E. Aasland <erlend.aasland@protonmail.com>
Co-authored-by: Stefano Rivera <stefano@rivera.za.net>
Co-authored-by: Petr Viktorin <encukou@gmail.com>
Co-authored-by: Victor Stinner <vstinner@python.org>
Co-authored-by: Seth Michael Larson <sethmichaellarson@gmail.com>
Co-authored-by: Steve Dower <steve.dower@microsoft.com>
Co-authored-by: Kirill Podoprigora <kirill.bast9@mail.ru>
Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
Co-authored-by: Peter Lazorchak <lazorchakp@gmail.com>
Co-authored-by: Mariusz Felisiak <felisiak.mariusz@gmail.com>
Co-authored-by: Ned Batchelder <ned@nedbatchelder.com>
Co-authored-by: Ken Jin <kenjin@python.org>
Co-authored-by: Jules <57632293+JuliaPoo@users.noreply.github.com>
Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
Co-authored-by: Brett Cannon <brett@python.org>
Co-authored-by: Alois Klink <alois@aloisklink.com>
Co-authored-by: Joseph Pearson <74079531+JoeyPearson822@users.noreply.github.com>
Co-authored-by: Andrew Zipperer <47086307+zipperer@users.noreply.github.com>
Co-authored-by: Pierre Equoy <pierre.equoy@canonical.com>
Co-authored-by: InSync <122007197+InSyncWithFoo@users.noreply.github.com>
Co-authored-by: Stanley <46876382+slateny@users.noreply.github.com>
Co-authored-by: Jon Foster <jon@jon-foster.co.uk>
Co-authored-by: Crowthebird <78076854+thatbirdguythatuknownot@users.noreply.github.com>
Co-authored-by: Mark Dickinson <dickinsm@gmail.com>
Co-authored-by: Kamil Turek <kamil.turek@hotmail.com>
Co-authored-by: Raphaël Marinier <raphael.marinier@gmail.com>
Co-authored-by: Jérome Perrin <perrinjerome@gmail.com>
Co-authored-by: Mike Zimin <122507876+mikeziminio@users.noreply.github.com>
Co-authored-by: Jonathon Reinhart <JonathonReinhart@users.noreply.github.com>
Co-authored-by: Shantanu <12621235+hauntsaninja@users.noreply.github.com>
Co-authored-by: solya0x <41440448+0xSalikh@users.noreply.github.com>
Co-authored-by: Kuan-Wei Chiu <visitorckw@gmail.com>
Co-authored-by: Mano Sriram <mano.sriram0@gmail.com>
Co-authored-by: Steffen Zeile <48187781+Kaniee@users.noreply.github.com>
Co-authored-by: Thomas Wouters <thomas@python.org>
Co-authored-by: Radislav Chugunov <52372310+chgnrdv@users.noreply.github.com>
Co-authored-by: Karolina Surma <33810531+befeleme@users.noreply.github.com>
Co-authored-by: Tian Gao <gaogaotiantian@hotmail.com>
Co-authored-by: Ethan Furman <ethan@stoneleaf.us>
Co-authored-by: Sheidan <37596668+Sh3idan@users.noreply.github.com>
Co-authored-by: Christophe Nanteuil <35002064+christopheNan@users.noreply.github.com>
Co-authored-by: buermarc <44375277+buermarc@users.noreply.github.com>
Co-authored-by: Robert O'Shea <PurityLake@users.noreply.github.com>
Co-authored-by: Miyashita Yosuke <44266492+miyashiiii@users.noreply.github.com>
Co-authored-by: kcatss <kcats9731@gmail.com>
Co-authored-by: Christopher Chavez <chrischavez@gmx.us>
Co-authored-by: Phillip Schanely <pschanely@gmail.com>
Co-authored-by: keithasaurus <592217+keithasaurus@users.noreply.github.com>
Co-authored-by: DerSchinken <53398996+DerSchinken@users.noreply.github.com>
Co-authored-by: Skip Montanaro <skip.montanaro@gmail.com>
Co-authored-by: Éric <merwok@netwok.org>
Co-authored-by: mpage <mpage@meta.com>
Co-authored-by: David H. Gutteridge <dhgutteridge@users.noreply.github.com>
Co-authored-by: cdzhan <zhancdi@163.com>
kulikjak pushed a commit to kulikjak/cpython that referenced this issue Jan 22, 2024
…macOS (python#114057)

Some socket tests related to sending file descriptors cause a file descriptor leak on macOS, all of them tests that send one or more descriptors than cannot be received on the read end.  This appears to be a platform bug.

This PR skips those tests when doing a refleak test run to avoid hiding other problems.
aisk pushed a commit to aisk/cpython that referenced this issue Feb 11, 2024
…macOS (python#114057)

Some socket tests related to sending file descriptors cause a file descriptor leak on macOS, all of them tests that send one or more descriptors than cannot be received on the read end.  This appears to be a platform bug.

This PR skips those tests when doing a refleak test run to avoid hiding other problems.
Glyphack pushed a commit to Glyphack/cpython that referenced this issue Sep 2, 2024
…macOS (python#114057)

Some socket tests related to sending file descriptors cause a file descriptor leak on macOS, all of them tests that send one or more descriptors than cannot be received on the read end.  This appears to be a platform bug.

This PR skips those tests when doing a refleak test run to avoid hiding other problems.
@vstinner
Copy link
Member

What's the status of this issue?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
3.11 only security fixes 3.12 only security fixes 3.13 bugs and security fixes OS-mac tests Tests in the Lib/test dir type-bug An unexpected behavior, bug, or error
Projects
None yet
Development

No branches or pull requests

8 participants