mirror of https://gitee.com/openkylin/linux.git
netfilter: conntrack: avoid integer overflow when resizing
Can overflow so we might allocate very small table when bucket count is high on a 32bit platform. Note: resize is only possible from init_netns. Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
parent
62131e5d73
commit
9cc1c73ad6
|
@ -1601,8 +1601,15 @@ void *nf_ct_alloc_hashtable(unsigned int *sizep, int nulls)
|
||||||
unsigned int nr_slots, i;
|
unsigned int nr_slots, i;
|
||||||
size_t sz;
|
size_t sz;
|
||||||
|
|
||||||
|
if (*sizep > (UINT_MAX / sizeof(struct hlist_nulls_head)))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
BUILD_BUG_ON(sizeof(struct hlist_nulls_head) != sizeof(struct hlist_head));
|
BUILD_BUG_ON(sizeof(struct hlist_nulls_head) != sizeof(struct hlist_head));
|
||||||
nr_slots = *sizep = roundup(*sizep, PAGE_SIZE / sizeof(struct hlist_nulls_head));
|
nr_slots = *sizep = roundup(*sizep, PAGE_SIZE / sizeof(struct hlist_nulls_head));
|
||||||
|
|
||||||
|
if (nr_slots > (UINT_MAX / sizeof(struct hlist_nulls_head)))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
sz = nr_slots * sizeof(struct hlist_nulls_head);
|
sz = nr_slots * sizeof(struct hlist_nulls_head);
|
||||||
hash = (void *)__get_free_pages(GFP_KERNEL | __GFP_NOWARN | __GFP_ZERO,
|
hash = (void *)__get_free_pages(GFP_KERNEL | __GFP_NOWARN | __GFP_ZERO,
|
||||||
get_order(sz));
|
get_order(sz));
|
||||||
|
|
Loading…
Reference in New Issue