diff --git a/Lib/socket.py b/Lib/socket.py index 35d87eff34deb1..9e21a0989fd29c 100644 --- a/Lib/socket.py +++ b/Lib/socket.py @@ -557,7 +557,7 @@ def send_fds(sock, buffers, fds, flags=0, address=None): Send the list of file descriptors fds over an AF_UNIX socket. """ return sock.sendmsg(buffers, [(_socket.SOL_SOCKET, - _socket.SCM_RIGHTS, array.array("i", fds))]) + _socket.SCM_RIGHTS, array.array("i", fds))], flags, address) __all__.append("send_fds") if hasattr(_socket.socket, "recvmsg"): diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index d33cc052d1cd4f..a68c60b0e8899f 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -7219,6 +7219,30 @@ def close_fds(fds): data = os.read(rfd, 100) self.assertEqual(data, str(index).encode()) + def testSendAndRecvFdsByAddress(self): + rfd, wfd = os.pipe() + self.addCleanup(os.close, rfd) + self.addCleanup(os.close, wfd) + + sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) + address = socket_helper.create_unix_domain_name() + self.addCleanup(os_helper.unlink, address) + socket_helper.bind_unix_socket(sock, address) + + socket.send_fds(sock, [MSG], [rfd], 0, address) + + # request more data and file descriptors than expected + msg, (rfd2,), flags, addr = socket.recv_fds(sock, len(MSG) * 2, 2) + self.addCleanup(os.close, rfd2) + self.assertEqual(msg, MSG) + self.assertEqual(flags, 0) + self.assertEqual(addr, address) + + # test that the file descriptor is connected + os.write(wfd, b'data') + data = os.read(rfd2, 100) + self.assertEqual(data, b'data') + def setUpModule(): thread_info = threading_helper.threading_setup() diff --git a/Misc/NEWS.d/next/Library/2024-12-11-20-15-00.gh-issue-127840.pt8fiQ.rst b/Misc/NEWS.d/next/Library/2024-12-11-20-15-00.gh-issue-127840.pt8fiQ.rst new file mode 100644 index 00000000000000..51eaaa96ebaa07 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-12-11-20-15-00.gh-issue-127840.pt8fiQ.rst @@ -0,0 +1 @@ +Fix :func:`socket.send_fds` ignoring flags and address parameters.