SEC("?tc")
__failure __msg("bpf_spin_lock at off=16 must be held for bpf_rb_root") long rbtree_api_nolock_first(void *ctx)
{
bpf_rbtree_first(&groot); return 0;
}
bpf_obj_drop(m); if (res_n)
bpf_obj_drop(container_of(res_n, struct node_data, node)); if (res_m) {
bpf_obj_drop(container_of(res_m, struct node_data, node)); /* m was not added to the rbtree */ return 2;
}
/* This add should fail since n already in groot's tree */
bpf_rbtree_add(&groot2, &n->node, less);
bpf_spin_unlock(&glock); return 0;
}
SEC("?tc")
__failure __msg("dereference of modified ptr_or_null_ ptr R2 off=16 disallowed") long rbtree_api_use_unchecked_remove_retval(void *ctx)
{ struct bpf_rb_node *res;
bpf_spin_lock(&glock);
res = bpf_rbtree_first(&groot); if (!res) goto err_out;
res = bpf_rbtree_remove(&groot, res);
bpf_spin_unlock(&glock);
bpf_spin_lock(&glock); /* Must check res for NULL before using in rbtree_add below */
bpf_rbtree_add(&groot, res, less);
bpf_spin_unlock(&glock); return 0;
err_out:
bpf_spin_unlock(&glock); return 1;
}
SEC("?tc")
__failure __msg("bpf_rbtree_remove can only take non-owning or refcounted bpf_rb_node pointer") long rbtree_api_add_release_unlock_escape(void *ctx)
{ struct node_data *n;
bpf_spin_lock(&glock); /* After add() in previous critical section, n should be * release_on_unlock and released after previous spin_unlock, * so should not be possible to use it here
*/
bpf_rbtree_remove(&groot, &n->node);
bpf_spin_unlock(&glock); return 0;
}
SEC("?tc")
__failure __msg("bpf_rbtree_remove can only take non-owning or refcounted bpf_rb_node pointer") long rbtree_api_first_release_unlock_escape(void *ctx)
{ struct bpf_rb_node *res; struct node_data *n;
bpf_spin_lock(&glock);
res = bpf_rbtree_first(&groot); if (!res) {
bpf_spin_unlock(&glock); return 1;
}
n = container_of(res, struct node_data, node);
bpf_spin_unlock(&glock);
bpf_spin_lock(&glock); /* After first() in previous critical section, n should be * release_on_unlock and released after previous spin_unlock, * so should not be possible to use it here
*/
bpf_rbtree_remove(&groot, &n->node);
bpf_spin_unlock(&glock); return 0;
}
SEC("?tc")
__failure __msg("arg#1 expected pointer to allocated object") long rbtree_api_add_bad_cb_bad_fn_call_add(void *ctx)
{ return add_with_cb(less__bad_fn_call_add);
}
SEC("?tc")
__failure __msg("rbtree_remove not allowed in rbtree cb") long rbtree_api_add_bad_cb_bad_fn_call_remove(void *ctx)
{ return add_with_cb(less__bad_fn_call_remove);
}
SEC("?tc")
__failure __msg("can't spin_{lock,unlock} in rbtree cb") long rbtree_api_add_bad_cb_bad_fn_call_first_unlock_after(void *ctx)
{ return add_with_cb(less__bad_fn_call_first_unlock_after);
}
char _license[] SEC("license") = "GPL";
Messung V0.5
¤ Dauer der Verarbeitung: 0.0 Sekunden
(vorverarbeitet)
¤
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.