Messages in this thread Patch in this message | | | From | zhang kai <> | Subject | [PATCH] ipv4: only allow increasing fib_info_hash_size | Date | Tue, 12 Oct 2021 19:06:58 +0800 |
| |
and when failed to allocate memory, check fib_info_hash_size.
Signed-off-by: zhang kai <zhangkaiheb@126.com> --- 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); -- 2.17.1
| |