From d819663b661aea4f276404224fec6fe9c33f0bd9 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Tue, 6 Aug 2013 16:41:57 -0400 Subject: [PATCH] Avoid a double-close on one failing case of the socketpair replacement code Fix for bug 9400, spotted by coverity. Bug introduced in revision 2cb4f7a4 (subversion revision r389). --- changes/bug9400 | 7 +++++++ src/common/compat.c | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 changes/bug9400 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 bf6a0a4243..d88c5f92de 100644 --- a/src/common/compat.c +++ b/src/common/compat.c @@ -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;