summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2017-10-18 12:14:30 -0400
committerNick Mathewson <nickm@torproject.org>2017-10-18 12:17:44 -0400
commit4eb5753bd29b24fd5a523499add35a6214293cd9 (patch)
tree29f6a7ff97740adcbd68065872202ac1ad6c17af /src
parent5bcd8dc5c482da4da71402cd06b0ecc709f05493 (diff)
downloadtor-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.c18
-rw-r--r--src/common/compat.h1
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);