diff options
author | Nick Mathewson <nickm@torproject.org> | 2017-10-18 12:14:30 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2017-10-18 12:17:44 -0400 |
commit | 4eb5753bd29b24fd5a523499add35a6214293cd9 (patch) | |
tree | 29f6a7ff97740adcbd68065872202ac1ad6c17af /src | |
parent | 5bcd8dc5c482da4da71402cd06b0ecc709f05493 (diff) | |
download | tor-4eb5753bd29b24fd5a523499add35a6214293cd9.tar.gz tor-4eb5753bd29b24fd5a523499add35a6214293cd9.zip |
New function for Tor to treat itself as the "owner" of a socket
Our socket accounting functions assumed that we'd never be asked to
close a socket that we didn't open ourselves. But now we want to
support taking control sockets that we inherit -- so we need a way
of taking ownership of them, so we don't freak out later on when we
close them.
Diffstat (limited to 'src')
-rw-r--r-- | src/common/compat.c | 18 | ||||
-rw-r--r-- | src/common/compat.h | 1 |
2 files changed, 14 insertions, 5 deletions
diff --git a/src/common/compat.c b/src/common/compat.c index 97eab94e04..38693b21fe 100644 --- a/src/common/compat.c +++ b/src/common/compat.c @@ -1273,11 +1273,22 @@ tor_open_socket_with_extensions(int domain, int type, int protocol, goto socket_ok; /* So that socket_ok will not be unused. */ socket_ok: + tor_take_socket_ownership(s); + return s; +} + +/** + * For socket accounting: remember that we are the owner of the socket + * <b>s</b>. This will prevent us from overallocating sockets, and prevent us + * from asserting later when we close the socket <b>s</b>. + */ +void +tor_take_socket_ownership(tor_socket_t s) +{ socket_accounting_lock(); ++n_sockets_open; mark_socket_open(s); socket_accounting_unlock(); - return s; } /** As accept(), but counts the number of open sockets. */ @@ -1358,10 +1369,7 @@ tor_accept_socket_with_extensions(tor_socket_t sockfd, struct sockaddr *addr, goto socket_ok; /* So that socket_ok will not be unused. */ socket_ok: - socket_accounting_lock(); - ++n_sockets_open; - mark_socket_open(s); - socket_accounting_unlock(); + tor_take_socket_ownership(s); return s; } diff --git a/src/common/compat.h b/src/common/compat.h index fee9e6587d..0aabee68c8 100644 --- a/src/common/compat.h +++ b/src/common/compat.h @@ -483,6 +483,7 @@ typedef int socklen_t; int tor_close_socket_simple(tor_socket_t s); MOCK_DECL(int, tor_close_socket, (tor_socket_t s)); +void tor_take_socket_ownership(tor_socket_t s); tor_socket_t tor_open_socket_with_extensions( int domain, int type, int protocol, int cloexec, int nonblock); |