[tor-commits] [torsocks/master] Use getsockname(2) for finding out socket address family
dgoulet at torproject.org
dgoulet at torproject.org
Fri Apr 4 22:40:26 UTC 2014
commit f19b2e805638478812ce0102f8c2027701183eb2
Author: Linus Nordberg <linus at nordberg.se>
Date: Sun Aug 25 10:29:52 2013 +0200
Use getsockname(2) for finding out socket address family
Use this for portability. SO_DOMAIN seems to be a Linuxism.
Signed-off-by: David Goulet <dgoulet at ev0ke.net>
---
src/lib/recv.c | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
diff --git a/src/lib/recv.c b/src/lib/recv.c
index 9a70dd3..895892d 100644
--- a/src/lib/recv.c
+++ b/src/lib/recv.c
@@ -64,20 +64,23 @@ LIBC_RECVMSG_RET_TYPE tsocks_recvmsg(LIBC_RECVMSG_SIG)
* further.
*/
if (cmsg->cmsg_type == SCM_RIGHTS || cmsg->cmsg_level == SOL_SOCKET) {
- socklen_t optlen;
- int sock_dom;
+ struct sockaddr_storage addr;
+ socklen_t addrlen;
+ sa_family_t family = AF_UNSPEC;
memcpy(&fd, CMSG_DATA(cmsg), sizeof(fd));
- /* Get socket domain. */
- optlen = sizeof(sock_dom);
- ret = getsockopt(fd, SOL_SOCKET, SO_DOMAIN, &sock_dom, &optlen);
+ /* Get socket protocol family. */
+ addrlen = sizeof(addr);
+ ret = getsockname(fd, (struct sockaddr *) &addr, &addrlen);
if (ret < 0) {
- /* Use the getsockopt() errno value. */
+ /* Use the getsockname() errno value. */
goto end;
}
- if (sock_dom == AF_INET || sock_dom == AF_INET6) {
+ family = ((struct sockaddr *) &addr)->sa_family;
+
+ if (family == AF_INET || family == AF_INET6) {
ERR("[recvmsg] Inet socket passing detected. Aborting everything! "
"A non Tor socket could be used thus leaking information.");
exit(EXIT_FAILURE);
More information about the tor-commits
mailing list