The calculation of the address length for AF_UNIX sockets in the getsockaddrarg function in socketmodule.c returns wrong values on platforms with padded struct sockaddr_un: *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path); sizeof(*addr) is for example 112 on an ARM (NSLU2) platforms, while it is 110 on a i386 PC. The correct way to calculate the length is by directly using the offset of the sun_path field: *len_ret = len + offsetof(struct sockaddr_un, sun_path); as suggested in the GNU libc manual: http://www.gnu.org/software/libc/manual/html_node/Local-Socket-Example.html The correction also needs to be applied to the makesockaddr function when reversing the above addition in the case of abstract namespace sockets on linux.
The patch looks ok on 2.6, I recommend checking it there. (Due to line number changes in socketmodule.c, the patch gives a warning, but it is still otherwise up-to-date.)