23 lines
1020 B
Diff
23 lines
1020 B
Diff
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
|
|
index 9000806ee..206cf1fb5 100644
|
|
--- a/kernel/bpf/verifier.c
|
|
+++ b/kernel/bpf/verifier.c
|
|
@@ -14029,11 +14029,13 @@ static void scalar_min_max_arsh(struct bpf_reg_state *dst_reg,
|
|
dst_reg->umin_value = 0;
|
|
dst_reg->umax_value = U64_MAX;
|
|
|
|
- /* Its not easy to operate on alu32 bounds here because it depends
|
|
- * on bits being shifted in from upper 32-bits. Take easy way out
|
|
- * and mark unbounded so we can recalculate later from tnum.
|
|
- */
|
|
- __mark_reg32_unbounded(dst_reg);
|
|
+ /* When shifting, we track the signed 32bit values as the new value of 64bit values. */
|
|
+ dst_reg->s32_min_value = dst_reg->smin_value;
|
|
+ dst_reg->s32_max_value = dst_reg->smax_value;
|
|
+
|
|
+ /* If the truncation of the min/max for 32bit is different, just mark it as unbounded. */
|
|
+ if (dst_reg->s32_min_value != dst_reg->smin_value || dst_reg->s32_max_value != dst_reg->smax_value)
|
|
+ __mark_reg32_unbounded (dst_reg);
|
|
__update_reg_bounds(dst_reg);
|
|
}
|
|
|