From 935e60d65b9435aa431fa587799e5b4e4f380ade Mon Sep 17 00:00:00 2001 From: Andrei Vagin Date: Fri, 7 Jul 2023 16:33:12 -0700 Subject: [PATCH] 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 --- criu/kerndat.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/criu/kerndat.c b/criu/kerndat.c index c74201617..4b836b5f7 100644 --- a/criu/kerndat.c +++ b/criu/kerndat.c @@ -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; } /*