函数逻辑报告 |
Source Code:kernel\bpf\verifier.c |
Create Date:2022-07-27 14:12:21 |
Last Modify:2022-05-19 20:02:10 | Copyright©Brick |
首页 | 函数Tree |
注解内核,赢得工具 | 下载SCCT | English |
函数名称:heck whether memory at (regno + off) is accessible for t = (read | write)* if t==write, value_regno is a register which value is stored into memory* if t==read, value_regno is a register which will receive the value from memory* if t==write &&
函数原型:static int check_mem_access(struct bpf_verifier_env *env, int insn_idx, u32 regno, int off, int bpf_size, enum bpf_access_type t, int value_regno, bool strict_alignment_once)
返回类型:int
参数:
类型 | 参数 | 名称 |
---|---|---|
struct bpf_verifier_env * | env | |
int | insn_idx | |
u32 | regno | |
int | off | |
int | bpf_size | |
enum bpf_access_type | t | |
int | value_regno | |
bool | strict_alignment_once |
2909 | err等于0 |
2911 | size等于bpf_size_to_bytes(bpf_size) |
2916 | err等于check_ptr_alignment(env, reg, off, size, strict_alignment_once) |
2924 | 如果t恒等于BPF_WRITE且value_regno大于等于0且is_pointer_value(env, value_regno)则 |
2926 | verbose(env, "R%d leaks addr into map\n", value_regno) |
2927 | 返回:负EACCES |
2933 | 如果非err且t恒等于BPF_READ且value_regno大于等于0则 |
2956 | btf_id等于0 |
2958 | 如果t恒等于BPF_WRITE且value_regno大于等于0且is_pointer_value(env, value_regno)则 |
2960 | verbose(env, "R%d leaks addr into ctx\n", value_regno) |
2961 | 返回:负EACCES |
2964 | err等于check_ctx_reg(env, reg, regno) |
2969 | 如果err则verbose_linfo(env, insn_idx, "; ") |
2971 | 如果非err且t恒等于BPF_READ且value_regno大于等于0则 |
2976 | 如果reg_type恒等于g doesn't contain a valid pointer 则 |
2977 | mark_reg_unknown(env, regs, value_regno) |
2978 | 否则 |
2979 | mark_reg_known_zero(env, regs, value_regno) |
2989 | 如果reg_type恒等于g points to kernel struct 则 for PTR_TO_BTF_ID 等于btf_id |
3002 | err等于update_stack_depth(env, state, off) |
3006 | 如果t恒等于BPF_WRITE则err等于heck_stack_read/write functions track spill/fill of registers,* stack boundary and alignment are checked in check_mem_access() |
3009 | 否则err等于check_stack_read(env, state, off, size, value_regno) |
3012 | 否则如果reg_is_pkt_pointer(reg)则 |
3017 | 如果t恒等于BPF_WRITE且value_regno大于等于0且is_pointer_value(env, value_regno)则 |
3019 | verbose(env, "R%d leaks addr into packet\n", value_regno) |
3021 | 返回:负EACCES |
3024 | 如果非err且t恒等于BPF_READ且value_regno大于等于0则mark_reg_unknown(env, regs, value_regno) |
3027 | 如果t恒等于BPF_WRITE且value_regno大于等于0且is_pointer_value(env, value_regno)则 |
3029 | verbose(env, "R%d leaks addr into flow keys\n", value_regno) |
3031 | 返回:负EACCES |
3034 | err等于check_flow_keys_access(env, off, size) |
3035 | 如果非err且t恒等于BPF_READ且value_regno大于等于0则mark_reg_unknown(env, regs, value_regno) |
3039 | verbose(env, "R%d cannot write into %s\n", regno, string representation of 'enum bpf_reg_type' [ Ordering of fields matters. See states_equal() ]) |
3041 | 返回:负EACCES |
3044 | 如果非err且value_regno大于等于0则mark_reg_unknown(env, regs, value_regno) |
3048 | 如果非err且t恒等于BPF_READ且value_regno大于等于0则mark_reg_unknown(env, regs, value_regno) |
3051 | err等于check_ptr_to_btf_access(env, regs, regno, off, size, t, value_regno) |
3053 | 否则 |
3054 | verbose(env, "R%d invalid mem access '%s'\n", regno, string representation of 'enum bpf_reg_type' [ Ordering of fields matters. See states_equal() ]) |
3056 | 返回:负EACCES |
3064 | 返回:err |
名称 | 描述 |
---|---|
check_xadd | |
check_helper_call | |
do_check |
源代码转换工具 开放的插件接口 | X |
---|---|
支持:c/c++/esqlc/java Oracle/Informix/Mysql 插件可实现:逻辑报告 代码生成和批量转换代码 |