mirror of
https://github.com/torvalds/linux.git
synced 2026-06-02 19:43:40 +02:00
bpf: derive smin32/smax32 from umin32/umax32 bounds
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: Eduard Zingerman <eddyz87@gmail.com> Acked-by: Shung-Hsi Yu <shung-hsi.yu@suse.com> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/r/20231102033759.2541186-5-andrii@kernel.org Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
93f7378734
commit
d540517990
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user