diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index a5255a0dcbb6..1b908dd19aee 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -1055,6 +1055,7 @@ static void print_insn_state(struct bpf_verifier_env *env, static void *copy_array(void *dst, const void *src, size_t n, size_t size, gfp_t flags) { size_t bytes; + void *p; if (ZERO_OR_NULL_PTR(src)) goto out; @@ -1062,13 +1063,13 @@ static void *copy_array(void *dst, const void *src, size_t n, size_t size, gfp_t if (unlikely(check_mul_overflow(n, size, &bytes))) return NULL; - if (ksize(dst) < ksize(src)) { - kfree(dst); - dst = kmalloc_track_caller(kmalloc_size_roundup(bytes), flags); - if (!dst) - return NULL; + p = krealloc(dst, kmalloc_size_roundup(bytes), flags); + if (!p) { + dst = NULL; + return NULL; } + dst = p; memcpy(dst, src, bytes); out: return dst ? dst : ZERO_SIZE_PTR;