diff options
author | Nick Mathewson <nickm@torproject.org> | 2015-02-04 10:09:54 -0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2015-02-04 10:09:54 -0500 |
commit | a8835170d710cae0ac1e8698cd5b750077025548 (patch) | |
tree | 9fd353a6aaf304892b7fb890fbb0dd4b31054d14 /src/or/connection_edge.c | |
parent | ac8f235446ad1b26d9f85df10cca8ce250588b83 (diff) | |
download | tor-a8835170d710cae0ac1e8698cd5b750077025548.tar.gz tor-a8835170d710cae0ac1e8698cd5b750077025548.zip |
Use getsockname, not getsockopt, on TPROXY sockets
Diffstat (limited to 'src/or/connection_edge.c')
-rw-r--r-- | src/or/connection_edge.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index 9690653d59..dd2f8d42a0 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); |