bpf/verifier: rework value tracking
Unifies adjusted and unadjusted register value types (e.g. FRAME_POINTER is now just a PTR_TO_STACK with zero offset). Tracks value alignment by means of tracking known & unknown bits. This also replaces the 'reg->imm' (leading zero bits) calculations for (what were) UNKNOWN_VALUEs. If pointer leaks are allowed, and adjust_ptr_min_max_vals returns -EACCES, treat the pointer as an unknown scalar and try again, because we might be able to conclude something about the result (e.g. pointer & 0x40 is either 0 or 0x40). Verifier hooks in the netronome/nfp driver were changed to match the new data structures. Signed-off-by: Edward Cree <ecree@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
e1cb90f2b8
commit
f1174f77b5
@@ -79,28 +79,32 @@ nfp_bpf_check_exit(struct nfp_prog *nfp_prog,
|
||||
const struct bpf_verifier_env *env)
|
||||
{
|
||||
const struct bpf_reg_state *reg0 = &env->cur_state.regs[0];
|
||||
u64 imm;
|
||||
|
||||
if (nfp_prog->act == NN_ACT_XDP)
|
||||
return 0;
|
||||
|
||||
if (reg0->type != CONST_IMM) {
|
||||
pr_info("unsupported exit state: %d, imm: %llx\n",
|
||||
reg0->type, reg0->imm);
|
||||
if (!(reg0->type == SCALAR_VALUE && tnum_is_const(reg0->var_off))) {
|
||||
char tn_buf[48];
|
||||
|
||||
tnum_strn(tn_buf, sizeof(tn_buf), reg0->var_off);
|
||||
pr_info("unsupported exit state: %d, var_off: %s\n",
|
||||
reg0->type, tn_buf);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (nfp_prog->act != NN_ACT_DIRECT &&
|
||||
reg0->imm != 0 && (reg0->imm & ~0U) != ~0U) {
|
||||
imm = reg0->var_off.value;
|
||||
if (nfp_prog->act != NN_ACT_DIRECT && imm != 0 && (imm & ~0U) != ~0U) {
|
||||
pr_info("unsupported exit state: %d, imm: %llx\n",
|
||||
reg0->type, reg0->imm);
|
||||
reg0->type, imm);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (nfp_prog->act == NN_ACT_DIRECT && reg0->imm <= TC_ACT_REDIRECT &&
|
||||
reg0->imm != TC_ACT_SHOT && reg0->imm != TC_ACT_STOLEN &&
|
||||
reg0->imm != TC_ACT_QUEUED) {
|
||||
if (nfp_prog->act == NN_ACT_DIRECT && imm <= TC_ACT_REDIRECT &&
|
||||
imm != TC_ACT_SHOT && imm != TC_ACT_STOLEN &&
|
||||
imm != TC_ACT_QUEUED) {
|
||||
pr_info("unsupported exit state: %d, imm: %llx\n",
|
||||
reg0->type, reg0->imm);
|
||||
reg0->type, imm);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user