On 10/23/2024 11:17 AM, Yafang Shao wrote: > On Mon, Oct 21, 2024 at 9:28 AM Hou Tao <houtao@xxxxxxxxxxxxxxx> wrote: >> From: Hou Tao <houtao1@xxxxxxxxxx> >> >> Check the validity of nr_words in bpf_iter_bits_new(). Without this >> check, when multiplication overflow occurs for nr_bits (e.g., when >> nr_words = 0x0400-0001, nr_bits becomes 64), stack corruption may occur >> due to bpf_probe_read_kernel_common(..., nr_bytes = 0x2000-0008). >> >> Fix it by limiting the max value of nr_words to 512. >> >> Fixes: 4665415975b0 ("bpf: Add bits iterator") >> Signed-off-by: Hou Tao <houtao1@xxxxxxxxxx> >> --- >> kernel/bpf/helpers.c | 4 ++++ >> 1 file changed, 4 insertions(+) >> >> diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c >> index 62349e206a29..c147f75e1b48 100644 >> --- a/kernel/bpf/helpers.c >> +++ b/kernel/bpf/helpers.c >> @@ -2851,6 +2851,8 @@ struct bpf_iter_bits { >> __u64 __opaque[2]; >> } __aligned(8); >> >> +#define BITS_ITER_NR_WORDS_MAX 512 >> + >> struct bpf_iter_bits_kern { >> union { >> unsigned long *bits; >> @@ -2892,6 +2894,8 @@ bpf_iter_bits_new(struct bpf_iter_bits *it, const u64 *unsafe_ptr__ign, u32 nr_w >> >> if (!unsafe_ptr__ign || !nr_words) >> return -EINVAL; >> + if (nr_words > BITS_ITER_NR_WORDS_MAX) >> + return -E2BIG; > It is documented that nr_words cannot exceed 512, not due to overflow > concerns, but because of memory allocation limits. It might be better > to use 512 directly instead of BITS_ITER_NR_WORDS_MAX. Alternatively, > if we decide to keep using the macro, the documentation should be > updated accordingly. Thanks for the explanation. Actually according to the limitation of bpf memory allocator, the limitation should be (4096 - 8) / 8 = 511 due to the overhead of llist_head in the returned pointer. I prefer to keep the macro. How about updating the comment as follows: * Due to the limitation of memalloc, it can't be greater than 511. Therefore, * 511 is used as the maximum value for @nr_words. > >> /* Optimization for u64 mask */ >> if (nr_bits == 64) { >> -- >> 2.29.2 >> > > -- > Regards > Yafang