On Fri, 2023-10-27 at 11:13 -0700, Andrii Nakryiko wrote: > > All the logic that applies to u64 vs s64, equally applies for u32 vs s32 > > relationships (just taken in a smaller 32-bit numeric space). So do the > > same deduction of smin32/smax32 from umin32/umax32, if we can. > > > > Acked-by: Shung-Hsi Yu <shung-hsi.yu@xxxxxxxx> > > Signed-off-by: Andrii Nakryiko <andrii@xxxxxxxxxx> Acked-by: Eduard Zingerman <eddyz87@xxxxxxxxx> > > --- > > kernel/bpf/verifier.c | 7 +++++++ > > 1 file changed, 7 insertions(+) > > > > diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c > > index bf4193706744..0f66e9092c38 100644 > > --- a/kernel/bpf/verifier.c > > +++ b/kernel/bpf/verifier.c > > @@ -2324,6 +2324,13 @@ static void __update_reg_bounds(struct bpf_reg_state *reg) > > /* Uses signed min/max values to inform unsigned, and vice-versa */ > > static void __reg32_deduce_bounds(struct bpf_reg_state *reg) > > { > > + /* if u32 range forms a valid s32 range (due to matching sign bit), > > + * try to learn from that > > + */ > > + if ((s32)reg->u32_min_value <= (s32)reg->u32_max_value) { > > + reg->s32_min_value = max_t(s32, reg->s32_min_value, reg->u32_min_value); > > + reg->s32_max_value = min_t(s32, reg->s32_max_value, reg->u32_max_value); > > + } > > /* Learn sign from signed bounds. > > * If we cannot cross the sign boundary, then signed and unsigned bounds > > * are the same, so combine. This works even in the negative case, e.g.