[tor-commits] [tor/master] New function for Tor to treat itself as the "owner" of a socket

nickm at torproject.org nickm at torproject.org
Wed Nov 1 17:30:10 UTC 2017


commit 4eb5753bd29b24fd5a523499add35a6214293cd9
Author: Nick Mathewson <nickm at torproject.org>
Date:   Wed Oct 18 12:14:30 2017 -0400

    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.
---
 src/common/compat.c | 18 +++++++++++++-----
 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 97eab94e0..38693b21f 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 fee9e6587..0aabee68c 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);





More information about the tor-commits mailing list