diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c index 903719b89238..cad4657ba2ce 100644 --- a/kernel/bpf/btf.c +++ b/kernel/bpf/btf.c @@ -674,6 +674,21 @@ static bool btf_type_has_size(const struct btf_type *t) return false; } +/* t->name_off can be non-zero */ +static bool btf_type_has_name(const struct btf_type *t) +{ + switch (BTF_INFO_KIND(t->info)) { + case BTF_KIND_ARRAY: + case BTF_KIND_VOLATILE: + case BTF_KIND_CONST: + case BTF_KIND_RESTRICT: + case BTF_KIND_FUNC_PROTO: + return false; + } + + return true; +} + static const char *btf_int_encoding_str(u8 encoding) { if (encoding == 0) @@ -2495,11 +2510,6 @@ static int btf_ref_type_check_meta(struct btf_verifier_env *env, btf_verifier_log_type(env, t, "Invalid name"); return -EINVAL; } - } else { - if (t->name_off) { - btf_verifier_log_type(env, t, "Invalid name"); - return -EINVAL; - } } btf_verifier_log_type(env, t, NULL); @@ -2800,12 +2810,6 @@ static s32 btf_array_check_meta(struct btf_verifier_env *env, return -EINVAL; } - /* array type should not have a name */ - if (t->name_off) { - btf_verifier_log_type(env, t, "Invalid name"); - return -EINVAL; - } - if (btf_type_vlen(t)) { btf_verifier_log_type(env, t, "vlen != 0"); return -EINVAL; @@ -3896,11 +3900,6 @@ static s32 btf_func_proto_check_meta(struct btf_verifier_env *env, return -EINVAL; } - if (t->name_off) { - btf_verifier_log_type(env, t, "Invalid name"); - return -EINVAL; - } - if (btf_type_kflag(t)) { btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); return -EINVAL; @@ -4579,6 +4578,12 @@ static s32 btf_check_meta(struct btf_verifier_env *env, return -EINVAL; } + if (!btf_type_has_name(t) && t->name_off) { + btf_verifier_log(env, "[%u] %s kind should not have a name", + env->log_type_id, btf_type_str(t)); + return -EINVAL; + } + if (!btf_name_offset_valid(env->btf, t->name_off)) { btf_verifier_log(env, "[%u] Invalid name_offset:%u", env->log_type_id, t->name_off);