[tor-commits] [tor/master] Tweak fix for #8789 a bit; avoid double-close and add changes file

nickm at torproject.org nickm at torproject.org
Fri May 24 16:23:42 UTC 2013


commit b4b0063e48a2687e7971730defc9b5a99a396cc4
Author: Nick Mathewson <nickm at torproject.org>
Date:   Fri May 24 12:23:21 2013 -0400

    Tweak fix for #8789 a bit; avoid double-close and add changes file
---
 changes/bug8789     |    3 +++
 src/or/connection.c |    7 +++++--
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/changes/bug8789 b/changes/bug8789
new file mode 100644
index 0000000..e3bcc40
--- /dev/null
+++ b/changes/bug8789
@@ -0,0 +1,3 @@
+   o Code simplifications and refactoring:
+     - Clean up exit path from connection_listener_new. Closes bug
+       8789. Patch from Arlo Breault.
diff --git a/src/or/connection.c b/src/or/connection.c
index 82d0310..aa3cc33 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -940,7 +940,7 @@ connection_listener_new(const struct sockaddr *listensockaddr,
                            const port_cfg_t *port_cfg)
 {
   listener_connection_t *lis_conn;
-  connection_t *conn;
+  connection_t *conn = NULL;
   tor_socket_t s = TOR_INVALID_SOCKET;  /* the socket we're going to make */
   or_options_t const *options = get_options();
 #if defined(HAVE_PWD_H) && defined(HAVE_SYS_UN_H)
@@ -1106,6 +1106,7 @@ connection_listener_new(const struct sockaddr *listensockaddr,
   conn = TO_CONN(lis_conn);
   conn->socket_family = listensockaddr->sa_family;
   conn->s = s;
+  s = TOR_INVALID_SOCKET; /* Prevent double-close */
   conn->address = tor_strdup(address);
   conn->port = gotPort;
   tor_addr_copy(&conn->addr, &addr);
@@ -1141,7 +1142,6 @@ connection_listener_new(const struct sockaddr *listensockaddr,
 
   if (connection_add(conn) < 0) { /* no space, forget it */
     log_warn(LD_NET,"connection_add for listener failed. Giving up.");
-    connection_free(conn);
     goto err;
   }
 
@@ -1162,6 +1162,9 @@ connection_listener_new(const struct sockaddr *listensockaddr,
  err:
   if (SOCKET_OK(s))
     tor_close_socket(s);
+  if (conn)
+    connection_free(conn);
+
   return NULL;
 }
 



More information about the tor-commits mailing list