[tor-commits] [torsocks/master] Fix: memory leak in connect error path

dgoulet at torproject.org dgoulet at torproject.org
Fri Apr 4 22:40:28 UTC 2014


commit e70264869c19e0ff44ecf5898858af37e7a9fabd
Author: David Goulet <dgoulet at ev0ke.net>
Date:   Thu Apr 3 17:36:01 2014 -0400

    Fix: memory leak in connect error path
    
    Fixes coverity issue 1072757.
    
    Signed-off-by: David Goulet <dgoulet at ev0ke.net>
---
 src/lib/connect.c |   18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/src/lib/connect.c b/src/lib/connect.c
index 5ecb2ff..5e56e4e 100644
--- a/src/lib/connect.c
+++ b/src/lib/connect.c
@@ -105,7 +105,7 @@ error:
  */
 LIBC_CONNECT_RET_TYPE tsocks_connect(LIBC_CONNECT_SIG)
 {
-	int ret;
+	int ret, ret_errno;
 	struct connection *new_conn;
 	struct onion_entry *on_entry;
 
@@ -162,8 +162,8 @@ LIBC_CONNECT_RET_TYPE tsocks_connect(LIBC_CONNECT_SIG)
 		new_conn->dest_addr.hostname.port = utils_get_port_from_addr(addr);
 		new_conn->dest_addr.hostname.addr = strdup(on_entry->hostname);
 		if (!new_conn->dest_addr.hostname.addr) {
-			errno = ENOMEM;
-			goto error;
+			ret_errno = ENOMEM;
+			goto error_free;
 		}
 	} else {
 		/*
@@ -189,8 +189,8 @@ LIBC_CONNECT_RET_TYPE tsocks_connect(LIBC_CONNECT_SIG)
 	/* Connect the socket to the Tor network. */
 	ret = tsocks_connect_to_tor(new_conn);
 	if (ret < 0) {
-		errno = -ret;
-		goto error;
+		ret_errno = -ret;
+		goto error_free;
 	}
 
 	connection_registry_lock();
@@ -204,6 +204,14 @@ LIBC_CONNECT_RET_TYPE tsocks_connect(LIBC_CONNECT_SIG)
 
 libc_connect:
 	return tsocks_libc_connect(LIBC_CONNECT_ARGS);
+
+error_free:
+	/*
+	 * Put back reference of newly created connection. Will be freed if
+	 * refcount goes down to 0.
+	 */
+	connection_put_ref(new_conn);
+	errno = ret_errno;
 error:
 	/* At this point, errno MUST be set to a valid connect() error value. */
 	return -1;





More information about the tor-commits mailing list