summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2024-09-05 12:54:46 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2024-09-12 00:16:54 +0200
commit8b26ff7af8c32cb4148b3e147c52f9e4c695209c (patch)
tree22460eb510dc7ff691dcb78d76ecc1c8fa007a58
parentd759ee240d3c0c4a19f4d984eb21c36da76bc6ce (diff)
downloadlinux-8b26ff7af8c32cb4148b3e147c52f9e4c695209c.tar.gz
linux-8b26ff7af8c32cb4148b3e147c52f9e4c695209c.tar.bz2
linux-8b26ff7af8c32cb4148b3e147c52f9e4c695209c.zip
netfilter: nft_socket: fix sk refcount leaks
We must put 'sk' reference before returning. Fixes: 039b1f4f24ec ("netfilter: nft_socket: fix erroneous socket assignment") Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--net/netfilter/nft_socket.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/net/netfilter/nft_socket.c b/net/netfilter/nft_socket.c
index f30163e2ca62..765ffd6e06bc 100644
--- a/net/netfilter/nft_socket.c
+++ b/net/netfilter/nft_socket.c
@@ -110,13 +110,13 @@ static void nft_socket_eval(const struct nft_expr *expr,
*dest = READ_ONCE(sk->sk_mark);
} else {
regs->verdict.code = NFT_BREAK;
- return;
+ goto out_put_sk;
}
break;
case NFT_SOCKET_WILDCARD:
if (!sk_fullsock(sk)) {
regs->verdict.code = NFT_BREAK;
- return;
+ goto out_put_sk;
}
nft_socket_wildcard(pkt, regs, sk, dest);
break;
@@ -124,7 +124,7 @@ static void nft_socket_eval(const struct nft_expr *expr,
case NFT_SOCKET_CGROUPV2:
if (!nft_sock_get_eval_cgroupv2(dest, sk, pkt, priv->level)) {
regs->verdict.code = NFT_BREAK;
- return;
+ goto out_put_sk;
}
break;
#endif
@@ -133,6 +133,7 @@ static void nft_socket_eval(const struct nft_expr *expr,
regs->verdict.code = NFT_BREAK;
}
+out_put_sk:
if (sk != skb->sk)
sock_gen_put(sk);
}