[PATCH] selftests/net: ovpn: fix socket leak in ovpn_socket() error paths
Qingshuang Fu <[email protected]>
| Newsgroups | org.kernel.vger.linux-kselftest,org.kernel.vger.linux-kernel,org.kernel.vger.netdev |
|---|---|
| Message-ID | <[email protected]> |
From: Qingshuang Fu <[email protected]> The ovpn_socket() function creates a socket but fails to close it on several error paths, leading to a file descriptor leak: 1. When the address family is neither AF_INET nor AF_INET6, the socket is leaked in the switch default case. 2. When setsockopt() for SO_REUSEADDR, SO_REUSEPORT, or SO_MARK fails, the socket is leaked. 3. When setsockopt() for IPV6_V6ONLY fails, the socket is leaked. The existing err_socket label already handles closing the socket for the bind() failure path. Fix all other error paths to use goto err_socket instead of returning directly, ensuring the socket is properly closed on every error path. Fixes: 959bc330a439 ("testing/selftests: add test tool and scripts for ovpn module") Signed-off-by: Qingshuang Fu <[email protected]> --- tools/testing/selftests/net/ovpn/ovpn-cli.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tools/testing/selftests/net/ovpn/ovpn-cli.c b/tools/testing/selftests/net/ovpn/ovpn-cli.c index f4effa7580c0..81b81d5fc162 100644 --- a/tools/testing/selftests/net/ovpn/ovpn-cli.c +++ b/tools/testing/selftests/net/ovpn/ovpn-cli.c @@ -507,7 +507,8 @@ static int ovpn_socket(struct ovpn_ctx *ctx, sa_family_t family, int proto) sock_len = sizeof(*in6); break; default: - return -1; + ret = -EINVAL; + goto err_socket; } int opt = 1; @@ -516,13 +517,13 @@ static int ovpn_socket(struct ovpn_ctx *ctx, sa_family_t family, int proto) if (ret < 0) { perror("setsockopt for SO_REUSEADDR"); - return ret; + goto err_socket; } ret = setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)); if (ret < 0) { perror("setsockopt for SO_REUSEPORT"); - return ret; + goto err_socket; } if (ctx->mark != 0) { @@ -530,16 +531,16 @@ static int ovpn_socket(struct ovpn_ctx *ctx, sa_family_t family, int proto) sizeof(ctx->mark)); if (ret < 0) { perror("setsockopt for SO_MARK"); - return ret; + goto err_socket; } } if (family == AF_INET6) { opt = 0; - if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, &opt, - sizeof(opt))) { + ret = setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, &opt, sizeof(opt)); + if (ret < 0) { perror("failed to set IPV6_V6ONLY"); - return -1; + goto err_socket; } } base-commit: f9a2394a23482bfd330911e9c8295b71724feacd -- 2.25.1