SEC("socket")
__success
__retval(0) int ldx_is_ok_bad_addr(void *ctx)
{ char *p;
if (!bpf_core_enum_value_exists(enum bpf_features, BPF_FEAT_RDONLY_CAST_TO_VOID)) return 42;
p = bpf_rdonly_cast(0, 0); return p[0x7fff];
}
SEC("socket")
__success
__retval(1) int ldx_is_ok_good_addr(void *ctx)
{ int v, *p;
v = 1;
p = bpf_rdonly_cast(&v, 0); return *p;
}
SEC("socket")
__success int offset_not_tracked(void *ctx)
{ int *p, i, s;
p = bpf_rdonly_cast(0, 0);
s = 0;
bpf_for(i, 0, 1000 * 1000 * 1000) {
p++;
s += *p;
} return s;
}
SEC("socket")
__failure
__msg("cannot write into rdonly_untrusted_mem") int stx_not_ok(void *ctx)
{ int v, *p;
v = 1;
p = bpf_rdonly_cast(&v, 0);
*p = 1; return 0;
}
SEC("socket")
__failure
__msg("cannot write into rdonly_untrusted_mem") int atomic_not_ok(void *ctx)
{ int v, *p;
v = 1;
p = bpf_rdonly_cast(&v, 0);
__sync_fetch_and_add(p, 1); return 0;
}
SEC("socket")
__failure
__msg("cannot write into rdonly_untrusted_mem") int atomic_rmw_not_ok(void *ctx)
{ long v, *p;
v = 1;
p = bpf_rdonly_cast(&v, 0); return __sync_val_compare_and_swap(p, 0, 42);
}
SEC("socket")
__failure
__msg("invalid access to memory, mem_size=0 off=0 size=4")
__msg("R1 min value is outside of the allowed memory range") int kfunc_param_not_ok(void *ctx)
{ int *p;
p = bpf_rdonly_cast(0, 0);
bpf_kfunc_trusted_num_test(p); return 0;
}
p = bpf_rdonly_cast(0, 0); /* * Any helper with ARG_CONST_SIZE_OR_ZERO constraint will do, * the most permissive constraint
*/
bpf_copy_from_user(p, 0, (void *)42); return 0;
}
SEC("socket")
__success
__retval(1) int null_check(void *ctx)
{ int *p;
p = bpf_rdonly_cast(0, 0); if (p == 0) /* make this a function call to avoid compiler * moving r0 assignment before check.
*/ return return_one(); return 0;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.