intrig...@debian.org wrote: > The fix for #766306 makes torsocks FTBFS on kfreebsd-*: > https://buildd.debian.org/status/package.php?p=torsocks
Hi, SO_DOMAIN was only accepted into POSIX earlier this year: http://austingroupbugs.net/view.php?id=840 it seems to be only available yet on Linux and Solaris. For FreeBSD I came up with the attached, hackish workaround using SO_TYPE (widely available), and out of the available protocols in PF_LOCAL (= AF_UNIX), assume that only SOCK_{DGRAM,SEQPACKET,STREAM} are candidates for fd passing. Perhaps someone has a better idea? Regards, -- Steven Chamberlain ste...@pyro.eu.org
--- a/src/lib/recv.c +++ b/src/lib/recv.c @@ -60,7 +60,11 @@ */ LIBC_RECVMSG_RET_TYPE tsocks_recvmsg(LIBC_RECVMSG_SIG) { +#ifdef SO_DOMAIN int sock_domain; +#else + int sock_type; +#endif socklen_t optlen; ssize_t ret = 0; char dummy, recv_fd[CMSG_SPACE(SCM_MAX_FD)]; @@ -68,6 +72,7 @@ struct cmsghdr *cmsg; struct msghdr msg_hdr; +#ifdef SO_DOMAIN /* Don't bother if the socket family is NOT Unix. */ optlen = sizeof(sock_domain); ret = getsockopt(sockfd, SOL_SOCKET, SO_DOMAIN, &sock_domain, &optlen); @@ -79,6 +84,21 @@ if (sock_domain != AF_UNIX) { goto libc; } +#else + /* Don't bother if the socket type unsuitable for fd passing */ + optlen = sizeof(sock_type); + ret = getsockopt(sockfd, SOL_SOCKET, SO_TYPE, &sock_type, &optlen); + if (ret < 0) { + DBG("[recvmsg] Fail getsockopt() on sock %d", sockfd); + errno = EBADF; + goto error; + } + if (sock_type != SOCK_DGRAM && + sock_type != SOCK_SEQPACKET && + sock_type != SOCK_STREAM) { + goto libc; + } +#endif memset(&msg_hdr, 0, sizeof(msg_hdr));