add_data() computes size8 = roundup(size, 8) and then hands size8 to
realloc_data_buf() before doing memcpy(gen->data_cur, data, size) with
the original size. A wrapped size8 passes through the realloc_data_buf()
INT32_MAX check. Harden this against overflow, though not realistic to
happen in practice.
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/r/20260602133052.423725-3-daniel@iogearbox.net
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
static int add_data(struct bpf_gen *gen, const void *data, __u32 size)
{
- __u32 size8 = roundup(size, 8);
__u64 zero = 0;
+ __u32 size8;
void *prev;
+ if (size > INT32_MAX) {
+ gen->error = -ERANGE;
+ return 0;
+ }
+ size8 = roundup(size, 8);
+
if (realloc_data_buf(gen, size8))
return 0;
prev = gen->data_cur;