diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index c1a03ab632bbe68c5f1a8c3ec7b65acfcc55ff1d..91c33601021da7e24e8b0fa338c0bfff65140469 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -8010,15 +8010,23 @@ static void find_equal_scalars(struct bpf_verifier_state *vstate, state = vstate->frame[i]; for (j = 0; j < MAX_BPF_REG; j++) { reg = &state->regs[j]; - if (reg->type == SCALAR_VALUE && reg->id == known_reg->id) + if (reg->type == SCALAR_VALUE && reg->id == known_reg->id) { + s32 saved_subreg_def = reg->subreg_def; + *reg = *known_reg; + reg->subreg_def = saved_subreg_def; + } } bpf_for_each_spilled_reg(j, state, reg) { if (!reg) continue; - if (reg->type == SCALAR_VALUE && reg->id == known_reg->id) + if (reg->type == SCALAR_VALUE && reg->id == known_reg->id) { + s32 saved_subreg_def = reg->subreg_def; + *reg = *known_reg; + reg->subreg_def = saved_subreg_def; + } } } }