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
@@ -117,35 +117,25 @@ enum bpf_access_type {
|
||||
};
|
||||
|
||||
/* types of values stored in eBPF registers */
|
||||
/* Pointer types represent:
|
||||
* pointer
|
||||
* pointer + imm
|
||||
* pointer + (u16) var
|
||||
* pointer + (u16) var + imm
|
||||
* if (range > 0) then [ptr, ptr + range - off) is safe to access
|
||||
* if (id > 0) means that some 'var' was added
|
||||
* if (off > 0) means that 'imm' was added
|
||||
*/
|
||||
enum bpf_reg_type {
|
||||
NOT_INIT = 0, /* nothing was written into register */
|
||||
UNKNOWN_VALUE, /* reg doesn't contain a valid pointer */
|
||||
SCALAR_VALUE, /* reg doesn't contain a valid pointer */
|
||||
PTR_TO_CTX, /* reg points to bpf_context */
|
||||
CONST_PTR_TO_MAP, /* reg points to struct bpf_map */
|
||||
PTR_TO_MAP_VALUE, /* reg points to map element value */
|
||||
PTR_TO_MAP_VALUE_OR_NULL,/* points to map elem value or NULL */
|
||||
FRAME_PTR, /* reg == frame_pointer */
|
||||
PTR_TO_STACK, /* reg == frame_pointer + imm */
|
||||
CONST_IMM, /* constant integer value */
|
||||
|
||||
/* PTR_TO_PACKET represents:
|
||||
* skb->data
|
||||
* skb->data + imm
|
||||
* skb->data + (u16) var
|
||||
* skb->data + (u16) var + imm
|
||||
* if (range > 0) then [ptr, ptr + range - off) is safe to access
|
||||
* if (id > 0) means that some 'var' was added
|
||||
* if (off > 0) menas that 'imm' was added
|
||||
*/
|
||||
PTR_TO_PACKET,
|
||||
PTR_TO_STACK, /* reg == frame_pointer + offset */
|
||||
PTR_TO_PACKET, /* reg points to skb->data */
|
||||
PTR_TO_PACKET_END, /* skb->data + headlen */
|
||||
|
||||
/* PTR_TO_MAP_VALUE_ADJ is used for doing pointer math inside of a map
|
||||
* elem value. We only allow this if we can statically verify that
|
||||
* access from this register are going to fall within the size of the
|
||||
* map element.
|
||||
*/
|
||||
PTR_TO_MAP_VALUE_ADJ,
|
||||
};
|
||||
|
||||
struct bpf_prog;
|
||||
|
Reference in New Issue
Block a user