Re: [PATCH] ipv4: only allow increasing fib_info_hash_size
From: David Ahern <hidden>
Date: 2021-10-12 13:55:31
Also in:
lkml
On 10/12/21 5:06 AM, zhang kai wrote:
and when failed to allocate memory, check fib_info_hash_size.
what problem are you trying to solve?
quoted hunk ↗ jump to hunk
Signed-off-by: zhang kai <redacted> --- net/ipv4/fib_semantics.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-)diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c index a632b66bc..7547708a9 100644 --- a/net/ipv4/fib_semantics.c +++ b/net/ipv4/fib_semantics.c@@ -1403,17 +1403,20 @@ struct fib_info *fib_create_info(struct fib_config *cfg, if (!new_size) new_size = 16; - bytes = new_size * sizeof(struct hlist_head *); - new_info_hash = fib_info_hash_alloc(bytes); - new_laddrhash = fib_info_hash_alloc(bytes); - if (!new_info_hash || !new_laddrhash) { - fib_info_hash_free(new_info_hash, bytes); - fib_info_hash_free(new_laddrhash, bytes); - } else - fib_info_hash_move(new_info_hash, new_laddrhash, new_size); - - if (!fib_info_hash_size) - goto failure; + + if (new_size > fib_info_hash_size) { + bytes = new_size * sizeof(struct hlist_head *); + new_info_hash = fib_info_hash_alloc(bytes); + new_laddrhash = fib_info_hash_alloc(bytes); + if (!new_info_hash || !new_laddrhash) { + fib_info_hash_free(new_info_hash, bytes); + fib_info_hash_free(new_laddrhash, bytes); + + if (!fib_info_hash_size) + goto failure; + } else + fib_info_hash_move(new_info_hash, new_laddrhash, new_size); + } } fi = kzalloc(struct_size(fi, fib_nh, nhs), GFP_KERNEL);