kerndat: don't leak a socket file descriptor

kerndat_has_ipv6_freebind creates a socket but doesn't close it.

Signed-off-by: Andrei Vagin <avagin@google.com>
This commit is contained in:
Andrei Vagin 2023-07-07 16:33:12 -07:00 committed by Andrei Vagin
parent a96aa58096
commit 935e60d65b

View file

@ -1574,9 +1574,26 @@ static int kerndat_has_nftables_concat(void)
#define IPV6_FREEBIND 78
#endif
static int __kerndat_has_ipv6_freebind(int sk)
{
int val = 1;
if (setsockopt(sk, SOL_IPV6, IPV6_FREEBIND, &val, sizeof(int)) == -1) {
if (errno == ENOPROTOOPT) {
kdat.has_ipv6_freebind = false;
return 0;
}
pr_perror("Unable to setsockopt ipv6_freebind");
return -1;
}
kdat.has_ipv6_freebind = true;
return 0;
}
static int kerndat_has_ipv6_freebind(void)
{
int sk, val;
int sk, ret;
if (!kdat.ipv6) {
kdat.has_ipv6_freebind = false;
@ -1589,18 +1606,9 @@ static int kerndat_has_ipv6_freebind(void)
return -1;
}
val = 1;
if (setsockopt(sk, SOL_IPV6, IPV6_FREEBIND, &val, sizeof(int)) == -1) {
if (errno == ENOPROTOOPT) {
kdat.has_ipv6_freebind = false;
return 0;
}
pr_perror("Unable to setsockopt ipv6_freebind");
return -1;
}
kdat.has_ipv6_freebind = true;
return 0;
ret = __kerndat_has_ipv6_freebind(sk);
close(sk);
return ret;
}
/*