It seems socket.recvmsg
can’t receive file descriptors on FreeBSD. Is it a normal behavior or actually a bug?
Reproduce
server.py
import socket
import array
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.bind('server.sock')
sock.listen(1)
def handle_client():
while True:
conn, addr = sock.accept()
a = array.array('i')
bytes_size = a.itemsize * 1
msg, ancdata, flags, addr = conn.recvmsg(1, socket.CMSG_LEN(bytes_size))
print(msg)
print(ancdata)
handle_client()
client.py
import socket
import array
import os
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect('server.sock')
fds = array.array('i', [os.pipe()[0]])
msg = bytes([len(fds) % 256])
t = [(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)]
print(t)
Output
server.py
// FreeBSD
b'\x01'
[]
// Linux
b'\x01'
[(1, 1, b'\x08\x00\x00\x00')]
client.py
// FreeBSD
b'\x01'
[(65535, 1, array('i', [4]))]
// Linux
b'\x01'
[(1, 1, array('i', [4]))
Extra Information
Test on:
FreeBSD 13.2-REALEASE
Python 3.9.18 (install by pkg)