summaryrefslogtreecommitdiffstats
path: root/tools/lib
diff options
context:
space:
mode:
authorAlexei Starovoitov <ast@kernel.org>2026-04-10 12:34:36 -0700
committerAlexei Starovoitov <ast@kernel.org>2026-04-10 12:34:37 -0700
commit749b925802c2351ae7204e6960ca086e4c4e4fa7 (patch)
treea1b5aa828eba7f5964aa1d0882d0e6fd0ec60ebc /tools/lib
parentaacee214d57636fa1f63007c65f333b5ea75a7a0 (diff)
parent0e4dc6fbddb01b2ce0d0b4d67ad5f70e976bedcc (diff)
downloadlinux-749b925802c2351ae7204e6960ca086e4c4e4fa7.tar.gz
linux-749b925802c2351ae7204e6960ca086e4c4e4fa7.zip
Merge branch 'selftests-bpf-test-btf-sanitization'
Alan Maguire says: ==================== selftests/bpf: Test BTF sanitization Allow simulation of missing BPF features through provision of a synthetic feature cache set, and use this to simulate case where FEAT_BTF_LAYOUT is missing. Ensure sanitization leaves us with expected BTF (layout info removed, layout header fields zeroed, strings data adjusted). Specifying a feature cache with selected missing features will allow testing of other missing feature codepaths, but for now add BTF layout sanitization test only. Changes since v2 [1]: - change zfree() to free() since we immediately assign the feat_cache (Jiri, patch 1) - "goto out" to avoid skeleton leak (Chengkaitao, patch 2) - just use kfree_skb__open() since we do not need to load skeleton Changes since v1 [2]: - renamed to bpf_object_set_feat_cache() (Andrii, patch 1) - remove __packed, relocate skeleton open/load, fix formatting issues (Andrii, patch 2) [1] https://lore.kernel.org/bpf/20260408105324.663280-1-alan.maguire@oracle.com/ [2] https://lore.kernel.org/bpf/20260401164302.3844142-1-alan.maguire@oracle.com/ ==================== Link: https://patch.msgid.link/20260408165735.843763-1-alan.maguire@oracle.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'tools/lib')
-rw-r--r--tools/lib/bpf/libbpf.c12
-rw-r--r--tools/lib/bpf/libbpf_internal.h3
2 files changed, 12 insertions, 3 deletions
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index 42bdba4efd0c..8b0c3246097f 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -3145,7 +3145,7 @@ static bool btf_needs_sanitization(struct bpf_object *obj)
!has_layout;
}
-static struct btf *bpf_object__sanitize_btf(struct bpf_object *obj, struct btf *orig_btf)
+struct btf *bpf_object__sanitize_btf(struct bpf_object *obj, struct btf *orig_btf)
{
bool has_func_global = kernel_supports(obj, FEAT_BTF_GLOBAL_FUNC);
bool has_datasec = kernel_supports(obj, FEAT_BTF_DATASEC);
@@ -5203,12 +5203,20 @@ bool kernel_supports(const struct bpf_object *obj, enum kern_feature_id feat_id)
*/
return true;
- if (obj->token_fd)
+ if (obj->feat_cache)
return feat_supported(obj->feat_cache, feat_id);
return feat_supported(NULL, feat_id);
}
+/* Used in testing to simulate missing features. */
+void bpf_object_set_feat_cache(struct bpf_object *obj, struct kern_feature_cache *cache)
+{
+ if (obj->feat_cache)
+ free(obj->feat_cache);
+ obj->feat_cache = cache;
+}
+
static bool map_is_reuse_compat(const struct bpf_map *map, int map_fd)
{
struct bpf_map_info map_info;
diff --git a/tools/lib/bpf/libbpf_internal.h b/tools/lib/bpf/libbpf_internal.h
index cabdaef79098..3781c45b46d3 100644
--- a/tools/lib/bpf/libbpf_internal.h
+++ b/tools/lib/bpf/libbpf_internal.h
@@ -414,6 +414,7 @@ struct kern_feature_cache {
bool feat_supported(struct kern_feature_cache *cache, enum kern_feature_id feat_id);
bool kernel_supports(const struct bpf_object *obj, enum kern_feature_id feat_id);
+void bpf_object_set_feat_cache(struct bpf_object *obj, struct kern_feature_cache *cache);
int probe_kern_syscall_wrapper(int token_fd);
int probe_memcg_account(int token_fd);
@@ -427,7 +428,7 @@ int libbpf__load_raw_btf(const char *raw_types, size_t types_len,
int libbpf__load_raw_btf_hdr(const struct btf_header *hdr,
const char *raw_types, const char *str_sec,
const char *layout_sec, int token_fd);
-
+struct btf *bpf_object__sanitize_btf(struct bpf_object *obj, struct btf *orig_btf);
int btf_load_into_kernel(struct btf *btf,
char *log_buf, size_t log_sz, __u32 log_level,
int token_fd);