diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index edd5685f015360d5d1930775e9d7a12214e4fc9a..61b8a2ce960028e9f22e21d0ac836ea91be4a520 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -1923,6 +1923,21 @@ static int backtrack_insn(struct bpf_verifier_env *env, int idx, } } else if (opcode == BPF_EXIT) { return -ENOTSUPP; + } else if (BPF_SRC(insn->code) == BPF_X) { + if (!(*reg_mask & (dreg | sreg))) + return 0; + /* dreg sreg + * Both dreg and sreg need precision before + * this insn. If only sreg was marked precise + * before it would be equally necessary to + * propagate it to dreg. + */ + *reg_mask |= (sreg | dreg); + /* else dreg K + * Only dreg still needs precision before + * this insn, so for the K-based conditional + * there is nothing new to be marked. + */ } } else if (class == BPF_LD) { if (!(*reg_mask & dreg))