On Thu, Aug 24, 2023 at 1:14 PM Andrii Nakryiko <andrii@xxxxxxxxxx> wrote: > [...] > + > +static int btf_validate_type(const struct btf *btf, const struct btf_type *t, __u32 id) > +{ > + __u32 kind = btf_kind(t); > + int err, i, n; > + > + err = btf_validate_str(btf, t->name_off, "type name", id); > + if (err) > + return err; > + > + switch (kind) { > + case BTF_KIND_UNKN: > + case BTF_KIND_INT: > + case BTF_KIND_FWD: > + case BTF_KIND_FLOAT: > + break; > + case BTF_KIND_PTR: > + case BTF_KIND_TYPEDEF: > + case BTF_KIND_VOLATILE: > + case BTF_KIND_CONST: > + case BTF_KIND_RESTRICT: > + case BTF_KIND_FUNC: > + case BTF_KIND_VAR: > + case BTF_KIND_DECL_TAG: > + case BTF_KIND_TYPE_TAG: > + err = btf_validate_id(btf, t->type, id); > + if (err) > + return err; We can "return err;" at the end, and then remove all these "if (err) return err;", right? Thanks, Song > + break; > + case BTF_KIND_ARRAY: { > + const struct btf_array *a = btf_array(t); > + > + err = btf_validate_id(btf, a->type, id); > + err = err ?: btf_validate_id(btf, a->index_type, id); > + if (err) > + return err; > + break; > + } > + case BTF_KIND_STRUCT: > + case BTF_KIND_UNION: { > + const struct btf_member *m = btf_members(t); > + > + n = btf_vlen(t); > + for (i = 0; i < n; i++, m++) { > + err = btf_validate_str(btf, m->name_off, "field name", id); > + err = err ?: btf_validate_id(btf, m->type, id); > + if (err) > + return err; > + } > + break; > + } > + case BTF_KIND_ENUM: { > + const struct btf_enum *m = btf_enum(t); > + > + n = btf_vlen(t); > + for (i = 0; i < n; i++, m++) { > + err = btf_validate_str(btf, m->name_off, "enum name", id); > + if (err) > + return err; > + } > + break; > + } > + case BTF_KIND_ENUM64: { > + const struct btf_enum64 *m = btf_enum64(t); > + > + n = btf_vlen(t); > + for (i = 0; i < n; i++, m++) { > + err = btf_validate_str(btf, m->name_off, "enum name", id); > + if (err) > + return err; > + } > + break; > + } > + case BTF_KIND_FUNC_PROTO: { > + const struct btf_param *m = btf_params(t); > + > + n = btf_vlen(t); > + for (i = 0; i < n; i++, m++) { > + err = btf_validate_str(btf, m->name_off, "param name", id); > + err = err ?: btf_validate_id(btf, m->type, id); > + if (err) > + return err; > + } > + break; > + } > + case BTF_KIND_DATASEC: { > + const struct btf_var_secinfo *m = btf_var_secinfos(t); > + > + n = btf_vlen(t); > + for (i = 0; i < n; i++, m++) { > + err = btf_validate_id(btf, m->type, id); > + if (err) > + return err; > + } > + break; > + } > + default: > + pr_warn("btf: type [%u]: unrecognized kind %u\n", id, kind); > + return -EINVAL; > + } > + return 0; > +} [...]