summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2013-09-03 15:38:54 -0400
committerNick Mathewson <nickm@torproject.org>2013-09-03 15:38:54 -0400
commita8e76de4d997690917432d0d60383a1333f80baa (patch)
tree24a33e543af6185c66bbf280619d5450fc40e70b
parenta5610cfa64189db693dbad3efaa973d6720c42fe (diff)
parentd819663b661aea4f276404224fec6fe9c33f0bd9 (diff)
downloadtor-a8e76de4d997690917432d0d60383a1333f80baa.tar.gz
tor-a8e76de4d997690917432d0d60383a1333f80baa.zip
Merge branch 'bug9400_024_squashed' into maint-0.2.4
-rw-r--r--changes/bug94007
-rw-r--r--src/common/compat.c14
2 files changed, 14 insertions, 7 deletions
diff --git a/changes/bug9400 b/changes/bug9400
new file mode 100644
index 0000000000..974224068a
--- /dev/null
+++ b/changes/bug9400
@@ -0,0 +1,7 @@
+ o Minor bugfixes:
+
+ - Avoid double-closing the listener socket in our socketpair replacement
+ (used on Windows) in the case where the addresses on our opened
+ sockets don't match what we expected. Fixes bug 9400; bugfix on
+ every released Tor version. Found by Coverity.
+
diff --git a/src/common/compat.c b/src/common/compat.c
index 69eb0643d0..d88c5f92de 100644
--- a/src/common/compat.c
+++ b/src/common/compat.c
@@ -1225,9 +1225,9 @@ tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
* for now, and really, when localhost is down sometimes, we
* have other problems too.
*/
- tor_socket_t listener = -1;
- tor_socket_t connector = -1;
- tor_socket_t acceptor = -1;
+ tor_socket_t listener = TOR_INVALID_SOCKET;
+ tor_socket_t connector = TOR_INVALID_SOCKET;
+ tor_socket_t acceptor = TOR_INVALID_SOCKET;
struct sockaddr_in listen_addr;
struct sockaddr_in connect_addr;
int size;
@@ -1281,7 +1281,6 @@ tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
goto tidy_up_and_fail;
if (size != sizeof(listen_addr))
goto abort_tidy_up_and_fail;
- tor_close_socket(listener);
/* Now check we are talking to ourself by matching port and host on the
two sockets. */
if (getsockname(connector, (struct sockaddr *) &connect_addr, &size) == -1)
@@ -1292,6 +1291,7 @@ tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
|| listen_addr.sin_port != connect_addr.sin_port) {
goto abort_tidy_up_and_fail;
}
+ tor_close_socket(listener);
fd[0] = connector;
fd[1] = acceptor;
@@ -1306,11 +1306,11 @@ tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
tidy_up_and_fail:
if (saved_errno < 0)
saved_errno = errno;
- if (listener != -1)
+ if (SOCKET_OK(listener))
tor_close_socket(listener);
- if (connector != -1)
+ if (SOCKET_OK(connector))
tor_close_socket(connector);
- if (acceptor != -1)
+ if (SOCKET_OK(acceptor))
tor_close_socket(acceptor);
return -saved_errno;
#endif