]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
netfilter: conntrack: clamp maximum hashtable size to INT_MAX
authorPablo Neira Ayuso <pablo@netfilter.org>
Wed, 8 Jan 2025 21:56:33 +0000 (22:56 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Thu, 9 Jan 2025 12:29:45 +0000 (13:29 +0100)
Use INT_MAX as maximum size for the conntrack hashtable. Otherwise, it
is possible to hit WARN_ON_ONCE in __kvmalloc_node_noprof() when
resizing hashtable because __GFP_NOWARN is unset. See:

  0708a0afe291 ("mm: Consider __GFP_NOWARN flag for oversized kvmalloc() calls")

Note: hashtable resize is only possible from init_netns.

Fixes: 9cc1c73ad666 ("netfilter: conntrack: avoid integer overflow when resizing")
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nf_conntrack_core.c

index 9db3e2b0b1c34799d8e498246877f0639a757284..456446d7af200e1f786430a10c8c7bcf0639e26d 100644 (file)
@@ -2517,12 +2517,15 @@ void *nf_ct_alloc_hashtable(unsigned int *sizep, int nulls)
        struct hlist_nulls_head *hash;
        unsigned int nr_slots, i;
 
-       if (*sizep > (UINT_MAX / sizeof(struct hlist_nulls_head)))
+       if (*sizep > (INT_MAX / sizeof(struct hlist_nulls_head)))
                return NULL;
 
        BUILD_BUG_ON(sizeof(struct hlist_nulls_head) != sizeof(struct hlist_head));
        nr_slots = *sizep = roundup(*sizep, PAGE_SIZE / sizeof(struct hlist_nulls_head));
 
+       if (nr_slots > (INT_MAX / sizeof(struct hlist_nulls_head)))
+               return NULL;
+
        hash = kvcalloc(nr_slots, sizeof(struct hlist_nulls_head), GFP_KERNEL);
 
        if (hash && nulls)