[PATCH mptcp-next v7 9/9] selftests: mptcp: connect: close listensock deterministically
Geliang Tang <[email protected]> Fri, 17 Jul 2026 12:50:18 +0800
| Newsgroups | dev.linux.lists.mptcp |
|---|---|
| Message-ID | <9644df2640dec25a8b5de1176a70d828c66dfa1a.1784260668.git.tanggeliang@kylinos.cn> |
From: Geliang Tang <[email protected]> In main_loop_s(), listensock was closed nondeterministically inside maybe_close() during the accept loop, and error paths closed it without tracking, leading to double-close or leaks across repeated iterations (via goto again). Fix by making maybe_close() return a bool indicating whether it closed the fd, and track that per iteration. Funnel poll/accept error paths through a single 'goto out' label and close the socket there only if not already closed. Reset 'closed' at the 'again:' label so each iteration starts with a fresh tracking state. This ensures exactly one close per iteration in all cases. Signed-off-by: Geliang Tang <[email protected]> --- .../selftests/net/mptcp/mptcp_connect.c | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect.c b/tools/testing/selftests/net/mptcp/mptcp_connect.c index f6ebdc5bf745..b04c99605518 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_connect.c +++ b/tools/testing/selftests/net/mptcp/mptcp_connect.c @@ -1323,12 +1323,15 @@ static void check_getpeername_connect(int fd) cfg_host, a, cfg_port, b); } -static void maybe_close(int fd) +static bool maybe_close(int fd) { unsigned int r = rand(); - if (!(cfg_join || cfg_remove || cfg_repeat > 1) && (r & 1)) + if (!(cfg_join || cfg_remove || cfg_repeat > 1) && (r & 1)) { close(fd); + return true; + } + return false; } int main_loop_s(int listensock) @@ -1338,27 +1341,30 @@ int main_loop_s(int listensock) struct pollfd polls; socklen_t salen; int remotesock; + bool closed; int err = 0; int fd = 0; again: + closed = false; polls.fd = listensock; polls.events = POLLIN; switch (poll(&polls, 1, poll_timeout)) { case -1: perror("poll"); - return 1; + err = 1; + goto out; case 0: fprintf(stderr, "%s: timed out\n", __func__); - close(listensock); - return 2; + err = 2; + goto out; } salen = sizeof(ss); remotesock = accept(listensock, (struct sockaddr *)&ss, &salen); if (remotesock >= 0) { - maybe_close(listensock); + closed = maybe_close(listensock); check_sockaddr(pf, &ss, salen); check_getpeername(remotesock, &ss, salen); @@ -1374,7 +1380,8 @@ int main_loop_s(int listensock) err = copyfd_io(fd, remotesock, 1, true, &winfo); } else { perror("accept"); - return 1; + err = 1; + goto out; } if (cfg_input) @@ -1383,6 +1390,9 @@ int main_loop_s(int listensock) if (!err && --cfg_repeat > 0) goto again; +out: + if (!closed) + close(listensock); return err; } -- 2.53.0