On debian/kFreeBSD is not defined HasBSD44Sockets. It should't be problem because FreeBSD kernel 5.4 and 6.0 tries to be compatible with older (BSD43) source code and at least in connect(), bind() ignores value in the field sun_len. It uses only the value addrlen from function in system call. Unfortunately, the we are hitted by computing the whole name length as namelen = strlen(sockname.sun_path) + sizeof(sockname.sun_family); instead of portable namelen = strlen(sockname.sun_path) + offsetof(struct sockaddr_un, sun_path); Therefore, it would be sufficient to correct calculation with sun_path in whole xorg-x11. Moreover, it is mainly correct, only 2 files need fix. ok programs/xdm/prngc.c ok programs/xdm/xdmcp.c ok programs/xdm/netaddr.c patch lib/dps/csconndi.c patch lib/xtrans/Xtranssock.c ok lib/xtrans/Xtranstli.c ok lib/xtrans/Xtranslcl.c ok lib/xtrans/Xtransutil.c ok extras/Mesa/src/glx/mini/miniglx_events.c The patch should be straightforward: Please, could you apply it. Thanks in advance Petr --- lib/dps/csconndi.c~ 2005-11-07 20:59:23.000000000 +0000 +++ lib/dps/csconndi.c 2005-11-07 20:59:23.000000000 +0000 @@ -506,7 +506,7 @@ sprintf (unaddr.sun_path, "%s_%d", CSDPS_UNIX_PATH, port); addr = (struct sockaddr *) &unaddr; - addrlen = strlen(unaddr.sun_path) + sizeof(unaddr.sun_family); + addrlen = strlen(unaddr.sun_path) + offsetof(struct sockaddr_un, sun_path)); /* * Open the network connection. --- lib/xtrans/Xtranssock.c~ 2005-11-07 21:02:32.000000000 +0000 +++ lib/xtrans/Xtranssock.c 2005-11-07 21:02:32.000000000 +0000 @@ -1092,7 +1092,7 @@ sockname.sun_len = strlen(sockname.sun_path); namelen = SUN_LEN(&sockname); #else - namelen = strlen(sockname.sun_path) + sizeof(sockname.sun_family); + namelen = strlen(sockname.sun_path) + offsetof(struct sockaddr_un, sun_path); #endif unlink (sockname.sun_path); @@ -1975,7 +1975,7 @@ sockname.sun_len = strlen (sockname.sun_path); namelen = SUN_LEN (&sockname); #else - namelen = strlen (sockname.sun_path) + sizeof (sockname.sun_family); + namelen = strlen (sockname.sun_path) + offsetof(struct sockaddr_un, sun_path); #endif @@ -1989,7 +1989,7 @@ return TRANS_CONNECT_FAILED; } old_namelen = strlen (old_sockname.sun_path) + - sizeof (old_sockname.sun_family); + offsetof(struct sockaddr_un, sun_path); #endif
Actually according to POSIX1.2004, you don't even't need to use strlen and offsetof, you can use sizeof(struct sockaddr_un) instead. Tested with a FreeBSD kernel and a Linux kernel. POSIX1.2004, page 263 says: "address_len Specifies the length of the sockaddr structure pointed to by the address argument."
Reassigning to modular xlibs.
Created attachment 5404 [details] [review] updated patch for CVS HEAD
... and back to xorg. xlibs is dead.
Created attachment 5424 [details] [review] updated patch for CVS HEAD there have been a typo in last chunk
Patch committed to git head: commit 2495789d6c290e2037b2836f28b027786ea5b605 Author: Petr Salinger <petr.salinger@t-systems.cz> Date: Sun Apr 23 01:31:00 2006 -0700 Bug 4982: use offsetof for manipulating struct sockaddr_un X.Org Bugzilla #4982 <https://bugs.freedesktop.org/show_bug.cgi?id=4982> Patch #5424 <https://bugs.freedesktop.org/attachment.cgi?id=5424> Thanks for the patch! (I've also committed a followon that uses SUN_LEN if it's defined, even when BSD44SOCKETS is not.)
Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.