]> git.dujemihanovic.xyz Git - linux.git/commitdiff
netfilter: nft_socket: fix sk refcount leaks
authorFlorian Westphal <fw@strlen.de>
Thu, 5 Sep 2024 10:54:46 +0000 (12:54 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 11 Sep 2024 22:16:54 +0000 (00:16 +0200)
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>
net/netfilter/nft_socket.c

index f30163e2ca620783cceda339c702c9f81b29cfa2..765ffd6e06bc418c81ae7371d28609794499b78e 100644 (file)
@@ -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);
 }