Merge remote-tracking branch 'origin/maint-0.2.4'

This commit is contained in:
Nick Mathewson 2013-09-03 15:41:50 -04:00
commit 9b2a0f5c75
2 changed files with 14 additions and 7 deletions

7
changes/bug9400 Normal file
View File

@ -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.

View File

@ -1313,9 +1313,9 @@ tor_ersatz_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
* for now, and really, when localhost is down sometimes, we * for now, and really, when localhost is down sometimes, we
* have other problems too. * have other problems too.
*/ */
tor_socket_t listener = -1; tor_socket_t listener = TOR_INVALID_SOCKET;
tor_socket_t connector = -1; tor_socket_t connector = TOR_INVALID_SOCKET;
tor_socket_t acceptor = -1; tor_socket_t acceptor = TOR_INVALID_SOCKET;
struct sockaddr_in listen_addr; struct sockaddr_in listen_addr;
struct sockaddr_in connect_addr; struct sockaddr_in connect_addr;
socklen_t size; socklen_t size;
@ -1369,7 +1369,6 @@ tor_ersatz_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
goto tidy_up_and_fail; goto tidy_up_and_fail;
if (size != sizeof(listen_addr)) if (size != sizeof(listen_addr))
goto abort_tidy_up_and_fail; goto abort_tidy_up_and_fail;
tor_close_socket(listener);
/* Now check we are talking to ourself by matching port and host on the /* Now check we are talking to ourself by matching port and host on the
two sockets. */ two sockets. */
if (getsockname(connector, (struct sockaddr *) &connect_addr, &size) == -1) if (getsockname(connector, (struct sockaddr *) &connect_addr, &size) == -1)
@ -1380,6 +1379,7 @@ tor_ersatz_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
|| listen_addr.sin_port != connect_addr.sin_port) { || listen_addr.sin_port != connect_addr.sin_port) {
goto abort_tidy_up_and_fail; goto abort_tidy_up_and_fail;
} }
tor_close_socket(listener);
fd[0] = connector; fd[0] = connector;
fd[1] = acceptor; fd[1] = acceptor;
@ -1394,11 +1394,11 @@ tor_ersatz_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
tidy_up_and_fail: tidy_up_and_fail:
if (saved_errno < 0) if (saved_errno < 0)
saved_errno = errno; saved_errno = errno;
if (listener != -1) if (SOCKET_OK(listener))
tor_close_socket(listener); tor_close_socket(listener);
if (connector != -1) if (SOCKET_OK(connector))
tor_close_socket(connector); tor_close_socket(connector);
if (acceptor != -1) if (SOCKET_OK(acceptor))
tor_close_socket(acceptor); tor_close_socket(acceptor);
return -saved_errno; return -saved_errno;
} }