[tor-commits] [tor/master] Use getsockname, not getsockopt, on TPROXY sockets

nickm at torproject.org nickm at torproject.org
Fri Feb 6 03:54:40 UTC 2015


commit a8835170d710cae0ac1e8698cd5b750077025548
Author: Nick Mathewson <nickm at torproject.org>
Date:   Wed Feb 4 10:09:54 2015 -0500

    Use getsockname, not getsockopt, on TPROXY sockets
---
 src/or/connection_edge.c |   21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c
index 9690653..dd2f8d4 100644
--- a/src/or/connection_edge.c
+++ b/src/or/connection_edge.c
@@ -67,6 +67,10 @@
 #define TRANS_PF
 #endif
 
+#ifdef IP_TRANSPARENT
+#define TRANS_TPROXY
+#endif
+
 #define SOCKS4_GRANTED          90
 #define SOCKS4_REJECT           91
 
@@ -1583,7 +1587,7 @@ get_pf_socket(void)
 }
 #endif
 
-#if defined(TRANS_NETFILTER) || defined(TRANS_PF)
+#if defined(TRANS_NETFILTER) || defined(TRANS_PF) || defined(TRANS_TPROXY)
 /** Try fill in the address of <b>req</b> from the socket configured
  * with <b>conn</b>. */
 static int
@@ -1594,6 +1598,18 @@ destination_from_socket(entry_connection_t *conn, socks_request_t *req)
   tor_addr_t addr;
   int rv;
 
+#ifdef TRANS_TRPOXY
+  if (options->TransProxyType_parsed == TPT_TPROXY) {
+    if (getsockname(ENTRY_TO_CONN(conn)->s, (struct sockaddr*)&orig_dst,
+                    &orig_dst_len) < 0) {
+      int e = tor_socket_errno(ENTRY_TO_CONN(conn)->s);
+      log_warn(LD_NET, "getsockname() failed: %s", tor_socket_strerror(e));
+      return -1;
+    }
+    goto done;
+  }
+#endif
+
 #ifdef TRANS_NETFILTER
   switch (ENTRY_TO_CONN(conn)->socket_family) {
 #ifdef TRANS_NETFILTER_IPV4
@@ -1619,6 +1635,7 @@ destination_from_socket(entry_connection_t *conn, socks_request_t *req)
     log_warn(LD_NET, "getsockopt() failed: %s", tor_socket_strerror(e));
     return -1;
   }
+  goto done;
 #elif defined(TRANS_PF)
   if (getsockname(ENTRY_TO_CONN(conn)->s, (struct sockaddr*)&orig_dst,
                   &orig_dst_len) < 0) {
@@ -1626,6 +1643,7 @@ destination_from_socket(entry_connection_t *conn, socks_request_t *req)
     log_warn(LD_NET, "getsockname() failed: %s", tor_socket_strerror(e));
     return -1;
   }
+  goto done;
 #else
   (void)conn;
   (void)req;
@@ -1633,6 +1651,7 @@ destination_from_socket(entry_connection_t *conn, socks_request_t *req)
   return -1;
 #endif
 
+ done:
   tor_addr_from_sockaddr(&addr, (struct sockaddr*)&orig_dst, &req->port);
   tor_addr_to_str(req->address, &addr, sizeof(req->address), 1);
 





More information about the tor-commits mailing list