0001
0002
0003
0004 #include <uapi/linux/btf.h>
0005 #include <uapi/linux/bpf.h>
0006 #include <uapi/linux/bpf_perf_event.h>
0007 #include <uapi/linux/types.h>
0008 #include <linux/seq_file.h>
0009 #include <linux/compiler.h>
0010 #include <linux/ctype.h>
0011 #include <linux/errno.h>
0012 #include <linux/slab.h>
0013 #include <linux/anon_inodes.h>
0014 #include <linux/file.h>
0015 #include <linux/uaccess.h>
0016 #include <linux/kernel.h>
0017 #include <linux/idr.h>
0018 #include <linux/sort.h>
0019 #include <linux/bpf_verifier.h>
0020 #include <linux/btf.h>
0021 #include <linux/btf_ids.h>
0022 #include <linux/skmsg.h>
0023 #include <linux/perf_event.h>
0024 #include <linux/bsearch.h>
0025 #include <linux/kobject.h>
0026 #include <linux/sysfs.h>
0027 #include <net/sock.h>
0028 #include "../tools/lib/bpf/relo_core.h"
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170 #define BITS_PER_U128 (sizeof(u64) * BITS_PER_BYTE * 2)
0171 #define BITS_PER_BYTE_MASK (BITS_PER_BYTE - 1)
0172 #define BITS_PER_BYTE_MASKED(bits) ((bits) & BITS_PER_BYTE_MASK)
0173 #define BITS_ROUNDDOWN_BYTES(bits) ((bits) >> 3)
0174 #define BITS_ROUNDUP_BYTES(bits) \
0175 (BITS_ROUNDDOWN_BYTES(bits) + !!BITS_PER_BYTE_MASKED(bits))
0176
0177 #define BTF_INFO_MASK 0x9f00ffff
0178 #define BTF_INT_MASK 0x0fffffff
0179 #define BTF_TYPE_ID_VALID(type_id) ((type_id) <= BTF_MAX_TYPE)
0180 #define BTF_STR_OFFSET_VALID(name_off) ((name_off) <= BTF_MAX_NAME_OFFSET)
0181
0182
0183
0184
0185
0186 #define BTF_MAX_SIZE (16 * 1024 * 1024)
0187
0188 #define for_each_member_from(i, from, struct_type, member) \
0189 for (i = from, member = btf_type_member(struct_type) + from; \
0190 i < btf_type_vlen(struct_type); \
0191 i++, member++)
0192
0193 #define for_each_vsi_from(i, from, struct_type, member) \
0194 for (i = from, member = btf_type_var_secinfo(struct_type) + from; \
0195 i < btf_type_vlen(struct_type); \
0196 i++, member++)
0197
0198 DEFINE_IDR(btf_idr);
0199 DEFINE_SPINLOCK(btf_idr_lock);
0200
0201 enum btf_kfunc_hook {
0202 BTF_KFUNC_HOOK_XDP,
0203 BTF_KFUNC_HOOK_TC,
0204 BTF_KFUNC_HOOK_STRUCT_OPS,
0205 BTF_KFUNC_HOOK_TRACING,
0206 BTF_KFUNC_HOOK_SYSCALL,
0207 BTF_KFUNC_HOOK_MAX,
0208 };
0209
0210 enum {
0211 BTF_KFUNC_SET_MAX_CNT = 32,
0212 BTF_DTOR_KFUNC_MAX_CNT = 256,
0213 };
0214
0215 struct btf_kfunc_set_tab {
0216 struct btf_id_set8 *sets[BTF_KFUNC_HOOK_MAX];
0217 };
0218
0219 struct btf_id_dtor_kfunc_tab {
0220 u32 cnt;
0221 struct btf_id_dtor_kfunc dtors[];
0222 };
0223
0224 struct btf {
0225 void *data;
0226 struct btf_type **types;
0227 u32 *resolved_ids;
0228 u32 *resolved_sizes;
0229 const char *strings;
0230 void *nohdr_data;
0231 struct btf_header hdr;
0232 u32 nr_types;
0233 u32 types_size;
0234 u32 data_size;
0235 refcount_t refcnt;
0236 u32 id;
0237 struct rcu_head rcu;
0238 struct btf_kfunc_set_tab *kfunc_set_tab;
0239 struct btf_id_dtor_kfunc_tab *dtor_kfunc_tab;
0240
0241
0242 struct btf *base_btf;
0243 u32 start_id;
0244 u32 start_str_off;
0245 char name[MODULE_NAME_LEN];
0246 bool kernel_btf;
0247 };
0248
0249 enum verifier_phase {
0250 CHECK_META,
0251 CHECK_TYPE,
0252 };
0253
0254 struct resolve_vertex {
0255 const struct btf_type *t;
0256 u32 type_id;
0257 u16 next_member;
0258 };
0259
0260 enum visit_state {
0261 NOT_VISITED,
0262 VISITED,
0263 RESOLVED,
0264 };
0265
0266 enum resolve_mode {
0267 RESOLVE_TBD,
0268 RESOLVE_PTR,
0269 RESOLVE_STRUCT_OR_ARRAY,
0270
0271
0272 };
0273
0274 #define MAX_RESOLVE_DEPTH 32
0275
0276 struct btf_sec_info {
0277 u32 off;
0278 u32 len;
0279 };
0280
0281 struct btf_verifier_env {
0282 struct btf *btf;
0283 u8 *visit_states;
0284 struct resolve_vertex stack[MAX_RESOLVE_DEPTH];
0285 struct bpf_verifier_log log;
0286 u32 log_type_id;
0287 u32 top_stack;
0288 enum verifier_phase phase;
0289 enum resolve_mode resolve_mode;
0290 };
0291
0292 static const char * const btf_kind_str[NR_BTF_KINDS] = {
0293 [BTF_KIND_UNKN] = "UNKNOWN",
0294 [BTF_KIND_INT] = "INT",
0295 [BTF_KIND_PTR] = "PTR",
0296 [BTF_KIND_ARRAY] = "ARRAY",
0297 [BTF_KIND_STRUCT] = "STRUCT",
0298 [BTF_KIND_UNION] = "UNION",
0299 [BTF_KIND_ENUM] = "ENUM",
0300 [BTF_KIND_FWD] = "FWD",
0301 [BTF_KIND_TYPEDEF] = "TYPEDEF",
0302 [BTF_KIND_VOLATILE] = "VOLATILE",
0303 [BTF_KIND_CONST] = "CONST",
0304 [BTF_KIND_RESTRICT] = "RESTRICT",
0305 [BTF_KIND_FUNC] = "FUNC",
0306 [BTF_KIND_FUNC_PROTO] = "FUNC_PROTO",
0307 [BTF_KIND_VAR] = "VAR",
0308 [BTF_KIND_DATASEC] = "DATASEC",
0309 [BTF_KIND_FLOAT] = "FLOAT",
0310 [BTF_KIND_DECL_TAG] = "DECL_TAG",
0311 [BTF_KIND_TYPE_TAG] = "TYPE_TAG",
0312 [BTF_KIND_ENUM64] = "ENUM64",
0313 };
0314
0315 const char *btf_type_str(const struct btf_type *t)
0316 {
0317 return btf_kind_str[BTF_INFO_KIND(t->info)];
0318 }
0319
0320
0321 #define BTF_SHOW_OBJ_SAFE_SIZE 32
0322
0323
0324
0325
0326
0327
0328
0329
0330 #define BTF_SHOW_OBJ_BASE_TYPE_SIZE 16
0331
0332
0333 #define BTF_SHOW_NAME_SIZE 80
0334
0335
0336
0337
0338
0339
0340
0341
0342
0343
0344
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354
0355
0356
0357
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378 struct btf_show {
0379 u64 flags;
0380 void *target;
0381 void (*showfn)(struct btf_show *show, const char *fmt, va_list args);
0382 const struct btf *btf;
0383
0384 struct {
0385 u8 depth;
0386 u8 depth_to_show;
0387 u8 depth_check;
0388 u8 array_member:1,
0389 array_terminated:1;
0390 u16 array_encoding;
0391 u32 type_id;
0392 int status;
0393 const struct btf_type *type;
0394 const struct btf_member *member;
0395 char name[BTF_SHOW_NAME_SIZE];
0396 } state;
0397 struct {
0398 u32 size;
0399 void *head;
0400 void *data;
0401 u8 safe[BTF_SHOW_OBJ_SAFE_SIZE];
0402 } obj;
0403 };
0404
0405 struct btf_kind_operations {
0406 s32 (*check_meta)(struct btf_verifier_env *env,
0407 const struct btf_type *t,
0408 u32 meta_left);
0409 int (*resolve)(struct btf_verifier_env *env,
0410 const struct resolve_vertex *v);
0411 int (*check_member)(struct btf_verifier_env *env,
0412 const struct btf_type *struct_type,
0413 const struct btf_member *member,
0414 const struct btf_type *member_type);
0415 int (*check_kflag_member)(struct btf_verifier_env *env,
0416 const struct btf_type *struct_type,
0417 const struct btf_member *member,
0418 const struct btf_type *member_type);
0419 void (*log_details)(struct btf_verifier_env *env,
0420 const struct btf_type *t);
0421 void (*show)(const struct btf *btf, const struct btf_type *t,
0422 u32 type_id, void *data, u8 bits_offsets,
0423 struct btf_show *show);
0424 };
0425
0426 static const struct btf_kind_operations * const kind_ops[NR_BTF_KINDS];
0427 static struct btf_type btf_void;
0428
0429 static int btf_resolve(struct btf_verifier_env *env,
0430 const struct btf_type *t, u32 type_id);
0431
0432 static int btf_func_check(struct btf_verifier_env *env,
0433 const struct btf_type *t);
0434
0435 static bool btf_type_is_modifier(const struct btf_type *t)
0436 {
0437
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447 switch (BTF_INFO_KIND(t->info)) {
0448 case BTF_KIND_TYPEDEF:
0449 case BTF_KIND_VOLATILE:
0450 case BTF_KIND_CONST:
0451 case BTF_KIND_RESTRICT:
0452 case BTF_KIND_TYPE_TAG:
0453 return true;
0454 }
0455
0456 return false;
0457 }
0458
0459 bool btf_type_is_void(const struct btf_type *t)
0460 {
0461 return t == &btf_void;
0462 }
0463
0464 static bool btf_type_is_fwd(const struct btf_type *t)
0465 {
0466 return BTF_INFO_KIND(t->info) == BTF_KIND_FWD;
0467 }
0468
0469 static bool btf_type_nosize(const struct btf_type *t)
0470 {
0471 return btf_type_is_void(t) || btf_type_is_fwd(t) ||
0472 btf_type_is_func(t) || btf_type_is_func_proto(t);
0473 }
0474
0475 static bool btf_type_nosize_or_null(const struct btf_type *t)
0476 {
0477 return !t || btf_type_nosize(t);
0478 }
0479
0480 static bool __btf_type_is_struct(const struct btf_type *t)
0481 {
0482 return BTF_INFO_KIND(t->info) == BTF_KIND_STRUCT;
0483 }
0484
0485 static bool btf_type_is_array(const struct btf_type *t)
0486 {
0487 return BTF_INFO_KIND(t->info) == BTF_KIND_ARRAY;
0488 }
0489
0490 static bool btf_type_is_datasec(const struct btf_type *t)
0491 {
0492 return BTF_INFO_KIND(t->info) == BTF_KIND_DATASEC;
0493 }
0494
0495 static bool btf_type_is_decl_tag(const struct btf_type *t)
0496 {
0497 return BTF_INFO_KIND(t->info) == BTF_KIND_DECL_TAG;
0498 }
0499
0500 static bool btf_type_is_decl_tag_target(const struct btf_type *t)
0501 {
0502 return btf_type_is_func(t) || btf_type_is_struct(t) ||
0503 btf_type_is_var(t) || btf_type_is_typedef(t);
0504 }
0505
0506 u32 btf_nr_types(const struct btf *btf)
0507 {
0508 u32 total = 0;
0509
0510 while (btf) {
0511 total += btf->nr_types;
0512 btf = btf->base_btf;
0513 }
0514
0515 return total;
0516 }
0517
0518 s32 btf_find_by_name_kind(const struct btf *btf, const char *name, u8 kind)
0519 {
0520 const struct btf_type *t;
0521 const char *tname;
0522 u32 i, total;
0523
0524 total = btf_nr_types(btf);
0525 for (i = 1; i < total; i++) {
0526 t = btf_type_by_id(btf, i);
0527 if (BTF_INFO_KIND(t->info) != kind)
0528 continue;
0529
0530 tname = btf_name_by_offset(btf, t->name_off);
0531 if (!strcmp(tname, name))
0532 return i;
0533 }
0534
0535 return -ENOENT;
0536 }
0537
0538 static s32 bpf_find_btf_id(const char *name, u32 kind, struct btf **btf_p)
0539 {
0540 struct btf *btf;
0541 s32 ret;
0542 int id;
0543
0544 btf = bpf_get_btf_vmlinux();
0545 if (IS_ERR(btf))
0546 return PTR_ERR(btf);
0547 if (!btf)
0548 return -EINVAL;
0549
0550 ret = btf_find_by_name_kind(btf, name, kind);
0551
0552
0553
0554 if (ret > 0) {
0555 btf_get(btf);
0556 *btf_p = btf;
0557 return ret;
0558 }
0559
0560
0561 spin_lock_bh(&btf_idr_lock);
0562 idr_for_each_entry(&btf_idr, btf, id) {
0563 if (!btf_is_module(btf))
0564 continue;
0565
0566
0567
0568 btf_get(btf);
0569 spin_unlock_bh(&btf_idr_lock);
0570 ret = btf_find_by_name_kind(btf, name, kind);
0571 if (ret > 0) {
0572 *btf_p = btf;
0573 return ret;
0574 }
0575 spin_lock_bh(&btf_idr_lock);
0576 btf_put(btf);
0577 }
0578 spin_unlock_bh(&btf_idr_lock);
0579 return ret;
0580 }
0581
0582 const struct btf_type *btf_type_skip_modifiers(const struct btf *btf,
0583 u32 id, u32 *res_id)
0584 {
0585 const struct btf_type *t = btf_type_by_id(btf, id);
0586
0587 while (btf_type_is_modifier(t)) {
0588 id = t->type;
0589 t = btf_type_by_id(btf, t->type);
0590 }
0591
0592 if (res_id)
0593 *res_id = id;
0594
0595 return t;
0596 }
0597
0598 const struct btf_type *btf_type_resolve_ptr(const struct btf *btf,
0599 u32 id, u32 *res_id)
0600 {
0601 const struct btf_type *t;
0602
0603 t = btf_type_skip_modifiers(btf, id, NULL);
0604 if (!btf_type_is_ptr(t))
0605 return NULL;
0606
0607 return btf_type_skip_modifiers(btf, t->type, res_id);
0608 }
0609
0610 const struct btf_type *btf_type_resolve_func_ptr(const struct btf *btf,
0611 u32 id, u32 *res_id)
0612 {
0613 const struct btf_type *ptype;
0614
0615 ptype = btf_type_resolve_ptr(btf, id, res_id);
0616 if (ptype && btf_type_is_func_proto(ptype))
0617 return ptype;
0618
0619 return NULL;
0620 }
0621
0622
0623
0624
0625 static bool btf_type_is_resolve_source_only(const struct btf_type *t)
0626 {
0627 return btf_type_is_var(t) ||
0628 btf_type_is_decl_tag(t) ||
0629 btf_type_is_datasec(t);
0630 }
0631
0632
0633
0634
0635
0636
0637
0638
0639
0640
0641
0642
0643
0644
0645
0646
0647
0648 static bool btf_type_needs_resolve(const struct btf_type *t)
0649 {
0650 return btf_type_is_modifier(t) ||
0651 btf_type_is_ptr(t) ||
0652 btf_type_is_struct(t) ||
0653 btf_type_is_array(t) ||
0654 btf_type_is_var(t) ||
0655 btf_type_is_func(t) ||
0656 btf_type_is_decl_tag(t) ||
0657 btf_type_is_datasec(t);
0658 }
0659
0660
0661 static bool btf_type_has_size(const struct btf_type *t)
0662 {
0663 switch (BTF_INFO_KIND(t->info)) {
0664 case BTF_KIND_INT:
0665 case BTF_KIND_STRUCT:
0666 case BTF_KIND_UNION:
0667 case BTF_KIND_ENUM:
0668 case BTF_KIND_DATASEC:
0669 case BTF_KIND_FLOAT:
0670 case BTF_KIND_ENUM64:
0671 return true;
0672 }
0673
0674 return false;
0675 }
0676
0677 static const char *btf_int_encoding_str(u8 encoding)
0678 {
0679 if (encoding == 0)
0680 return "(none)";
0681 else if (encoding == BTF_INT_SIGNED)
0682 return "SIGNED";
0683 else if (encoding == BTF_INT_CHAR)
0684 return "CHAR";
0685 else if (encoding == BTF_INT_BOOL)
0686 return "BOOL";
0687 else
0688 return "UNKN";
0689 }
0690
0691 static u32 btf_type_int(const struct btf_type *t)
0692 {
0693 return *(u32 *)(t + 1);
0694 }
0695
0696 static const struct btf_array *btf_type_array(const struct btf_type *t)
0697 {
0698 return (const struct btf_array *)(t + 1);
0699 }
0700
0701 static const struct btf_enum *btf_type_enum(const struct btf_type *t)
0702 {
0703 return (const struct btf_enum *)(t + 1);
0704 }
0705
0706 static const struct btf_var *btf_type_var(const struct btf_type *t)
0707 {
0708 return (const struct btf_var *)(t + 1);
0709 }
0710
0711 static const struct btf_decl_tag *btf_type_decl_tag(const struct btf_type *t)
0712 {
0713 return (const struct btf_decl_tag *)(t + 1);
0714 }
0715
0716 static const struct btf_enum64 *btf_type_enum64(const struct btf_type *t)
0717 {
0718 return (const struct btf_enum64 *)(t + 1);
0719 }
0720
0721 static const struct btf_kind_operations *btf_type_ops(const struct btf_type *t)
0722 {
0723 return kind_ops[BTF_INFO_KIND(t->info)];
0724 }
0725
0726 static bool btf_name_offset_valid(const struct btf *btf, u32 offset)
0727 {
0728 if (!BTF_STR_OFFSET_VALID(offset))
0729 return false;
0730
0731 while (offset < btf->start_str_off)
0732 btf = btf->base_btf;
0733
0734 offset -= btf->start_str_off;
0735 return offset < btf->hdr.str_len;
0736 }
0737
0738 static bool __btf_name_char_ok(char c, bool first, bool dot_ok)
0739 {
0740 if ((first ? !isalpha(c) :
0741 !isalnum(c)) &&
0742 c != '_' &&
0743 ((c == '.' && !dot_ok) ||
0744 c != '.'))
0745 return false;
0746 return true;
0747 }
0748
0749 static const char *btf_str_by_offset(const struct btf *btf, u32 offset)
0750 {
0751 while (offset < btf->start_str_off)
0752 btf = btf->base_btf;
0753
0754 offset -= btf->start_str_off;
0755 if (offset < btf->hdr.str_len)
0756 return &btf->strings[offset];
0757
0758 return NULL;
0759 }
0760
0761 static bool __btf_name_valid(const struct btf *btf, u32 offset, bool dot_ok)
0762 {
0763
0764 const char *src = btf_str_by_offset(btf, offset);
0765 const char *src_limit;
0766
0767 if (!__btf_name_char_ok(*src, true, dot_ok))
0768 return false;
0769
0770
0771 src_limit = src + KSYM_NAME_LEN;
0772 src++;
0773 while (*src && src < src_limit) {
0774 if (!__btf_name_char_ok(*src, false, dot_ok))
0775 return false;
0776 src++;
0777 }
0778
0779 return !*src;
0780 }
0781
0782
0783
0784
0785 static bool btf_name_valid_identifier(const struct btf *btf, u32 offset)
0786 {
0787 return __btf_name_valid(btf, offset, false);
0788 }
0789
0790 static bool btf_name_valid_section(const struct btf *btf, u32 offset)
0791 {
0792 return __btf_name_valid(btf, offset, true);
0793 }
0794
0795 static const char *__btf_name_by_offset(const struct btf *btf, u32 offset)
0796 {
0797 const char *name;
0798
0799 if (!offset)
0800 return "(anon)";
0801
0802 name = btf_str_by_offset(btf, offset);
0803 return name ?: "(invalid-name-offset)";
0804 }
0805
0806 const char *btf_name_by_offset(const struct btf *btf, u32 offset)
0807 {
0808 return btf_str_by_offset(btf, offset);
0809 }
0810
0811 const struct btf_type *btf_type_by_id(const struct btf *btf, u32 type_id)
0812 {
0813 while (type_id < btf->start_id)
0814 btf = btf->base_btf;
0815
0816 type_id -= btf->start_id;
0817 if (type_id >= btf->nr_types)
0818 return NULL;
0819 return btf->types[type_id];
0820 }
0821
0822
0823
0824
0825
0826 static bool btf_type_int_is_regular(const struct btf_type *t)
0827 {
0828 u8 nr_bits, nr_bytes;
0829 u32 int_data;
0830
0831 int_data = btf_type_int(t);
0832 nr_bits = BTF_INT_BITS(int_data);
0833 nr_bytes = BITS_ROUNDUP_BYTES(nr_bits);
0834 if (BITS_PER_BYTE_MASKED(nr_bits) ||
0835 BTF_INT_OFFSET(int_data) ||
0836 (nr_bytes != sizeof(u8) && nr_bytes != sizeof(u16) &&
0837 nr_bytes != sizeof(u32) && nr_bytes != sizeof(u64) &&
0838 nr_bytes != (2 * sizeof(u64)))) {
0839 return false;
0840 }
0841
0842 return true;
0843 }
0844
0845
0846
0847
0848
0849 bool btf_member_is_reg_int(const struct btf *btf, const struct btf_type *s,
0850 const struct btf_member *m,
0851 u32 expected_offset, u32 expected_size)
0852 {
0853 const struct btf_type *t;
0854 u32 id, int_data;
0855 u8 nr_bits;
0856
0857 id = m->type;
0858 t = btf_type_id_size(btf, &id, NULL);
0859 if (!t || !btf_type_is_int(t))
0860 return false;
0861
0862 int_data = btf_type_int(t);
0863 nr_bits = BTF_INT_BITS(int_data);
0864 if (btf_type_kflag(s)) {
0865 u32 bitfield_size = BTF_MEMBER_BITFIELD_SIZE(m->offset);
0866 u32 bit_offset = BTF_MEMBER_BIT_OFFSET(m->offset);
0867
0868
0869
0870
0871 return !bitfield_size &&
0872 BITS_ROUNDUP_BYTES(bit_offset) == expected_offset &&
0873 BITS_ROUNDUP_BYTES(nr_bits) == expected_size;
0874 }
0875
0876 if (BTF_INT_OFFSET(int_data) ||
0877 BITS_PER_BYTE_MASKED(m->offset) ||
0878 BITS_ROUNDUP_BYTES(m->offset) != expected_offset ||
0879 BITS_PER_BYTE_MASKED(nr_bits) ||
0880 BITS_ROUNDUP_BYTES(nr_bits) != expected_size)
0881 return false;
0882
0883 return true;
0884 }
0885
0886
0887 static const struct btf_type *btf_type_skip_qualifiers(const struct btf *btf,
0888 u32 id)
0889 {
0890 const struct btf_type *t = btf_type_by_id(btf, id);
0891
0892 while (btf_type_is_modifier(t) &&
0893 BTF_INFO_KIND(t->info) != BTF_KIND_TYPEDEF) {
0894 t = btf_type_by_id(btf, t->type);
0895 }
0896
0897 return t;
0898 }
0899
0900 #define BTF_SHOW_MAX_ITER 10
0901
0902 #define BTF_KIND_BIT(kind) (1ULL << kind)
0903
0904
0905
0906
0907
0908
0909
0910 static const char *btf_show_name(struct btf_show *show)
0911 {
0912
0913 const char *array_suffixes = "[][][][][][][][][][]";
0914 const char *array_suffix = &array_suffixes[strlen(array_suffixes)];
0915
0916 const char *ptr_suffixes = "**********";
0917 const char *ptr_suffix = &ptr_suffixes[strlen(ptr_suffixes)];
0918 const char *name = NULL, *prefix = "", *parens = "";
0919 const struct btf_member *m = show->state.member;
0920 const struct btf_type *t;
0921 const struct btf_array *array;
0922 u32 id = show->state.type_id;
0923 const char *member = NULL;
0924 bool show_member = false;
0925 u64 kinds = 0;
0926 int i;
0927
0928 show->state.name[0] = '\0';
0929
0930
0931
0932
0933
0934
0935 if (show->state.array_member)
0936 return "";
0937
0938
0939 if (m) {
0940 member = btf_name_by_offset(show->btf, m->name_off);
0941 show_member = strlen(member) > 0;
0942 id = m->type;
0943 }
0944
0945
0946
0947
0948
0949
0950
0951
0952 t = btf_type_by_id(show->btf, id);
0953 if (!t)
0954 return "";
0955
0956
0957
0958
0959
0960
0961
0962
0963
0964
0965
0966
0967
0968
0969
0970
0971
0972
0973
0974
0975
0976
0977
0978 for (i = 0; i < BTF_SHOW_MAX_ITER; i++) {
0979
0980 switch (BTF_INFO_KIND(t->info)) {
0981 case BTF_KIND_TYPEDEF:
0982 if (!name)
0983 name = btf_name_by_offset(show->btf,
0984 t->name_off);
0985 kinds |= BTF_KIND_BIT(BTF_KIND_TYPEDEF);
0986 id = t->type;
0987 break;
0988 case BTF_KIND_ARRAY:
0989 kinds |= BTF_KIND_BIT(BTF_KIND_ARRAY);
0990 parens = "[";
0991 if (!t)
0992 return "";
0993 array = btf_type_array(t);
0994 if (array_suffix > array_suffixes)
0995 array_suffix -= 2;
0996 id = array->type;
0997 break;
0998 case BTF_KIND_PTR:
0999 kinds |= BTF_KIND_BIT(BTF_KIND_PTR);
1000 if (ptr_suffix > ptr_suffixes)
1001 ptr_suffix -= 1;
1002 id = t->type;
1003 break;
1004 default:
1005 id = 0;
1006 break;
1007 }
1008 if (!id)
1009 break;
1010 t = btf_type_skip_qualifiers(show->btf, id);
1011 }
1012
1013 if (i == BTF_SHOW_MAX_ITER)
1014 return "";
1015
1016 if (!name)
1017 name = btf_name_by_offset(show->btf, t->name_off);
1018
1019 switch (BTF_INFO_KIND(t->info)) {
1020 case BTF_KIND_STRUCT:
1021 case BTF_KIND_UNION:
1022 prefix = BTF_INFO_KIND(t->info) == BTF_KIND_STRUCT ?
1023 "struct" : "union";
1024
1025 if (!(kinds & (BTF_KIND_BIT(BTF_KIND_ARRAY))))
1026 parens = "{";
1027 break;
1028 case BTF_KIND_ENUM:
1029 case BTF_KIND_ENUM64:
1030 prefix = "enum";
1031 break;
1032 default:
1033 break;
1034 }
1035
1036
1037 if (kinds & BTF_KIND_BIT(BTF_KIND_PTR))
1038 parens = "";
1039
1040 if (kinds & BTF_KIND_BIT(BTF_KIND_TYPEDEF))
1041 prefix = "";
1042
1043 if (!name)
1044 name = "";
1045
1046
1047 if (show->flags & BTF_SHOW_NONAME)
1048 snprintf(show->state.name, sizeof(show->state.name), "%s",
1049 parens);
1050 else
1051 snprintf(show->state.name, sizeof(show->state.name),
1052 "%s%s%s(%s%s%s%s%s%s)%s",
1053
1054 show_member ? "." : "",
1055 show_member ? member : "",
1056 show_member ? " = " : "",
1057
1058 prefix,
1059 strlen(prefix) > 0 && strlen(name) > 0 ? " " : "",
1060
1061 name,
1062
1063 strlen(ptr_suffix) > 0 ? " " : "", ptr_suffix,
1064 array_suffix, parens);
1065
1066 return show->state.name;
1067 }
1068
1069 static const char *__btf_show_indent(struct btf_show *show)
1070 {
1071 const char *indents = " ";
1072 const char *indent = &indents[strlen(indents)];
1073
1074 if ((indent - show->state.depth) >= indents)
1075 return indent - show->state.depth;
1076 return indents;
1077 }
1078
1079 static const char *btf_show_indent(struct btf_show *show)
1080 {
1081 return show->flags & BTF_SHOW_COMPACT ? "" : __btf_show_indent(show);
1082 }
1083
1084 static const char *btf_show_newline(struct btf_show *show)
1085 {
1086 return show->flags & BTF_SHOW_COMPACT ? "" : "\n";
1087 }
1088
1089 static const char *btf_show_delim(struct btf_show *show)
1090 {
1091 if (show->state.depth == 0)
1092 return "";
1093
1094 if ((show->flags & BTF_SHOW_COMPACT) && show->state.type &&
1095 BTF_INFO_KIND(show->state.type->info) == BTF_KIND_UNION)
1096 return "|";
1097
1098 return ",";
1099 }
1100
1101 __printf(2, 3) static void btf_show(struct btf_show *show, const char *fmt, ...)
1102 {
1103 va_list args;
1104
1105 if (!show->state.depth_check) {
1106 va_start(args, fmt);
1107 show->showfn(show, fmt, args);
1108 va_end(args);
1109 }
1110 }
1111
1112
1113
1114
1115
1116
1117 #define btf_show_type_value(show, fmt, value) \
1118 do { \
1119 if ((value) != (__typeof__(value))0 || \
1120 (show->flags & BTF_SHOW_ZERO) || \
1121 show->state.depth == 0) { \
1122 btf_show(show, "%s%s" fmt "%s%s", \
1123 btf_show_indent(show), \
1124 btf_show_name(show), \
1125 value, btf_show_delim(show), \
1126 btf_show_newline(show)); \
1127 if (show->state.depth > show->state.depth_to_show) \
1128 show->state.depth_to_show = show->state.depth; \
1129 } \
1130 } while (0)
1131
1132 #define btf_show_type_values(show, fmt, ...) \
1133 do { \
1134 btf_show(show, "%s%s" fmt "%s%s", btf_show_indent(show), \
1135 btf_show_name(show), \
1136 __VA_ARGS__, btf_show_delim(show), \
1137 btf_show_newline(show)); \
1138 if (show->state.depth > show->state.depth_to_show) \
1139 show->state.depth_to_show = show->state.depth; \
1140 } while (0)
1141
1142
1143 static int btf_show_obj_size_left(struct btf_show *show, void *data)
1144 {
1145 return show->obj.head + show->obj.size - data;
1146 }
1147
1148
1149 static bool btf_show_obj_is_safe(struct btf_show *show, void *data, int size)
1150 {
1151 return data >= show->obj.data &&
1152 (data + size) < (show->obj.data + BTF_SHOW_OBJ_SAFE_SIZE);
1153 }
1154
1155
1156
1157
1158
1159
1160
1161 static void *__btf_show_obj_safe(struct btf_show *show, void *data, int size)
1162 {
1163 if (btf_show_obj_is_safe(show, data, size))
1164 return show->obj.safe + (data - show->obj.data);
1165 return NULL;
1166 }
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196 static void *btf_show_obj_safe(struct btf_show *show,
1197 const struct btf_type *t,
1198 void *data)
1199 {
1200 const struct btf_type *rt;
1201 int size_left, size;
1202 void *safe = NULL;
1203
1204 if (show->flags & BTF_SHOW_UNSAFE)
1205 return data;
1206
1207 rt = btf_resolve_size(show->btf, t, &size);
1208 if (IS_ERR(rt)) {
1209 show->state.status = PTR_ERR(rt);
1210 return NULL;
1211 }
1212
1213
1214
1215
1216
1217
1218 if (show->state.depth == 0) {
1219 show->obj.size = size;
1220 show->obj.head = data;
1221 } else {
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243 safe = __btf_show_obj_safe(show, data,
1244 min(size,
1245 BTF_SHOW_OBJ_BASE_TYPE_SIZE));
1246 }
1247
1248
1249
1250
1251
1252
1253 if (!safe) {
1254 size_left = btf_show_obj_size_left(show, data);
1255 if (size_left > BTF_SHOW_OBJ_SAFE_SIZE)
1256 size_left = BTF_SHOW_OBJ_SAFE_SIZE;
1257 show->state.status = copy_from_kernel_nofault(show->obj.safe,
1258 data, size_left);
1259 if (!show->state.status) {
1260 show->obj.data = data;
1261 safe = show->obj.safe;
1262 }
1263 }
1264
1265 return safe;
1266 }
1267
1268
1269
1270
1271
1272 static void *btf_show_start_type(struct btf_show *show,
1273 const struct btf_type *t,
1274 u32 type_id, void *data)
1275 {
1276 show->state.type = t;
1277 show->state.type_id = type_id;
1278 show->state.name[0] = '\0';
1279
1280 return btf_show_obj_safe(show, t, data);
1281 }
1282
1283 static void btf_show_end_type(struct btf_show *show)
1284 {
1285 show->state.type = NULL;
1286 show->state.type_id = 0;
1287 show->state.name[0] = '\0';
1288 }
1289
1290 static void *btf_show_start_aggr_type(struct btf_show *show,
1291 const struct btf_type *t,
1292 u32 type_id, void *data)
1293 {
1294 void *safe_data = btf_show_start_type(show, t, type_id, data);
1295
1296 if (!safe_data)
1297 return safe_data;
1298
1299 btf_show(show, "%s%s%s", btf_show_indent(show),
1300 btf_show_name(show),
1301 btf_show_newline(show));
1302 show->state.depth++;
1303 return safe_data;
1304 }
1305
1306 static void btf_show_end_aggr_type(struct btf_show *show,
1307 const char *suffix)
1308 {
1309 show->state.depth--;
1310 btf_show(show, "%s%s%s%s", btf_show_indent(show), suffix,
1311 btf_show_delim(show), btf_show_newline(show));
1312 btf_show_end_type(show);
1313 }
1314
1315 static void btf_show_start_member(struct btf_show *show,
1316 const struct btf_member *m)
1317 {
1318 show->state.member = m;
1319 }
1320
1321 static void btf_show_start_array_member(struct btf_show *show)
1322 {
1323 show->state.array_member = 1;
1324 btf_show_start_member(show, NULL);
1325 }
1326
1327 static void btf_show_end_member(struct btf_show *show)
1328 {
1329 show->state.member = NULL;
1330 }
1331
1332 static void btf_show_end_array_member(struct btf_show *show)
1333 {
1334 show->state.array_member = 0;
1335 btf_show_end_member(show);
1336 }
1337
1338 static void *btf_show_start_array_type(struct btf_show *show,
1339 const struct btf_type *t,
1340 u32 type_id,
1341 u16 array_encoding,
1342 void *data)
1343 {
1344 show->state.array_encoding = array_encoding;
1345 show->state.array_terminated = 0;
1346 return btf_show_start_aggr_type(show, t, type_id, data);
1347 }
1348
1349 static void btf_show_end_array_type(struct btf_show *show)
1350 {
1351 show->state.array_encoding = 0;
1352 show->state.array_terminated = 0;
1353 btf_show_end_aggr_type(show, "]");
1354 }
1355
1356 static void *btf_show_start_struct_type(struct btf_show *show,
1357 const struct btf_type *t,
1358 u32 type_id,
1359 void *data)
1360 {
1361 return btf_show_start_aggr_type(show, t, type_id, data);
1362 }
1363
1364 static void btf_show_end_struct_type(struct btf_show *show)
1365 {
1366 btf_show_end_aggr_type(show, "}");
1367 }
1368
1369 __printf(2, 3) static void __btf_verifier_log(struct bpf_verifier_log *log,
1370 const char *fmt, ...)
1371 {
1372 va_list args;
1373
1374 va_start(args, fmt);
1375 bpf_verifier_vlog(log, fmt, args);
1376 va_end(args);
1377 }
1378
1379 __printf(2, 3) static void btf_verifier_log(struct btf_verifier_env *env,
1380 const char *fmt, ...)
1381 {
1382 struct bpf_verifier_log *log = &env->log;
1383 va_list args;
1384
1385 if (!bpf_verifier_log_needed(log))
1386 return;
1387
1388 va_start(args, fmt);
1389 bpf_verifier_vlog(log, fmt, args);
1390 va_end(args);
1391 }
1392
1393 __printf(4, 5) static void __btf_verifier_log_type(struct btf_verifier_env *env,
1394 const struct btf_type *t,
1395 bool log_details,
1396 const char *fmt, ...)
1397 {
1398 struct bpf_verifier_log *log = &env->log;
1399 u8 kind = BTF_INFO_KIND(t->info);
1400 struct btf *btf = env->btf;
1401 va_list args;
1402
1403 if (!bpf_verifier_log_needed(log))
1404 return;
1405
1406
1407
1408
1409
1410 if (log->level == BPF_LOG_KERNEL && !fmt)
1411 return;
1412
1413 __btf_verifier_log(log, "[%u] %s %s%s",
1414 env->log_type_id,
1415 btf_kind_str[kind],
1416 __btf_name_by_offset(btf, t->name_off),
1417 log_details ? " " : "");
1418
1419 if (log_details)
1420 btf_type_ops(t)->log_details(env, t);
1421
1422 if (fmt && *fmt) {
1423 __btf_verifier_log(log, " ");
1424 va_start(args, fmt);
1425 bpf_verifier_vlog(log, fmt, args);
1426 va_end(args);
1427 }
1428
1429 __btf_verifier_log(log, "\n");
1430 }
1431
1432 #define btf_verifier_log_type(env, t, ...) \
1433 __btf_verifier_log_type((env), (t), true, __VA_ARGS__)
1434 #define btf_verifier_log_basic(env, t, ...) \
1435 __btf_verifier_log_type((env), (t), false, __VA_ARGS__)
1436
1437 __printf(4, 5)
1438 static void btf_verifier_log_member(struct btf_verifier_env *env,
1439 const struct btf_type *struct_type,
1440 const struct btf_member *member,
1441 const char *fmt, ...)
1442 {
1443 struct bpf_verifier_log *log = &env->log;
1444 struct btf *btf = env->btf;
1445 va_list args;
1446
1447 if (!bpf_verifier_log_needed(log))
1448 return;
1449
1450 if (log->level == BPF_LOG_KERNEL && !fmt)
1451 return;
1452
1453
1454
1455
1456
1457
1458 if (env->phase != CHECK_META)
1459 btf_verifier_log_type(env, struct_type, NULL);
1460
1461 if (btf_type_kflag(struct_type))
1462 __btf_verifier_log(log,
1463 "\t%s type_id=%u bitfield_size=%u bits_offset=%u",
1464 __btf_name_by_offset(btf, member->name_off),
1465 member->type,
1466 BTF_MEMBER_BITFIELD_SIZE(member->offset),
1467 BTF_MEMBER_BIT_OFFSET(member->offset));
1468 else
1469 __btf_verifier_log(log, "\t%s type_id=%u bits_offset=%u",
1470 __btf_name_by_offset(btf, member->name_off),
1471 member->type, member->offset);
1472
1473 if (fmt && *fmt) {
1474 __btf_verifier_log(log, " ");
1475 va_start(args, fmt);
1476 bpf_verifier_vlog(log, fmt, args);
1477 va_end(args);
1478 }
1479
1480 __btf_verifier_log(log, "\n");
1481 }
1482
1483 __printf(4, 5)
1484 static void btf_verifier_log_vsi(struct btf_verifier_env *env,
1485 const struct btf_type *datasec_type,
1486 const struct btf_var_secinfo *vsi,
1487 const char *fmt, ...)
1488 {
1489 struct bpf_verifier_log *log = &env->log;
1490 va_list args;
1491
1492 if (!bpf_verifier_log_needed(log))
1493 return;
1494 if (log->level == BPF_LOG_KERNEL && !fmt)
1495 return;
1496 if (env->phase != CHECK_META)
1497 btf_verifier_log_type(env, datasec_type, NULL);
1498
1499 __btf_verifier_log(log, "\t type_id=%u offset=%u size=%u",
1500 vsi->type, vsi->offset, vsi->size);
1501 if (fmt && *fmt) {
1502 __btf_verifier_log(log, " ");
1503 va_start(args, fmt);
1504 bpf_verifier_vlog(log, fmt, args);
1505 va_end(args);
1506 }
1507
1508 __btf_verifier_log(log, "\n");
1509 }
1510
1511 static void btf_verifier_log_hdr(struct btf_verifier_env *env,
1512 u32 btf_data_size)
1513 {
1514 struct bpf_verifier_log *log = &env->log;
1515 const struct btf *btf = env->btf;
1516 const struct btf_header *hdr;
1517
1518 if (!bpf_verifier_log_needed(log))
1519 return;
1520
1521 if (log->level == BPF_LOG_KERNEL)
1522 return;
1523 hdr = &btf->hdr;
1524 __btf_verifier_log(log, "magic: 0x%x\n", hdr->magic);
1525 __btf_verifier_log(log, "version: %u\n", hdr->version);
1526 __btf_verifier_log(log, "flags: 0x%x\n", hdr->flags);
1527 __btf_verifier_log(log, "hdr_len: %u\n", hdr->hdr_len);
1528 __btf_verifier_log(log, "type_off: %u\n", hdr->type_off);
1529 __btf_verifier_log(log, "type_len: %u\n", hdr->type_len);
1530 __btf_verifier_log(log, "str_off: %u\n", hdr->str_off);
1531 __btf_verifier_log(log, "str_len: %u\n", hdr->str_len);
1532 __btf_verifier_log(log, "btf_total_size: %u\n", btf_data_size);
1533 }
1534
1535 static int btf_add_type(struct btf_verifier_env *env, struct btf_type *t)
1536 {
1537 struct btf *btf = env->btf;
1538
1539 if (btf->types_size == btf->nr_types) {
1540
1541
1542 struct btf_type **new_types;
1543 u32 expand_by, new_size;
1544
1545 if (btf->start_id + btf->types_size == BTF_MAX_TYPE) {
1546 btf_verifier_log(env, "Exceeded max num of types");
1547 return -E2BIG;
1548 }
1549
1550 expand_by = max_t(u32, btf->types_size >> 2, 16);
1551 new_size = min_t(u32, BTF_MAX_TYPE,
1552 btf->types_size + expand_by);
1553
1554 new_types = kvcalloc(new_size, sizeof(*new_types),
1555 GFP_KERNEL | __GFP_NOWARN);
1556 if (!new_types)
1557 return -ENOMEM;
1558
1559 if (btf->nr_types == 0) {
1560 if (!btf->base_btf) {
1561
1562 new_types[0] = &btf_void;
1563 btf->nr_types++;
1564 }
1565 } else {
1566 memcpy(new_types, btf->types,
1567 sizeof(*btf->types) * btf->nr_types);
1568 }
1569
1570 kvfree(btf->types);
1571 btf->types = new_types;
1572 btf->types_size = new_size;
1573 }
1574
1575 btf->types[btf->nr_types++] = t;
1576
1577 return 0;
1578 }
1579
1580 static int btf_alloc_id(struct btf *btf)
1581 {
1582 int id;
1583
1584 idr_preload(GFP_KERNEL);
1585 spin_lock_bh(&btf_idr_lock);
1586 id = idr_alloc_cyclic(&btf_idr, btf, 1, INT_MAX, GFP_ATOMIC);
1587 if (id > 0)
1588 btf->id = id;
1589 spin_unlock_bh(&btf_idr_lock);
1590 idr_preload_end();
1591
1592 if (WARN_ON_ONCE(!id))
1593 return -ENOSPC;
1594
1595 return id > 0 ? 0 : id;
1596 }
1597
1598 static void btf_free_id(struct btf *btf)
1599 {
1600 unsigned long flags;
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611 spin_lock_irqsave(&btf_idr_lock, flags);
1612 idr_remove(&btf_idr, btf->id);
1613 spin_unlock_irqrestore(&btf_idr_lock, flags);
1614 }
1615
1616 static void btf_free_kfunc_set_tab(struct btf *btf)
1617 {
1618 struct btf_kfunc_set_tab *tab = btf->kfunc_set_tab;
1619 int hook;
1620
1621 if (!tab)
1622 return;
1623
1624
1625
1626 if (btf_is_module(btf))
1627 goto free_tab;
1628 for (hook = 0; hook < ARRAY_SIZE(tab->sets); hook++)
1629 kfree(tab->sets[hook]);
1630 free_tab:
1631 kfree(tab);
1632 btf->kfunc_set_tab = NULL;
1633 }
1634
1635 static void btf_free_dtor_kfunc_tab(struct btf *btf)
1636 {
1637 struct btf_id_dtor_kfunc_tab *tab = btf->dtor_kfunc_tab;
1638
1639 if (!tab)
1640 return;
1641 kfree(tab);
1642 btf->dtor_kfunc_tab = NULL;
1643 }
1644
1645 static void btf_free(struct btf *btf)
1646 {
1647 btf_free_dtor_kfunc_tab(btf);
1648 btf_free_kfunc_set_tab(btf);
1649 kvfree(btf->types);
1650 kvfree(btf->resolved_sizes);
1651 kvfree(btf->resolved_ids);
1652 kvfree(btf->data);
1653 kfree(btf);
1654 }
1655
1656 static void btf_free_rcu(struct rcu_head *rcu)
1657 {
1658 struct btf *btf = container_of(rcu, struct btf, rcu);
1659
1660 btf_free(btf);
1661 }
1662
1663 void btf_get(struct btf *btf)
1664 {
1665 refcount_inc(&btf->refcnt);
1666 }
1667
1668 void btf_put(struct btf *btf)
1669 {
1670 if (btf && refcount_dec_and_test(&btf->refcnt)) {
1671 btf_free_id(btf);
1672 call_rcu(&btf->rcu, btf_free_rcu);
1673 }
1674 }
1675
1676 static int env_resolve_init(struct btf_verifier_env *env)
1677 {
1678 struct btf *btf = env->btf;
1679 u32 nr_types = btf->nr_types;
1680 u32 *resolved_sizes = NULL;
1681 u32 *resolved_ids = NULL;
1682 u8 *visit_states = NULL;
1683
1684 resolved_sizes = kvcalloc(nr_types, sizeof(*resolved_sizes),
1685 GFP_KERNEL | __GFP_NOWARN);
1686 if (!resolved_sizes)
1687 goto nomem;
1688
1689 resolved_ids = kvcalloc(nr_types, sizeof(*resolved_ids),
1690 GFP_KERNEL | __GFP_NOWARN);
1691 if (!resolved_ids)
1692 goto nomem;
1693
1694 visit_states = kvcalloc(nr_types, sizeof(*visit_states),
1695 GFP_KERNEL | __GFP_NOWARN);
1696 if (!visit_states)
1697 goto nomem;
1698
1699 btf->resolved_sizes = resolved_sizes;
1700 btf->resolved_ids = resolved_ids;
1701 env->visit_states = visit_states;
1702
1703 return 0;
1704
1705 nomem:
1706 kvfree(resolved_sizes);
1707 kvfree(resolved_ids);
1708 kvfree(visit_states);
1709 return -ENOMEM;
1710 }
1711
1712 static void btf_verifier_env_free(struct btf_verifier_env *env)
1713 {
1714 kvfree(env->visit_states);
1715 kfree(env);
1716 }
1717
1718 static bool env_type_is_resolve_sink(const struct btf_verifier_env *env,
1719 const struct btf_type *next_type)
1720 {
1721 switch (env->resolve_mode) {
1722 case RESOLVE_TBD:
1723
1724 return !btf_type_needs_resolve(next_type);
1725 case RESOLVE_PTR:
1726
1727
1728
1729 return !btf_type_is_modifier(next_type) &&
1730 !btf_type_is_ptr(next_type);
1731 case RESOLVE_STRUCT_OR_ARRAY:
1732
1733
1734
1735 return !btf_type_is_modifier(next_type) &&
1736 !btf_type_is_array(next_type) &&
1737 !btf_type_is_struct(next_type);
1738 default:
1739 BUG();
1740 }
1741 }
1742
1743 static bool env_type_is_resolved(const struct btf_verifier_env *env,
1744 u32 type_id)
1745 {
1746
1747 if (type_id < env->btf->start_id)
1748 return true;
1749
1750 return env->visit_states[type_id - env->btf->start_id] == RESOLVED;
1751 }
1752
1753 static int env_stack_push(struct btf_verifier_env *env,
1754 const struct btf_type *t, u32 type_id)
1755 {
1756 const struct btf *btf = env->btf;
1757 struct resolve_vertex *v;
1758
1759 if (env->top_stack == MAX_RESOLVE_DEPTH)
1760 return -E2BIG;
1761
1762 if (type_id < btf->start_id
1763 || env->visit_states[type_id - btf->start_id] != NOT_VISITED)
1764 return -EEXIST;
1765
1766 env->visit_states[type_id - btf->start_id] = VISITED;
1767
1768 v = &env->stack[env->top_stack++];
1769 v->t = t;
1770 v->type_id = type_id;
1771 v->next_member = 0;
1772
1773 if (env->resolve_mode == RESOLVE_TBD) {
1774 if (btf_type_is_ptr(t))
1775 env->resolve_mode = RESOLVE_PTR;
1776 else if (btf_type_is_struct(t) || btf_type_is_array(t))
1777 env->resolve_mode = RESOLVE_STRUCT_OR_ARRAY;
1778 }
1779
1780 return 0;
1781 }
1782
1783 static void env_stack_set_next_member(struct btf_verifier_env *env,
1784 u16 next_member)
1785 {
1786 env->stack[env->top_stack - 1].next_member = next_member;
1787 }
1788
1789 static void env_stack_pop_resolved(struct btf_verifier_env *env,
1790 u32 resolved_type_id,
1791 u32 resolved_size)
1792 {
1793 u32 type_id = env->stack[--(env->top_stack)].type_id;
1794 struct btf *btf = env->btf;
1795
1796 type_id -= btf->start_id;
1797 btf->resolved_sizes[type_id] = resolved_size;
1798 btf->resolved_ids[type_id] = resolved_type_id;
1799 env->visit_states[type_id] = RESOLVED;
1800 }
1801
1802 static const struct resolve_vertex *env_stack_peak(struct btf_verifier_env *env)
1803 {
1804 return env->top_stack ? &env->stack[env->top_stack - 1] : NULL;
1805 }
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827 static const struct btf_type *
1828 __btf_resolve_size(const struct btf *btf, const struct btf_type *type,
1829 u32 *type_size, const struct btf_type **elem_type,
1830 u32 *elem_id, u32 *total_nelems, u32 *type_id)
1831 {
1832 const struct btf_type *array_type = NULL;
1833 const struct btf_array *array = NULL;
1834 u32 i, size, nelems = 1, id = 0;
1835
1836 for (i = 0; i < MAX_RESOLVE_DEPTH; i++) {
1837 switch (BTF_INFO_KIND(type->info)) {
1838
1839 case BTF_KIND_INT:
1840 case BTF_KIND_STRUCT:
1841 case BTF_KIND_UNION:
1842 case BTF_KIND_ENUM:
1843 case BTF_KIND_FLOAT:
1844 case BTF_KIND_ENUM64:
1845 size = type->size;
1846 goto resolved;
1847
1848 case BTF_KIND_PTR:
1849 size = sizeof(void *);
1850 goto resolved;
1851
1852
1853 case BTF_KIND_TYPEDEF:
1854 case BTF_KIND_VOLATILE:
1855 case BTF_KIND_CONST:
1856 case BTF_KIND_RESTRICT:
1857 case BTF_KIND_TYPE_TAG:
1858 id = type->type;
1859 type = btf_type_by_id(btf, type->type);
1860 break;
1861
1862 case BTF_KIND_ARRAY:
1863 if (!array_type)
1864 array_type = type;
1865 array = btf_type_array(type);
1866 if (nelems && array->nelems > U32_MAX / nelems)
1867 return ERR_PTR(-EINVAL);
1868 nelems *= array->nelems;
1869 type = btf_type_by_id(btf, array->type);
1870 break;
1871
1872
1873 default:
1874 return ERR_PTR(-EINVAL);
1875 }
1876 }
1877
1878 return ERR_PTR(-EINVAL);
1879
1880 resolved:
1881 if (nelems && size > U32_MAX / nelems)
1882 return ERR_PTR(-EINVAL);
1883
1884 *type_size = nelems * size;
1885 if (total_nelems)
1886 *total_nelems = nelems;
1887 if (elem_type)
1888 *elem_type = type;
1889 if (elem_id)
1890 *elem_id = array ? array->type : 0;
1891 if (type_id && id)
1892 *type_id = id;
1893
1894 return array_type ? : type;
1895 }
1896
1897 const struct btf_type *
1898 btf_resolve_size(const struct btf *btf, const struct btf_type *type,
1899 u32 *type_size)
1900 {
1901 return __btf_resolve_size(btf, type, type_size, NULL, NULL, NULL, NULL);
1902 }
1903
1904 static u32 btf_resolved_type_id(const struct btf *btf, u32 type_id)
1905 {
1906 while (type_id < btf->start_id)
1907 btf = btf->base_btf;
1908
1909 return btf->resolved_ids[type_id - btf->start_id];
1910 }
1911
1912
1913 static const struct btf_type *btf_type_id_resolve(const struct btf *btf,
1914 u32 *type_id)
1915 {
1916 *type_id = btf_resolved_type_id(btf, *type_id);
1917 return btf_type_by_id(btf, *type_id);
1918 }
1919
1920 static u32 btf_resolved_type_size(const struct btf *btf, u32 type_id)
1921 {
1922 while (type_id < btf->start_id)
1923 btf = btf->base_btf;
1924
1925 return btf->resolved_sizes[type_id - btf->start_id];
1926 }
1927
1928 const struct btf_type *btf_type_id_size(const struct btf *btf,
1929 u32 *type_id, u32 *ret_size)
1930 {
1931 const struct btf_type *size_type;
1932 u32 size_type_id = *type_id;
1933 u32 size = 0;
1934
1935 size_type = btf_type_by_id(btf, size_type_id);
1936 if (btf_type_nosize_or_null(size_type))
1937 return NULL;
1938
1939 if (btf_type_has_size(size_type)) {
1940 size = size_type->size;
1941 } else if (btf_type_is_array(size_type)) {
1942 size = btf_resolved_type_size(btf, size_type_id);
1943 } else if (btf_type_is_ptr(size_type)) {
1944 size = sizeof(void *);
1945 } else {
1946 if (WARN_ON_ONCE(!btf_type_is_modifier(size_type) &&
1947 !btf_type_is_var(size_type)))
1948 return NULL;
1949
1950 size_type_id = btf_resolved_type_id(btf, size_type_id);
1951 size_type = btf_type_by_id(btf, size_type_id);
1952 if (btf_type_nosize_or_null(size_type))
1953 return NULL;
1954 else if (btf_type_has_size(size_type))
1955 size = size_type->size;
1956 else if (btf_type_is_array(size_type))
1957 size = btf_resolved_type_size(btf, size_type_id);
1958 else if (btf_type_is_ptr(size_type))
1959 size = sizeof(void *);
1960 else
1961 return NULL;
1962 }
1963
1964 *type_id = size_type_id;
1965 if (ret_size)
1966 *ret_size = size;
1967
1968 return size_type;
1969 }
1970
1971 static int btf_df_check_member(struct btf_verifier_env *env,
1972 const struct btf_type *struct_type,
1973 const struct btf_member *member,
1974 const struct btf_type *member_type)
1975 {
1976 btf_verifier_log_basic(env, struct_type,
1977 "Unsupported check_member");
1978 return -EINVAL;
1979 }
1980
1981 static int btf_df_check_kflag_member(struct btf_verifier_env *env,
1982 const struct btf_type *struct_type,
1983 const struct btf_member *member,
1984 const struct btf_type *member_type)
1985 {
1986 btf_verifier_log_basic(env, struct_type,
1987 "Unsupported check_kflag_member");
1988 return -EINVAL;
1989 }
1990
1991
1992
1993
1994 static int btf_generic_check_kflag_member(struct btf_verifier_env *env,
1995 const struct btf_type *struct_type,
1996 const struct btf_member *member,
1997 const struct btf_type *member_type)
1998 {
1999 if (BTF_MEMBER_BITFIELD_SIZE(member->offset)) {
2000 btf_verifier_log_member(env, struct_type, member,
2001 "Invalid member bitfield_size");
2002 return -EINVAL;
2003 }
2004
2005
2006
2007
2008 return btf_type_ops(member_type)->check_member(env, struct_type,
2009 member,
2010 member_type);
2011 }
2012
2013 static int btf_df_resolve(struct btf_verifier_env *env,
2014 const struct resolve_vertex *v)
2015 {
2016 btf_verifier_log_basic(env, v->t, "Unsupported resolve");
2017 return -EINVAL;
2018 }
2019
2020 static void btf_df_show(const struct btf *btf, const struct btf_type *t,
2021 u32 type_id, void *data, u8 bits_offsets,
2022 struct btf_show *show)
2023 {
2024 btf_show(show, "<unsupported kind:%u>", BTF_INFO_KIND(t->info));
2025 }
2026
2027 static int btf_int_check_member(struct btf_verifier_env *env,
2028 const struct btf_type *struct_type,
2029 const struct btf_member *member,
2030 const struct btf_type *member_type)
2031 {
2032 u32 int_data = btf_type_int(member_type);
2033 u32 struct_bits_off = member->offset;
2034 u32 struct_size = struct_type->size;
2035 u32 nr_copy_bits;
2036 u32 bytes_offset;
2037
2038 if (U32_MAX - struct_bits_off < BTF_INT_OFFSET(int_data)) {
2039 btf_verifier_log_member(env, struct_type, member,
2040 "bits_offset exceeds U32_MAX");
2041 return -EINVAL;
2042 }
2043
2044 struct_bits_off += BTF_INT_OFFSET(int_data);
2045 bytes_offset = BITS_ROUNDDOWN_BYTES(struct_bits_off);
2046 nr_copy_bits = BTF_INT_BITS(int_data) +
2047 BITS_PER_BYTE_MASKED(struct_bits_off);
2048
2049 if (nr_copy_bits > BITS_PER_U128) {
2050 btf_verifier_log_member(env, struct_type, member,
2051 "nr_copy_bits exceeds 128");
2052 return -EINVAL;
2053 }
2054
2055 if (struct_size < bytes_offset ||
2056 struct_size - bytes_offset < BITS_ROUNDUP_BYTES(nr_copy_bits)) {
2057 btf_verifier_log_member(env, struct_type, member,
2058 "Member exceeds struct_size");
2059 return -EINVAL;
2060 }
2061
2062 return 0;
2063 }
2064
2065 static int btf_int_check_kflag_member(struct btf_verifier_env *env,
2066 const struct btf_type *struct_type,
2067 const struct btf_member *member,
2068 const struct btf_type *member_type)
2069 {
2070 u32 struct_bits_off, nr_bits, nr_int_data_bits, bytes_offset;
2071 u32 int_data = btf_type_int(member_type);
2072 u32 struct_size = struct_type->size;
2073 u32 nr_copy_bits;
2074
2075
2076 if (!btf_type_int_is_regular(member_type)) {
2077 btf_verifier_log_member(env, struct_type, member,
2078 "Invalid member base type");
2079 return -EINVAL;
2080 }
2081
2082
2083 nr_bits = BTF_MEMBER_BITFIELD_SIZE(member->offset);
2084 struct_bits_off = BTF_MEMBER_BIT_OFFSET(member->offset);
2085 nr_int_data_bits = BTF_INT_BITS(int_data);
2086 if (!nr_bits) {
2087
2088
2089
2090 if (BITS_PER_BYTE_MASKED(struct_bits_off)) {
2091 btf_verifier_log_member(env, struct_type, member,
2092 "Invalid member offset");
2093 return -EINVAL;
2094 }
2095
2096 nr_bits = nr_int_data_bits;
2097 } else if (nr_bits > nr_int_data_bits) {
2098 btf_verifier_log_member(env, struct_type, member,
2099 "Invalid member bitfield_size");
2100 return -EINVAL;
2101 }
2102
2103 bytes_offset = BITS_ROUNDDOWN_BYTES(struct_bits_off);
2104 nr_copy_bits = nr_bits + BITS_PER_BYTE_MASKED(struct_bits_off);
2105 if (nr_copy_bits > BITS_PER_U128) {
2106 btf_verifier_log_member(env, struct_type, member,
2107 "nr_copy_bits exceeds 128");
2108 return -EINVAL;
2109 }
2110
2111 if (struct_size < bytes_offset ||
2112 struct_size - bytes_offset < BITS_ROUNDUP_BYTES(nr_copy_bits)) {
2113 btf_verifier_log_member(env, struct_type, member,
2114 "Member exceeds struct_size");
2115 return -EINVAL;
2116 }
2117
2118 return 0;
2119 }
2120
2121 static s32 btf_int_check_meta(struct btf_verifier_env *env,
2122 const struct btf_type *t,
2123 u32 meta_left)
2124 {
2125 u32 int_data, nr_bits, meta_needed = sizeof(int_data);
2126 u16 encoding;
2127
2128 if (meta_left < meta_needed) {
2129 btf_verifier_log_basic(env, t,
2130 "meta_left:%u meta_needed:%u",
2131 meta_left, meta_needed);
2132 return -EINVAL;
2133 }
2134
2135 if (btf_type_vlen(t)) {
2136 btf_verifier_log_type(env, t, "vlen != 0");
2137 return -EINVAL;
2138 }
2139
2140 if (btf_type_kflag(t)) {
2141 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag");
2142 return -EINVAL;
2143 }
2144
2145 int_data = btf_type_int(t);
2146 if (int_data & ~BTF_INT_MASK) {
2147 btf_verifier_log_basic(env, t, "Invalid int_data:%x",
2148 int_data);
2149 return -EINVAL;
2150 }
2151
2152 nr_bits = BTF_INT_BITS(int_data) + BTF_INT_OFFSET(int_data);
2153
2154 if (nr_bits > BITS_PER_U128) {
2155 btf_verifier_log_type(env, t, "nr_bits exceeds %zu",
2156 BITS_PER_U128);
2157 return -EINVAL;
2158 }
2159
2160 if (BITS_ROUNDUP_BYTES(nr_bits) > t->size) {
2161 btf_verifier_log_type(env, t, "nr_bits exceeds type_size");
2162 return -EINVAL;
2163 }
2164
2165
2166
2167
2168
2169
2170
2171 encoding = BTF_INT_ENCODING(int_data);
2172 if (encoding &&
2173 encoding != BTF_INT_SIGNED &&
2174 encoding != BTF_INT_CHAR &&
2175 encoding != BTF_INT_BOOL) {
2176 btf_verifier_log_type(env, t, "Unsupported encoding");
2177 return -ENOTSUPP;
2178 }
2179
2180 btf_verifier_log_type(env, t, NULL);
2181
2182 return meta_needed;
2183 }
2184
2185 static void btf_int_log(struct btf_verifier_env *env,
2186 const struct btf_type *t)
2187 {
2188 int int_data = btf_type_int(t);
2189
2190 btf_verifier_log(env,
2191 "size=%u bits_offset=%u nr_bits=%u encoding=%s",
2192 t->size, BTF_INT_OFFSET(int_data),
2193 BTF_INT_BITS(int_data),
2194 btf_int_encoding_str(BTF_INT_ENCODING(int_data)));
2195 }
2196
2197 static void btf_int128_print(struct btf_show *show, void *data)
2198 {
2199
2200
2201
2202
2203
2204
2205
2206 u64 upper_num, lower_num;
2207
2208 #ifdef __BIG_ENDIAN_BITFIELD
2209 upper_num = *(u64 *)data;
2210 lower_num = *(u64 *)(data + 8);
2211 #else
2212 upper_num = *(u64 *)(data + 8);
2213 lower_num = *(u64 *)data;
2214 #endif
2215 if (upper_num == 0)
2216 btf_show_type_value(show, "0x%llx", lower_num);
2217 else
2218 btf_show_type_values(show, "0x%llx%016llx", upper_num,
2219 lower_num);
2220 }
2221
2222 static void btf_int128_shift(u64 *print_num, u16 left_shift_bits,
2223 u16 right_shift_bits)
2224 {
2225 u64 upper_num, lower_num;
2226
2227 #ifdef __BIG_ENDIAN_BITFIELD
2228 upper_num = print_num[0];
2229 lower_num = print_num[1];
2230 #else
2231 upper_num = print_num[1];
2232 lower_num = print_num[0];
2233 #endif
2234
2235
2236 if (left_shift_bits >= 64) {
2237 upper_num = lower_num << (left_shift_bits - 64);
2238 lower_num = 0;
2239 } else {
2240 upper_num = (upper_num << left_shift_bits) |
2241 (lower_num >> (64 - left_shift_bits));
2242 lower_num = lower_num << left_shift_bits;
2243 }
2244
2245 if (right_shift_bits >= 64) {
2246 lower_num = upper_num >> (right_shift_bits - 64);
2247 upper_num = 0;
2248 } else {
2249 lower_num = (lower_num >> right_shift_bits) |
2250 (upper_num << (64 - right_shift_bits));
2251 upper_num = upper_num >> right_shift_bits;
2252 }
2253
2254 #ifdef __BIG_ENDIAN_BITFIELD
2255 print_num[0] = upper_num;
2256 print_num[1] = lower_num;
2257 #else
2258 print_num[0] = lower_num;
2259 print_num[1] = upper_num;
2260 #endif
2261 }
2262
2263 static void btf_bitfield_show(void *data, u8 bits_offset,
2264 u8 nr_bits, struct btf_show *show)
2265 {
2266 u16 left_shift_bits, right_shift_bits;
2267 u8 nr_copy_bytes;
2268 u8 nr_copy_bits;
2269 u64 print_num[2] = {};
2270
2271 nr_copy_bits = nr_bits + bits_offset;
2272 nr_copy_bytes = BITS_ROUNDUP_BYTES(nr_copy_bits);
2273
2274 memcpy(print_num, data, nr_copy_bytes);
2275
2276 #ifdef __BIG_ENDIAN_BITFIELD
2277 left_shift_bits = bits_offset;
2278 #else
2279 left_shift_bits = BITS_PER_U128 - nr_copy_bits;
2280 #endif
2281 right_shift_bits = BITS_PER_U128 - nr_bits;
2282
2283 btf_int128_shift(print_num, left_shift_bits, right_shift_bits);
2284 btf_int128_print(show, print_num);
2285 }
2286
2287
2288 static void btf_int_bits_show(const struct btf *btf,
2289 const struct btf_type *t,
2290 void *data, u8 bits_offset,
2291 struct btf_show *show)
2292 {
2293 u32 int_data = btf_type_int(t);
2294 u8 nr_bits = BTF_INT_BITS(int_data);
2295 u8 total_bits_offset;
2296
2297
2298
2299
2300
2301 total_bits_offset = bits_offset + BTF_INT_OFFSET(int_data);
2302 data += BITS_ROUNDDOWN_BYTES(total_bits_offset);
2303 bits_offset = BITS_PER_BYTE_MASKED(total_bits_offset);
2304 btf_bitfield_show(data, bits_offset, nr_bits, show);
2305 }
2306
2307 static void btf_int_show(const struct btf *btf, const struct btf_type *t,
2308 u32 type_id, void *data, u8 bits_offset,
2309 struct btf_show *show)
2310 {
2311 u32 int_data = btf_type_int(t);
2312 u8 encoding = BTF_INT_ENCODING(int_data);
2313 bool sign = encoding & BTF_INT_SIGNED;
2314 u8 nr_bits = BTF_INT_BITS(int_data);
2315 void *safe_data;
2316
2317 safe_data = btf_show_start_type(show, t, type_id, data);
2318 if (!safe_data)
2319 return;
2320
2321 if (bits_offset || BTF_INT_OFFSET(int_data) ||
2322 BITS_PER_BYTE_MASKED(nr_bits)) {
2323 btf_int_bits_show(btf, t, safe_data, bits_offset, show);
2324 goto out;
2325 }
2326
2327 switch (nr_bits) {
2328 case 128:
2329 btf_int128_print(show, safe_data);
2330 break;
2331 case 64:
2332 if (sign)
2333 btf_show_type_value(show, "%lld", *(s64 *)safe_data);
2334 else
2335 btf_show_type_value(show, "%llu", *(u64 *)safe_data);
2336 break;
2337 case 32:
2338 if (sign)
2339 btf_show_type_value(show, "%d", *(s32 *)safe_data);
2340 else
2341 btf_show_type_value(show, "%u", *(u32 *)safe_data);
2342 break;
2343 case 16:
2344 if (sign)
2345 btf_show_type_value(show, "%d", *(s16 *)safe_data);
2346 else
2347 btf_show_type_value(show, "%u", *(u16 *)safe_data);
2348 break;
2349 case 8:
2350 if (show->state.array_encoding == BTF_INT_CHAR) {
2351
2352 if (show->state.array_terminated)
2353 break;
2354 if (*(char *)data == '\0') {
2355 show->state.array_terminated = 1;
2356 break;
2357 }
2358 if (isprint(*(char *)data)) {
2359 btf_show_type_value(show, "'%c'",
2360 *(char *)safe_data);
2361 break;
2362 }
2363 }
2364 if (sign)
2365 btf_show_type_value(show, "%d", *(s8 *)safe_data);
2366 else
2367 btf_show_type_value(show, "%u", *(u8 *)safe_data);
2368 break;
2369 default:
2370 btf_int_bits_show(btf, t, safe_data, bits_offset, show);
2371 break;
2372 }
2373 out:
2374 btf_show_end_type(show);
2375 }
2376
2377 static const struct btf_kind_operations int_ops = {
2378 .check_meta = btf_int_check_meta,
2379 .resolve = btf_df_resolve,
2380 .check_member = btf_int_check_member,
2381 .check_kflag_member = btf_int_check_kflag_member,
2382 .log_details = btf_int_log,
2383 .show = btf_int_show,
2384 };
2385
2386 static int btf_modifier_check_member(struct btf_verifier_env *env,
2387 const struct btf_type *struct_type,
2388 const struct btf_member *member,
2389 const struct btf_type *member_type)
2390 {
2391 const struct btf_type *resolved_type;
2392 u32 resolved_type_id = member->type;
2393 struct btf_member resolved_member;
2394 struct btf *btf = env->btf;
2395
2396 resolved_type = btf_type_id_size(btf, &resolved_type_id, NULL);
2397 if (!resolved_type) {
2398 btf_verifier_log_member(env, struct_type, member,
2399 "Invalid member");
2400 return -EINVAL;
2401 }
2402
2403 resolved_member = *member;
2404 resolved_member.type = resolved_type_id;
2405
2406 return btf_type_ops(resolved_type)->check_member(env, struct_type,
2407 &resolved_member,
2408 resolved_type);
2409 }
2410
2411 static int btf_modifier_check_kflag_member(struct btf_verifier_env *env,
2412 const struct btf_type *struct_type,
2413 const struct btf_member *member,
2414 const struct btf_type *member_type)
2415 {
2416 const struct btf_type *resolved_type;
2417 u32 resolved_type_id = member->type;
2418 struct btf_member resolved_member;
2419 struct btf *btf = env->btf;
2420
2421 resolved_type = btf_type_id_size(btf, &resolved_type_id, NULL);
2422 if (!resolved_type) {
2423 btf_verifier_log_member(env, struct_type, member,
2424 "Invalid member");
2425 return -EINVAL;
2426 }
2427
2428 resolved_member = *member;
2429 resolved_member.type = resolved_type_id;
2430
2431 return btf_type_ops(resolved_type)->check_kflag_member(env, struct_type,
2432 &resolved_member,
2433 resolved_type);
2434 }
2435
2436 static int btf_ptr_check_member(struct btf_verifier_env *env,
2437 const struct btf_type *struct_type,
2438 const struct btf_member *member,
2439 const struct btf_type *member_type)
2440 {
2441 u32 struct_size, struct_bits_off, bytes_offset;
2442
2443 struct_size = struct_type->size;
2444 struct_bits_off = member->offset;
2445 bytes_offset = BITS_ROUNDDOWN_BYTES(struct_bits_off);
2446
2447 if (BITS_PER_BYTE_MASKED(struct_bits_off)) {
2448 btf_verifier_log_member(env, struct_type, member,
2449 "Member is not byte aligned");
2450 return -EINVAL;
2451 }
2452
2453 if (struct_size - bytes_offset < sizeof(void *)) {
2454 btf_verifier_log_member(env, struct_type, member,
2455 "Member exceeds struct_size");
2456 return -EINVAL;
2457 }
2458
2459 return 0;
2460 }
2461
2462 static int btf_ref_type_check_meta(struct btf_verifier_env *env,
2463 const struct btf_type *t,
2464 u32 meta_left)
2465 {
2466 const char *value;
2467
2468 if (btf_type_vlen(t)) {
2469 btf_verifier_log_type(env, t, "vlen != 0");
2470 return -EINVAL;
2471 }
2472
2473 if (btf_type_kflag(t)) {
2474 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag");
2475 return -EINVAL;
2476 }
2477
2478 if (!BTF_TYPE_ID_VALID(t->type)) {
2479 btf_verifier_log_type(env, t, "Invalid type_id");
2480 return -EINVAL;
2481 }
2482
2483
2484
2485
2486 if (BTF_INFO_KIND(t->info) == BTF_KIND_TYPEDEF) {
2487 if (!t->name_off ||
2488 !btf_name_valid_identifier(env->btf, t->name_off)) {
2489 btf_verifier_log_type(env, t, "Invalid name");
2490 return -EINVAL;
2491 }
2492 } else if (BTF_INFO_KIND(t->info) == BTF_KIND_TYPE_TAG) {
2493 value = btf_name_by_offset(env->btf, t->name_off);
2494 if (!value || !value[0]) {
2495 btf_verifier_log_type(env, t, "Invalid name");
2496 return -EINVAL;
2497 }
2498 } else {
2499 if (t->name_off) {
2500 btf_verifier_log_type(env, t, "Invalid name");
2501 return -EINVAL;
2502 }
2503 }
2504
2505 btf_verifier_log_type(env, t, NULL);
2506
2507 return 0;
2508 }
2509
2510 static int btf_modifier_resolve(struct btf_verifier_env *env,
2511 const struct resolve_vertex *v)
2512 {
2513 const struct btf_type *t = v->t;
2514 const struct btf_type *next_type;
2515 u32 next_type_id = t->type;
2516 struct btf *btf = env->btf;
2517
2518 next_type = btf_type_by_id(btf, next_type_id);
2519 if (!next_type || btf_type_is_resolve_source_only(next_type)) {
2520 btf_verifier_log_type(env, v->t, "Invalid type_id");
2521 return -EINVAL;
2522 }
2523
2524 if (!env_type_is_resolve_sink(env, next_type) &&
2525 !env_type_is_resolved(env, next_type_id))
2526 return env_stack_push(env, next_type, next_type_id);
2527
2528
2529
2530
2531
2532
2533
2534 if (!btf_type_id_size(btf, &next_type_id, NULL)) {
2535 if (env_type_is_resolved(env, next_type_id))
2536 next_type = btf_type_id_resolve(btf, &next_type_id);
2537
2538
2539 if (!btf_type_is_void(next_type) &&
2540 !btf_type_is_fwd(next_type) &&
2541 !btf_type_is_func_proto(next_type)) {
2542 btf_verifier_log_type(env, v->t, "Invalid type_id");
2543 return -EINVAL;
2544 }
2545 }
2546
2547 env_stack_pop_resolved(env, next_type_id, 0);
2548
2549 return 0;
2550 }
2551
2552 static int btf_var_resolve(struct btf_verifier_env *env,
2553 const struct resolve_vertex *v)
2554 {
2555 const struct btf_type *next_type;
2556 const struct btf_type *t = v->t;
2557 u32 next_type_id = t->type;
2558 struct btf *btf = env->btf;
2559
2560 next_type = btf_type_by_id(btf, next_type_id);
2561 if (!next_type || btf_type_is_resolve_source_only(next_type)) {
2562 btf_verifier_log_type(env, v->t, "Invalid type_id");
2563 return -EINVAL;
2564 }
2565
2566 if (!env_type_is_resolve_sink(env, next_type) &&
2567 !env_type_is_resolved(env, next_type_id))
2568 return env_stack_push(env, next_type, next_type_id);
2569
2570 if (btf_type_is_modifier(next_type)) {
2571 const struct btf_type *resolved_type;
2572 u32 resolved_type_id;
2573
2574 resolved_type_id = next_type_id;
2575 resolved_type = btf_type_id_resolve(btf, &resolved_type_id);
2576
2577 if (btf_type_is_ptr(resolved_type) &&
2578 !env_type_is_resolve_sink(env, resolved_type) &&
2579 !env_type_is_resolved(env, resolved_type_id))
2580 return env_stack_push(env, resolved_type,
2581 resolved_type_id);
2582 }
2583
2584
2585
2586
2587
2588 if (!btf_type_id_size(btf, &next_type_id, NULL)) {
2589 btf_verifier_log_type(env, v->t, "Invalid type_id");
2590 return -EINVAL;
2591 }
2592
2593 env_stack_pop_resolved(env, next_type_id, 0);
2594
2595 return 0;
2596 }
2597
2598 static int btf_ptr_resolve(struct btf_verifier_env *env,
2599 const struct resolve_vertex *v)
2600 {
2601 const struct btf_type *next_type;
2602 const struct btf_type *t = v->t;
2603 u32 next_type_id = t->type;
2604 struct btf *btf = env->btf;
2605
2606 next_type = btf_type_by_id(btf, next_type_id);
2607 if (!next_type || btf_type_is_resolve_source_only(next_type)) {
2608 btf_verifier_log_type(env, v->t, "Invalid type_id");
2609 return -EINVAL;
2610 }
2611
2612 if (!env_type_is_resolve_sink(env, next_type) &&
2613 !env_type_is_resolved(env, next_type_id))
2614 return env_stack_push(env, next_type, next_type_id);
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624 if (btf_type_is_modifier(next_type)) {
2625 const struct btf_type *resolved_type;
2626 u32 resolved_type_id;
2627
2628 resolved_type_id = next_type_id;
2629 resolved_type = btf_type_id_resolve(btf, &resolved_type_id);
2630
2631 if (btf_type_is_ptr(resolved_type) &&
2632 !env_type_is_resolve_sink(env, resolved_type) &&
2633 !env_type_is_resolved(env, resolved_type_id))
2634 return env_stack_push(env, resolved_type,
2635 resolved_type_id);
2636 }
2637
2638 if (!btf_type_id_size(btf, &next_type_id, NULL)) {
2639 if (env_type_is_resolved(env, next_type_id))
2640 next_type = btf_type_id_resolve(btf, &next_type_id);
2641
2642 if (!btf_type_is_void(next_type) &&
2643 !btf_type_is_fwd(next_type) &&
2644 !btf_type_is_func_proto(next_type)) {
2645 btf_verifier_log_type(env, v->t, "Invalid type_id");
2646 return -EINVAL;
2647 }
2648 }
2649
2650 env_stack_pop_resolved(env, next_type_id, 0);
2651
2652 return 0;
2653 }
2654
2655 static void btf_modifier_show(const struct btf *btf,
2656 const struct btf_type *t,
2657 u32 type_id, void *data,
2658 u8 bits_offset, struct btf_show *show)
2659 {
2660 if (btf->resolved_ids)
2661 t = btf_type_id_resolve(btf, &type_id);
2662 else
2663 t = btf_type_skip_modifiers(btf, type_id, NULL);
2664
2665 btf_type_ops(t)->show(btf, t, type_id, data, bits_offset, show);
2666 }
2667
2668 static void btf_var_show(const struct btf *btf, const struct btf_type *t,
2669 u32 type_id, void *data, u8 bits_offset,
2670 struct btf_show *show)
2671 {
2672 t = btf_type_id_resolve(btf, &type_id);
2673
2674 btf_type_ops(t)->show(btf, t, type_id, data, bits_offset, show);
2675 }
2676
2677 static void btf_ptr_show(const struct btf *btf, const struct btf_type *t,
2678 u32 type_id, void *data, u8 bits_offset,
2679 struct btf_show *show)
2680 {
2681 void *safe_data;
2682
2683 safe_data = btf_show_start_type(show, t, type_id, data);
2684 if (!safe_data)
2685 return;
2686
2687
2688 if (show->flags & BTF_SHOW_PTR_RAW)
2689 btf_show_type_value(show, "0x%px", *(void **)safe_data);
2690 else
2691 btf_show_type_value(show, "0x%p", *(void **)safe_data);
2692 btf_show_end_type(show);
2693 }
2694
2695 static void btf_ref_type_log(struct btf_verifier_env *env,
2696 const struct btf_type *t)
2697 {
2698 btf_verifier_log(env, "type_id=%u", t->type);
2699 }
2700
2701 static struct btf_kind_operations modifier_ops = {
2702 .check_meta = btf_ref_type_check_meta,
2703 .resolve = btf_modifier_resolve,
2704 .check_member = btf_modifier_check_member,
2705 .check_kflag_member = btf_modifier_check_kflag_member,
2706 .log_details = btf_ref_type_log,
2707 .show = btf_modifier_show,
2708 };
2709
2710 static struct btf_kind_operations ptr_ops = {
2711 .check_meta = btf_ref_type_check_meta,
2712 .resolve = btf_ptr_resolve,
2713 .check_member = btf_ptr_check_member,
2714 .check_kflag_member = btf_generic_check_kflag_member,
2715 .log_details = btf_ref_type_log,
2716 .show = btf_ptr_show,
2717 };
2718
2719 static s32 btf_fwd_check_meta(struct btf_verifier_env *env,
2720 const struct btf_type *t,
2721 u32 meta_left)
2722 {
2723 if (btf_type_vlen(t)) {
2724 btf_verifier_log_type(env, t, "vlen != 0");
2725 return -EINVAL;
2726 }
2727
2728 if (t->type) {
2729 btf_verifier_log_type(env, t, "type != 0");
2730 return -EINVAL;
2731 }
2732
2733
2734 if (!t->name_off ||
2735 !btf_name_valid_identifier(env->btf, t->name_off)) {
2736 btf_verifier_log_type(env, t, "Invalid name");
2737 return -EINVAL;
2738 }
2739
2740 btf_verifier_log_type(env, t, NULL);
2741
2742 return 0;
2743 }
2744
2745 static void btf_fwd_type_log(struct btf_verifier_env *env,
2746 const struct btf_type *t)
2747 {
2748 btf_verifier_log(env, "%s", btf_type_kflag(t) ? "union" : "struct");
2749 }
2750
2751 static struct btf_kind_operations fwd_ops = {
2752 .check_meta = btf_fwd_check_meta,
2753 .resolve = btf_df_resolve,
2754 .check_member = btf_df_check_member,
2755 .check_kflag_member = btf_df_check_kflag_member,
2756 .log_details = btf_fwd_type_log,
2757 .show = btf_df_show,
2758 };
2759
2760 static int btf_array_check_member(struct btf_verifier_env *env,
2761 const struct btf_type *struct_type,
2762 const struct btf_member *member,
2763 const struct btf_type *member_type)
2764 {
2765 u32 struct_bits_off = member->offset;
2766 u32 struct_size, bytes_offset;
2767 u32 array_type_id, array_size;
2768 struct btf *btf = env->btf;
2769
2770 if (BITS_PER_BYTE_MASKED(struct_bits_off)) {
2771 btf_verifier_log_member(env, struct_type, member,
2772 "Member is not byte aligned");
2773 return -EINVAL;
2774 }
2775
2776 array_type_id = member->type;
2777 btf_type_id_size(btf, &array_type_id, &array_size);
2778 struct_size = struct_type->size;
2779 bytes_offset = BITS_ROUNDDOWN_BYTES(struct_bits_off);
2780 if (struct_size - bytes_offset < array_size) {
2781 btf_verifier_log_member(env, struct_type, member,
2782 "Member exceeds struct_size");
2783 return -EINVAL;
2784 }
2785
2786 return 0;
2787 }
2788
2789 static s32 btf_array_check_meta(struct btf_verifier_env *env,
2790 const struct btf_type *t,
2791 u32 meta_left)
2792 {
2793 const struct btf_array *array = btf_type_array(t);
2794 u32 meta_needed = sizeof(*array);
2795
2796 if (meta_left < meta_needed) {
2797 btf_verifier_log_basic(env, t,
2798 "meta_left:%u meta_needed:%u",
2799 meta_left, meta_needed);
2800 return -EINVAL;
2801 }
2802
2803
2804 if (t->name_off) {
2805 btf_verifier_log_type(env, t, "Invalid name");
2806 return -EINVAL;
2807 }
2808
2809 if (btf_type_vlen(t)) {
2810 btf_verifier_log_type(env, t, "vlen != 0");
2811 return -EINVAL;
2812 }
2813
2814 if (btf_type_kflag(t)) {
2815 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag");
2816 return -EINVAL;
2817 }
2818
2819 if (t->size) {
2820 btf_verifier_log_type(env, t, "size != 0");
2821 return -EINVAL;
2822 }
2823
2824
2825
2826
2827 if (!array->type || !BTF_TYPE_ID_VALID(array->type)) {
2828 btf_verifier_log_type(env, t, "Invalid elem");
2829 return -EINVAL;
2830 }
2831
2832 if (!array->index_type || !BTF_TYPE_ID_VALID(array->index_type)) {
2833 btf_verifier_log_type(env, t, "Invalid index");
2834 return -EINVAL;
2835 }
2836
2837 btf_verifier_log_type(env, t, NULL);
2838
2839 return meta_needed;
2840 }
2841
2842 static int btf_array_resolve(struct btf_verifier_env *env,
2843 const struct resolve_vertex *v)
2844 {
2845 const struct btf_array *array = btf_type_array(v->t);
2846 const struct btf_type *elem_type, *index_type;
2847 u32 elem_type_id, index_type_id;
2848 struct btf *btf = env->btf;
2849 u32 elem_size;
2850
2851
2852 index_type_id = array->index_type;
2853 index_type = btf_type_by_id(btf, index_type_id);
2854 if (btf_type_nosize_or_null(index_type) ||
2855 btf_type_is_resolve_source_only(index_type)) {
2856 btf_verifier_log_type(env, v->t, "Invalid index");
2857 return -EINVAL;
2858 }
2859
2860 if (!env_type_is_resolve_sink(env, index_type) &&
2861 !env_type_is_resolved(env, index_type_id))
2862 return env_stack_push(env, index_type, index_type_id);
2863
2864 index_type = btf_type_id_size(btf, &index_type_id, NULL);
2865 if (!index_type || !btf_type_is_int(index_type) ||
2866 !btf_type_int_is_regular(index_type)) {
2867 btf_verifier_log_type(env, v->t, "Invalid index");
2868 return -EINVAL;
2869 }
2870
2871
2872 elem_type_id = array->type;
2873 elem_type = btf_type_by_id(btf, elem_type_id);
2874 if (btf_type_nosize_or_null(elem_type) ||
2875 btf_type_is_resolve_source_only(elem_type)) {
2876 btf_verifier_log_type(env, v->t,
2877 "Invalid elem");
2878 return -EINVAL;
2879 }
2880
2881 if (!env_type_is_resolve_sink(env, elem_type) &&
2882 !env_type_is_resolved(env, elem_type_id))
2883 return env_stack_push(env, elem_type, elem_type_id);
2884
2885 elem_type = btf_type_id_size(btf, &elem_type_id, &elem_size);
2886 if (!elem_type) {
2887 btf_verifier_log_type(env, v->t, "Invalid elem");
2888 return -EINVAL;
2889 }
2890
2891 if (btf_type_is_int(elem_type) && !btf_type_int_is_regular(elem_type)) {
2892 btf_verifier_log_type(env, v->t, "Invalid array of int");
2893 return -EINVAL;
2894 }
2895
2896 if (array->nelems && elem_size > U32_MAX / array->nelems) {
2897 btf_verifier_log_type(env, v->t,
2898 "Array size overflows U32_MAX");
2899 return -EINVAL;
2900 }
2901
2902 env_stack_pop_resolved(env, elem_type_id, elem_size * array->nelems);
2903
2904 return 0;
2905 }
2906
2907 static void btf_array_log(struct btf_verifier_env *env,
2908 const struct btf_type *t)
2909 {
2910 const struct btf_array *array = btf_type_array(t);
2911
2912 btf_verifier_log(env, "type_id=%u index_type_id=%u nr_elems=%u",
2913 array->type, array->index_type, array->nelems);
2914 }
2915
2916 static void __btf_array_show(const struct btf *btf, const struct btf_type *t,
2917 u32 type_id, void *data, u8 bits_offset,
2918 struct btf_show *show)
2919 {
2920 const struct btf_array *array = btf_type_array(t);
2921 const struct btf_kind_operations *elem_ops;
2922 const struct btf_type *elem_type;
2923 u32 i, elem_size = 0, elem_type_id;
2924 u16 encoding = 0;
2925
2926 elem_type_id = array->type;
2927 elem_type = btf_type_skip_modifiers(btf, elem_type_id, NULL);
2928 if (elem_type && btf_type_has_size(elem_type))
2929 elem_size = elem_type->size;
2930
2931 if (elem_type && btf_type_is_int(elem_type)) {
2932 u32 int_type = btf_type_int(elem_type);
2933
2934 encoding = BTF_INT_ENCODING(int_type);
2935
2936
2937
2938
2939
2940
2941 if (elem_size == 1)
2942 encoding = BTF_INT_CHAR;
2943 }
2944
2945 if (!btf_show_start_array_type(show, t, type_id, encoding, data))
2946 return;
2947
2948 if (!elem_type)
2949 goto out;
2950 elem_ops = btf_type_ops(elem_type);
2951
2952 for (i = 0; i < array->nelems; i++) {
2953
2954 btf_show_start_array_member(show);
2955
2956 elem_ops->show(btf, elem_type, elem_type_id, data,
2957 bits_offset, show);
2958 data += elem_size;
2959
2960 btf_show_end_array_member(show);
2961
2962 if (show->state.array_terminated)
2963 break;
2964 }
2965 out:
2966 btf_show_end_array_type(show);
2967 }
2968
2969 static void btf_array_show(const struct btf *btf, const struct btf_type *t,
2970 u32 type_id, void *data, u8 bits_offset,
2971 struct btf_show *show)
2972 {
2973 const struct btf_member *m = show->state.member;
2974
2975
2976
2977
2978
2979
2980 if (show->state.depth > 0 && !(show->flags & BTF_SHOW_ZERO)) {
2981 if (!show->state.depth_check) {
2982 show->state.depth_check = show->state.depth + 1;
2983 show->state.depth_to_show = 0;
2984 }
2985 __btf_array_show(btf, t, type_id, data, bits_offset, show);
2986 show->state.member = m;
2987
2988 if (show->state.depth_check != show->state.depth + 1)
2989 return;
2990 show->state.depth_check = 0;
2991
2992 if (show->state.depth_to_show <= show->state.depth)
2993 return;
2994
2995
2996
2997
2998 }
2999 __btf_array_show(btf, t, type_id, data, bits_offset, show);
3000 }
3001
3002 static struct btf_kind_operations array_ops = {
3003 .check_meta = btf_array_check_meta,
3004 .resolve = btf_array_resolve,
3005 .check_member = btf_array_check_member,
3006 .check_kflag_member = btf_generic_check_kflag_member,
3007 .log_details = btf_array_log,
3008 .show = btf_array_show,
3009 };
3010
3011 static int btf_struct_check_member(struct btf_verifier_env *env,
3012 const struct btf_type *struct_type,
3013 const struct btf_member *member,
3014 const struct btf_type *member_type)
3015 {
3016 u32 struct_bits_off = member->offset;
3017 u32 struct_size, bytes_offset;
3018
3019 if (BITS_PER_BYTE_MASKED(struct_bits_off)) {
3020 btf_verifier_log_member(env, struct_type, member,
3021 "Member is not byte aligned");
3022 return -EINVAL;
3023 }
3024
3025 struct_size = struct_type->size;
3026 bytes_offset = BITS_ROUNDDOWN_BYTES(struct_bits_off);
3027 if (struct_size - bytes_offset < member_type->size) {
3028 btf_verifier_log_member(env, struct_type, member,
3029 "Member exceeds struct_size");
3030 return -EINVAL;
3031 }
3032
3033 return 0;
3034 }
3035
3036 static s32 btf_struct_check_meta(struct btf_verifier_env *env,
3037 const struct btf_type *t,
3038 u32 meta_left)
3039 {
3040 bool is_union = BTF_INFO_KIND(t->info) == BTF_KIND_UNION;
3041 const struct btf_member *member;
3042 u32 meta_needed, last_offset;
3043 struct btf *btf = env->btf;
3044 u32 struct_size = t->size;
3045 u32 offset;
3046 u16 i;
3047
3048 meta_needed = btf_type_vlen(t) * sizeof(*member);
3049 if (meta_left < meta_needed) {
3050 btf_verifier_log_basic(env, t,
3051 "meta_left:%u meta_needed:%u",
3052 meta_left, meta_needed);
3053 return -EINVAL;
3054 }
3055
3056
3057 if (t->name_off &&
3058 !btf_name_valid_identifier(env->btf, t->name_off)) {
3059 btf_verifier_log_type(env, t, "Invalid name");
3060 return -EINVAL;
3061 }
3062
3063 btf_verifier_log_type(env, t, NULL);
3064
3065 last_offset = 0;
3066 for_each_member(i, t, member) {
3067 if (!btf_name_offset_valid(btf, member->name_off)) {
3068 btf_verifier_log_member(env, t, member,
3069 "Invalid member name_offset:%u",
3070 member->name_off);
3071 return -EINVAL;
3072 }
3073
3074
3075 if (member->name_off &&
3076 !btf_name_valid_identifier(btf, member->name_off)) {
3077 btf_verifier_log_member(env, t, member, "Invalid name");
3078 return -EINVAL;
3079 }
3080
3081 if (!member->type || !BTF_TYPE_ID_VALID(member->type)) {
3082 btf_verifier_log_member(env, t, member,
3083 "Invalid type_id");
3084 return -EINVAL;
3085 }
3086
3087 offset = __btf_member_bit_offset(t, member);
3088 if (is_union && offset) {
3089 btf_verifier_log_member(env, t, member,
3090 "Invalid member bits_offset");
3091 return -EINVAL;
3092 }
3093
3094
3095
3096
3097
3098 if (last_offset > offset) {
3099 btf_verifier_log_member(env, t, member,
3100 "Invalid member bits_offset");
3101 return -EINVAL;
3102 }
3103
3104 if (BITS_ROUNDUP_BYTES(offset) > struct_size) {
3105 btf_verifier_log_member(env, t, member,
3106 "Member bits_offset exceeds its struct size");
3107 return -EINVAL;
3108 }
3109
3110 btf_verifier_log_member(env, t, member, NULL);
3111 last_offset = offset;
3112 }
3113
3114 return meta_needed;
3115 }
3116
3117 static int btf_struct_resolve(struct btf_verifier_env *env,
3118 const struct resolve_vertex *v)
3119 {
3120 const struct btf_member *member;
3121 int err;
3122 u16 i;
3123
3124
3125
3126
3127
3128 if (v->next_member) {
3129 const struct btf_type *last_member_type;
3130 const struct btf_member *last_member;
3131 u16 last_member_type_id;
3132
3133 last_member = btf_type_member(v->t) + v->next_member - 1;
3134 last_member_type_id = last_member->type;
3135 if (WARN_ON_ONCE(!env_type_is_resolved(env,
3136 last_member_type_id)))
3137 return -EINVAL;
3138
3139 last_member_type = btf_type_by_id(env->btf,
3140 last_member_type_id);
3141 if (btf_type_kflag(v->t))
3142 err = btf_type_ops(last_member_type)->check_kflag_member(env, v->t,
3143 last_member,
3144 last_member_type);
3145 else
3146 err = btf_type_ops(last_member_type)->check_member(env, v->t,
3147 last_member,
3148 last_member_type);
3149 if (err)
3150 return err;
3151 }
3152
3153 for_each_member_from(i, v->next_member, v->t, member) {
3154 u32 member_type_id = member->type;
3155 const struct btf_type *member_type = btf_type_by_id(env->btf,
3156 member_type_id);
3157
3158 if (btf_type_nosize_or_null(member_type) ||
3159 btf_type_is_resolve_source_only(member_type)) {
3160 btf_verifier_log_member(env, v->t, member,
3161 "Invalid member");
3162 return -EINVAL;
3163 }
3164
3165 if (!env_type_is_resolve_sink(env, member_type) &&
3166 !env_type_is_resolved(env, member_type_id)) {
3167 env_stack_set_next_member(env, i + 1);
3168 return env_stack_push(env, member_type, member_type_id);
3169 }
3170
3171 if (btf_type_kflag(v->t))
3172 err = btf_type_ops(member_type)->check_kflag_member(env, v->t,
3173 member,
3174 member_type);
3175 else
3176 err = btf_type_ops(member_type)->check_member(env, v->t,
3177 member,
3178 member_type);
3179 if (err)
3180 return err;
3181 }
3182
3183 env_stack_pop_resolved(env, 0, 0);
3184
3185 return 0;
3186 }
3187
3188 static void btf_struct_log(struct btf_verifier_env *env,
3189 const struct btf_type *t)
3190 {
3191 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t));
3192 }
3193
3194 enum btf_field_type {
3195 BTF_FIELD_SPIN_LOCK,
3196 BTF_FIELD_TIMER,
3197 BTF_FIELD_KPTR,
3198 };
3199
3200 enum {
3201 BTF_FIELD_IGNORE = 0,
3202 BTF_FIELD_FOUND = 1,
3203 };
3204
3205 struct btf_field_info {
3206 u32 type_id;
3207 u32 off;
3208 enum bpf_kptr_type type;
3209 };
3210
3211 static int btf_find_struct(const struct btf *btf, const struct btf_type *t,
3212 u32 off, int sz, struct btf_field_info *info)
3213 {
3214 if (!__btf_type_is_struct(t))
3215 return BTF_FIELD_IGNORE;
3216 if (t->size != sz)
3217 return BTF_FIELD_IGNORE;
3218 info->off = off;
3219 return BTF_FIELD_FOUND;
3220 }
3221
3222 static int btf_find_kptr(const struct btf *btf, const struct btf_type *t,
3223 u32 off, int sz, struct btf_field_info *info)
3224 {
3225 enum bpf_kptr_type type;
3226 u32 res_id;
3227
3228
3229 if (!btf_type_is_ptr(t))
3230 return BTF_FIELD_IGNORE;
3231 t = btf_type_by_id(btf, t->type);
3232
3233 if (!btf_type_is_type_tag(t))
3234 return BTF_FIELD_IGNORE;
3235
3236 if (btf_type_is_type_tag(btf_type_by_id(btf, t->type)))
3237 return -EINVAL;
3238 if (!strcmp("kptr", __btf_name_by_offset(btf, t->name_off)))
3239 type = BPF_KPTR_UNREF;
3240 else if (!strcmp("kptr_ref", __btf_name_by_offset(btf, t->name_off)))
3241 type = BPF_KPTR_REF;
3242 else
3243 return -EINVAL;
3244
3245
3246 t = btf_type_skip_modifiers(btf, t->type, &res_id);
3247
3248 if (!__btf_type_is_struct(t))
3249 return -EINVAL;
3250
3251 info->type_id = res_id;
3252 info->off = off;
3253 info->type = type;
3254 return BTF_FIELD_FOUND;
3255 }
3256
3257 static int btf_find_struct_field(const struct btf *btf, const struct btf_type *t,
3258 const char *name, int sz, int align,
3259 enum btf_field_type field_type,
3260 struct btf_field_info *info, int info_cnt)
3261 {
3262 const struct btf_member *member;
3263 struct btf_field_info tmp;
3264 int ret, idx = 0;
3265 u32 i, off;
3266
3267 for_each_member(i, t, member) {
3268 const struct btf_type *member_type = btf_type_by_id(btf,
3269 member->type);
3270
3271 if (name && strcmp(__btf_name_by_offset(btf, member_type->name_off), name))
3272 continue;
3273
3274 off = __btf_member_bit_offset(t, member);
3275 if (off % 8)
3276
3277 return -EINVAL;
3278 off /= 8;
3279 if (off % align)
3280 return -EINVAL;
3281
3282 switch (field_type) {
3283 case BTF_FIELD_SPIN_LOCK:
3284 case BTF_FIELD_TIMER:
3285 ret = btf_find_struct(btf, member_type, off, sz,
3286 idx < info_cnt ? &info[idx] : &tmp);
3287 if (ret < 0)
3288 return ret;
3289 break;
3290 case BTF_FIELD_KPTR:
3291 ret = btf_find_kptr(btf, member_type, off, sz,
3292 idx < info_cnt ? &info[idx] : &tmp);
3293 if (ret < 0)
3294 return ret;
3295 break;
3296 default:
3297 return -EFAULT;
3298 }
3299
3300 if (ret == BTF_FIELD_IGNORE)
3301 continue;
3302 if (idx >= info_cnt)
3303 return -E2BIG;
3304 ++idx;
3305 }
3306 return idx;
3307 }
3308
3309 static int btf_find_datasec_var(const struct btf *btf, const struct btf_type *t,
3310 const char *name, int sz, int align,
3311 enum btf_field_type field_type,
3312 struct btf_field_info *info, int info_cnt)
3313 {
3314 const struct btf_var_secinfo *vsi;
3315 struct btf_field_info tmp;
3316 int ret, idx = 0;
3317 u32 i, off;
3318
3319 for_each_vsi(i, t, vsi) {
3320 const struct btf_type *var = btf_type_by_id(btf, vsi->type);
3321 const struct btf_type *var_type = btf_type_by_id(btf, var->type);
3322
3323 off = vsi->offset;
3324
3325 if (name && strcmp(__btf_name_by_offset(btf, var_type->name_off), name))
3326 continue;
3327 if (vsi->size != sz)
3328 continue;
3329 if (off % align)
3330 return -EINVAL;
3331
3332 switch (field_type) {
3333 case BTF_FIELD_SPIN_LOCK:
3334 case BTF_FIELD_TIMER:
3335 ret = btf_find_struct(btf, var_type, off, sz,
3336 idx < info_cnt ? &info[idx] : &tmp);
3337 if (ret < 0)
3338 return ret;
3339 break;
3340 case BTF_FIELD_KPTR:
3341 ret = btf_find_kptr(btf, var_type, off, sz,
3342 idx < info_cnt ? &info[idx] : &tmp);
3343 if (ret < 0)
3344 return ret;
3345 break;
3346 default:
3347 return -EFAULT;
3348 }
3349
3350 if (ret == BTF_FIELD_IGNORE)
3351 continue;
3352 if (idx >= info_cnt)
3353 return -E2BIG;
3354 ++idx;
3355 }
3356 return idx;
3357 }
3358
3359 static int btf_find_field(const struct btf *btf, const struct btf_type *t,
3360 enum btf_field_type field_type,
3361 struct btf_field_info *info, int info_cnt)
3362 {
3363 const char *name;
3364 int sz, align;
3365
3366 switch (field_type) {
3367 case BTF_FIELD_SPIN_LOCK:
3368 name = "bpf_spin_lock";
3369 sz = sizeof(struct bpf_spin_lock);
3370 align = __alignof__(struct bpf_spin_lock);
3371 break;
3372 case BTF_FIELD_TIMER:
3373 name = "bpf_timer";
3374 sz = sizeof(struct bpf_timer);
3375 align = __alignof__(struct bpf_timer);
3376 break;
3377 case BTF_FIELD_KPTR:
3378 name = NULL;
3379 sz = sizeof(u64);
3380 align = 8;
3381 break;
3382 default:
3383 return -EFAULT;
3384 }
3385
3386 if (__btf_type_is_struct(t))
3387 return btf_find_struct_field(btf, t, name, sz, align, field_type, info, info_cnt);
3388 else if (btf_type_is_datasec(t))
3389 return btf_find_datasec_var(btf, t, name, sz, align, field_type, info, info_cnt);
3390 return -EINVAL;
3391 }
3392
3393
3394
3395
3396
3397 int btf_find_spin_lock(const struct btf *btf, const struct btf_type *t)
3398 {
3399 struct btf_field_info info;
3400 int ret;
3401
3402 ret = btf_find_field(btf, t, BTF_FIELD_SPIN_LOCK, &info, 1);
3403 if (ret < 0)
3404 return ret;
3405 if (!ret)
3406 return -ENOENT;
3407 return info.off;
3408 }
3409
3410 int btf_find_timer(const struct btf *btf, const struct btf_type *t)
3411 {
3412 struct btf_field_info info;
3413 int ret;
3414
3415 ret = btf_find_field(btf, t, BTF_FIELD_TIMER, &info, 1);
3416 if (ret < 0)
3417 return ret;
3418 if (!ret)
3419 return -ENOENT;
3420 return info.off;
3421 }
3422
3423 struct bpf_map_value_off *btf_parse_kptrs(const struct btf *btf,
3424 const struct btf_type *t)
3425 {
3426 struct btf_field_info info_arr[BPF_MAP_VALUE_OFF_MAX];
3427 struct bpf_map_value_off *tab;
3428 struct btf *kernel_btf = NULL;
3429 struct module *mod = NULL;
3430 int ret, i, nr_off;
3431
3432 ret = btf_find_field(btf, t, BTF_FIELD_KPTR, info_arr, ARRAY_SIZE(info_arr));
3433 if (ret < 0)
3434 return ERR_PTR(ret);
3435 if (!ret)
3436 return NULL;
3437
3438 nr_off = ret;
3439 tab = kzalloc(offsetof(struct bpf_map_value_off, off[nr_off]), GFP_KERNEL | __GFP_NOWARN);
3440 if (!tab)
3441 return ERR_PTR(-ENOMEM);
3442
3443 for (i = 0; i < nr_off; i++) {
3444 const struct btf_type *t;
3445 s32 id;
3446
3447
3448
3449
3450 t = btf_type_by_id(btf, info_arr[i].type_id);
3451 id = bpf_find_btf_id(__btf_name_by_offset(btf, t->name_off), BTF_INFO_KIND(t->info),
3452 &kernel_btf);
3453 if (id < 0) {
3454 ret = id;
3455 goto end;
3456 }
3457
3458
3459
3460
3461 if (info_arr[i].type == BPF_KPTR_REF) {
3462 const struct btf_type *dtor_func;
3463 const char *dtor_func_name;
3464 unsigned long addr;
3465 s32 dtor_btf_id;
3466
3467
3468
3469
3470
3471 dtor_btf_id = btf_find_dtor_kfunc(kernel_btf, id);
3472 if (dtor_btf_id < 0) {
3473 ret = dtor_btf_id;
3474 goto end_btf;
3475 }
3476
3477 dtor_func = btf_type_by_id(kernel_btf, dtor_btf_id);
3478 if (!dtor_func) {
3479 ret = -ENOENT;
3480 goto end_btf;
3481 }
3482
3483 if (btf_is_module(kernel_btf)) {
3484 mod = btf_try_get_module(kernel_btf);
3485 if (!mod) {
3486 ret = -ENXIO;
3487 goto end_btf;
3488 }
3489 }
3490
3491
3492
3493
3494 dtor_func_name = __btf_name_by_offset(kernel_btf, dtor_func->name_off);
3495 addr = kallsyms_lookup_name(dtor_func_name);
3496 if (!addr) {
3497 ret = -EINVAL;
3498 goto end_mod;
3499 }
3500 tab->off[i].kptr.dtor = (void *)addr;
3501 }
3502
3503 tab->off[i].offset = info_arr[i].off;
3504 tab->off[i].type = info_arr[i].type;
3505 tab->off[i].kptr.btf_id = id;
3506 tab->off[i].kptr.btf = kernel_btf;
3507 tab->off[i].kptr.module = mod;
3508 }
3509 tab->nr_off = nr_off;
3510 return tab;
3511 end_mod:
3512 module_put(mod);
3513 end_btf:
3514 btf_put(kernel_btf);
3515 end:
3516 while (i--) {
3517 btf_put(tab->off[i].kptr.btf);
3518 if (tab->off[i].kptr.module)
3519 module_put(tab->off[i].kptr.module);
3520 }
3521 kfree(tab);
3522 return ERR_PTR(ret);
3523 }
3524
3525 static void __btf_struct_show(const struct btf *btf, const struct btf_type *t,
3526 u32 type_id, void *data, u8 bits_offset,
3527 struct btf_show *show)
3528 {
3529 const struct btf_member *member;
3530 void *safe_data;
3531 u32 i;
3532
3533 safe_data = btf_show_start_struct_type(show, t, type_id, data);
3534 if (!safe_data)
3535 return;
3536
3537 for_each_member(i, t, member) {
3538 const struct btf_type *member_type = btf_type_by_id(btf,
3539 member->type);
3540 const struct btf_kind_operations *ops;
3541 u32 member_offset, bitfield_size;
3542 u32 bytes_offset;
3543 u8 bits8_offset;
3544
3545 btf_show_start_member(show, member);
3546
3547 member_offset = __btf_member_bit_offset(t, member);
3548 bitfield_size = __btf_member_bitfield_size(t, member);
3549 bytes_offset = BITS_ROUNDDOWN_BYTES(member_offset);
3550 bits8_offset = BITS_PER_BYTE_MASKED(member_offset);
3551 if (bitfield_size) {
3552 safe_data = btf_show_start_type(show, member_type,
3553 member->type,
3554 data + bytes_offset);
3555 if (safe_data)
3556 btf_bitfield_show(safe_data,
3557 bits8_offset,
3558 bitfield_size, show);
3559 btf_show_end_type(show);
3560 } else {
3561 ops = btf_type_ops(member_type);
3562 ops->show(btf, member_type, member->type,
3563 data + bytes_offset, bits8_offset, show);
3564 }
3565
3566 btf_show_end_member(show);
3567 }
3568
3569 btf_show_end_struct_type(show);
3570 }
3571
3572 static void btf_struct_show(const struct btf *btf, const struct btf_type *t,
3573 u32 type_id, void *data, u8 bits_offset,
3574 struct btf_show *show)
3575 {
3576 const struct btf_member *m = show->state.member;
3577
3578
3579
3580
3581
3582
3583 if (show->state.depth > 0 && !(show->flags & BTF_SHOW_ZERO)) {
3584 if (!show->state.depth_check) {
3585 show->state.depth_check = show->state.depth + 1;
3586 show->state.depth_to_show = 0;
3587 }
3588 __btf_struct_show(btf, t, type_id, data, bits_offset, show);
3589
3590 show->state.member = m;
3591 if (show->state.depth_check != show->state.depth + 1)
3592 return;
3593 show->state.depth_check = 0;
3594
3595 if (show->state.depth_to_show <= show->state.depth)
3596 return;
3597
3598
3599
3600
3601 }
3602
3603 __btf_struct_show(btf, t, type_id, data, bits_offset, show);
3604 }
3605
3606 static struct btf_kind_operations struct_ops = {
3607 .check_meta = btf_struct_check_meta,
3608 .resolve = btf_struct_resolve,
3609 .check_member = btf_struct_check_member,
3610 .check_kflag_member = btf_generic_check_kflag_member,
3611 .log_details = btf_struct_log,
3612 .show = btf_struct_show,
3613 };
3614
3615 static int btf_enum_check_member(struct btf_verifier_env *env,
3616 const struct btf_type *struct_type,
3617 const struct btf_member *member,
3618 const struct btf_type *member_type)
3619 {
3620 u32 struct_bits_off = member->offset;
3621 u32 struct_size, bytes_offset;
3622
3623 if (BITS_PER_BYTE_MASKED(struct_bits_off)) {
3624 btf_verifier_log_member(env, struct_type, member,
3625 "Member is not byte aligned");
3626 return -EINVAL;
3627 }
3628
3629 struct_size = struct_type->size;
3630 bytes_offset = BITS_ROUNDDOWN_BYTES(struct_bits_off);
3631 if (struct_size - bytes_offset < member_type->size) {
3632 btf_verifier_log_member(env, struct_type, member,
3633 "Member exceeds struct_size");
3634 return -EINVAL;
3635 }
3636
3637 return 0;
3638 }
3639
3640 static int btf_enum_check_kflag_member(struct btf_verifier_env *env,
3641 const struct btf_type *struct_type,
3642 const struct btf_member *member,
3643 const struct btf_type *member_type)
3644 {
3645 u32 struct_bits_off, nr_bits, bytes_end, struct_size;
3646 u32 int_bitsize = sizeof(int) * BITS_PER_BYTE;
3647
3648 struct_bits_off = BTF_MEMBER_BIT_OFFSET(member->offset);
3649 nr_bits = BTF_MEMBER_BITFIELD_SIZE(member->offset);
3650 if (!nr_bits) {
3651 if (BITS_PER_BYTE_MASKED(struct_bits_off)) {
3652 btf_verifier_log_member(env, struct_type, member,
3653 "Member is not byte aligned");
3654 return -EINVAL;
3655 }
3656
3657 nr_bits = int_bitsize;
3658 } else if (nr_bits > int_bitsize) {
3659 btf_verifier_log_member(env, struct_type, member,
3660 "Invalid member bitfield_size");
3661 return -EINVAL;
3662 }
3663
3664 struct_size = struct_type->size;
3665 bytes_end = BITS_ROUNDUP_BYTES(struct_bits_off + nr_bits);
3666 if (struct_size < bytes_end) {
3667 btf_verifier_log_member(env, struct_type, member,
3668 "Member exceeds struct_size");
3669 return -EINVAL;
3670 }
3671
3672 return 0;
3673 }
3674
3675 static s32 btf_enum_check_meta(struct btf_verifier_env *env,
3676 const struct btf_type *t,
3677 u32 meta_left)
3678 {
3679 const struct btf_enum *enums = btf_type_enum(t);
3680 struct btf *btf = env->btf;
3681 const char *fmt_str;
3682 u16 i, nr_enums;
3683 u32 meta_needed;
3684
3685 nr_enums = btf_type_vlen(t);
3686 meta_needed = nr_enums * sizeof(*enums);
3687
3688 if (meta_left < meta_needed) {
3689 btf_verifier_log_basic(env, t,
3690 "meta_left:%u meta_needed:%u",
3691 meta_left, meta_needed);
3692 return -EINVAL;
3693 }
3694
3695 if (t->size > 8 || !is_power_of_2(t->size)) {
3696 btf_verifier_log_type(env, t, "Unexpected size");
3697 return -EINVAL;
3698 }
3699
3700
3701 if (t->name_off &&
3702 !btf_name_valid_identifier(env->btf, t->name_off)) {
3703 btf_verifier_log_type(env, t, "Invalid name");
3704 return -EINVAL;
3705 }
3706
3707 btf_verifier_log_type(env, t, NULL);
3708
3709 for (i = 0; i < nr_enums; i++) {
3710 if (!btf_name_offset_valid(btf, enums[i].name_off)) {
3711 btf_verifier_log(env, "\tInvalid name_offset:%u",
3712 enums[i].name_off);
3713 return -EINVAL;
3714 }
3715
3716
3717 if (!enums[i].name_off ||
3718 !btf_name_valid_identifier(btf, enums[i].name_off)) {
3719 btf_verifier_log_type(env, t, "Invalid name");
3720 return -EINVAL;
3721 }
3722
3723 if (env->log.level == BPF_LOG_KERNEL)
3724 continue;
3725 fmt_str = btf_type_kflag(t) ? "\t%s val=%d\n" : "\t%s val=%u\n";
3726 btf_verifier_log(env, fmt_str,
3727 __btf_name_by_offset(btf, enums[i].name_off),
3728 enums[i].val);
3729 }
3730
3731 return meta_needed;
3732 }
3733
3734 static void btf_enum_log(struct btf_verifier_env *env,
3735 const struct btf_type *t)
3736 {
3737 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t));
3738 }
3739
3740 static void btf_enum_show(const struct btf *btf, const struct btf_type *t,
3741 u32 type_id, void *data, u8 bits_offset,
3742 struct btf_show *show)
3743 {
3744 const struct btf_enum *enums = btf_type_enum(t);
3745 u32 i, nr_enums = btf_type_vlen(t);
3746 void *safe_data;
3747 int v;
3748
3749 safe_data = btf_show_start_type(show, t, type_id, data);
3750 if (!safe_data)
3751 return;
3752
3753 v = *(int *)safe_data;
3754
3755 for (i = 0; i < nr_enums; i++) {
3756 if (v != enums[i].val)
3757 continue;
3758
3759 btf_show_type_value(show, "%s",
3760 __btf_name_by_offset(btf,
3761 enums[i].name_off));
3762
3763 btf_show_end_type(show);
3764 return;
3765 }
3766
3767 if (btf_type_kflag(t))
3768 btf_show_type_value(show, "%d", v);
3769 else
3770 btf_show_type_value(show, "%u", v);
3771 btf_show_end_type(show);
3772 }
3773
3774 static struct btf_kind_operations enum_ops = {
3775 .check_meta = btf_enum_check_meta,
3776 .resolve = btf_df_resolve,
3777 .check_member = btf_enum_check_member,
3778 .check_kflag_member = btf_enum_check_kflag_member,
3779 .log_details = btf_enum_log,
3780 .show = btf_enum_show,
3781 };
3782
3783 static s32 btf_enum64_check_meta(struct btf_verifier_env *env,
3784 const struct btf_type *t,
3785 u32 meta_left)
3786 {
3787 const struct btf_enum64 *enums = btf_type_enum64(t);
3788 struct btf *btf = env->btf;
3789 const char *fmt_str;
3790 u16 i, nr_enums;
3791 u32 meta_needed;
3792
3793 nr_enums = btf_type_vlen(t);
3794 meta_needed = nr_enums * sizeof(*enums);
3795
3796 if (meta_left < meta_needed) {
3797 btf_verifier_log_basic(env, t,
3798 "meta_left:%u meta_needed:%u",
3799 meta_left, meta_needed);
3800 return -EINVAL;
3801 }
3802
3803 if (t->size > 8 || !is_power_of_2(t->size)) {
3804 btf_verifier_log_type(env, t, "Unexpected size");
3805 return -EINVAL;
3806 }
3807
3808
3809 if (t->name_off &&
3810 !btf_name_valid_identifier(env->btf, t->name_off)) {
3811 btf_verifier_log_type(env, t, "Invalid name");
3812 return -EINVAL;
3813 }
3814
3815 btf_verifier_log_type(env, t, NULL);
3816
3817 for (i = 0; i < nr_enums; i++) {
3818 if (!btf_name_offset_valid(btf, enums[i].name_off)) {
3819 btf_verifier_log(env, "\tInvalid name_offset:%u",
3820 enums[i].name_off);
3821 return -EINVAL;
3822 }
3823
3824
3825 if (!enums[i].name_off ||
3826 !btf_name_valid_identifier(btf, enums[i].name_off)) {
3827 btf_verifier_log_type(env, t, "Invalid name");
3828 return -EINVAL;
3829 }
3830
3831 if (env->log.level == BPF_LOG_KERNEL)
3832 continue;
3833
3834 fmt_str = btf_type_kflag(t) ? "\t%s val=%lld\n" : "\t%s val=%llu\n";
3835 btf_verifier_log(env, fmt_str,
3836 __btf_name_by_offset(btf, enums[i].name_off),
3837 btf_enum64_value(enums + i));
3838 }
3839
3840 return meta_needed;
3841 }
3842
3843 static void btf_enum64_show(const struct btf *btf, const struct btf_type *t,
3844 u32 type_id, void *data, u8 bits_offset,
3845 struct btf_show *show)
3846 {
3847 const struct btf_enum64 *enums = btf_type_enum64(t);
3848 u32 i, nr_enums = btf_type_vlen(t);
3849 void *safe_data;
3850 s64 v;
3851
3852 safe_data = btf_show_start_type(show, t, type_id, data);
3853 if (!safe_data)
3854 return;
3855
3856 v = *(u64 *)safe_data;
3857
3858 for (i = 0; i < nr_enums; i++) {
3859 if (v != btf_enum64_value(enums + i))
3860 continue;
3861
3862 btf_show_type_value(show, "%s",
3863 __btf_name_by_offset(btf,
3864 enums[i].name_off));
3865
3866 btf_show_end_type(show);
3867 return;
3868 }
3869
3870 if (btf_type_kflag(t))
3871 btf_show_type_value(show, "%lld", v);
3872 else
3873 btf_show_type_value(show, "%llu", v);
3874 btf_show_end_type(show);
3875 }
3876
3877 static struct btf_kind_operations enum64_ops = {
3878 .check_meta = btf_enum64_check_meta,
3879 .resolve = btf_df_resolve,
3880 .check_member = btf_enum_check_member,
3881 .check_kflag_member = btf_enum_check_kflag_member,
3882 .log_details = btf_enum_log,
3883 .show = btf_enum64_show,
3884 };
3885
3886 static s32 btf_func_proto_check_meta(struct btf_verifier_env *env,
3887 const struct btf_type *t,
3888 u32 meta_left)
3889 {
3890 u32 meta_needed = btf_type_vlen(t) * sizeof(struct btf_param);
3891
3892 if (meta_left < meta_needed) {
3893 btf_verifier_log_basic(env, t,
3894 "meta_left:%u meta_needed:%u",
3895 meta_left, meta_needed);
3896 return -EINVAL;
3897 }
3898
3899 if (t->name_off) {
3900 btf_verifier_log_type(env, t, "Invalid name");
3901 return -EINVAL;
3902 }
3903
3904 if (btf_type_kflag(t)) {
3905 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag");
3906 return -EINVAL;
3907 }
3908
3909 btf_verifier_log_type(env, t, NULL);
3910
3911 return meta_needed;
3912 }
3913
3914 static void btf_func_proto_log(struct btf_verifier_env *env,
3915 const struct btf_type *t)
3916 {
3917 const struct btf_param *args = (const struct btf_param *)(t + 1);
3918 u16 nr_args = btf_type_vlen(t), i;
3919
3920 btf_verifier_log(env, "return=%u args=(", t->type);
3921 if (!nr_args) {
3922 btf_verifier_log(env, "void");
3923 goto done;
3924 }
3925
3926 if (nr_args == 1 && !args[0].type) {
3927
3928 btf_verifier_log(env, "vararg");
3929 goto done;
3930 }
3931
3932 btf_verifier_log(env, "%u %s", args[0].type,
3933 __btf_name_by_offset(env->btf,
3934 args[0].name_off));
3935 for (i = 1; i < nr_args - 1; i++)
3936 btf_verifier_log(env, ", %u %s", args[i].type,
3937 __btf_name_by_offset(env->btf,
3938 args[i].name_off));
3939
3940 if (nr_args > 1) {
3941 const struct btf_param *last_arg = &args[nr_args - 1];
3942
3943 if (last_arg->type)
3944 btf_verifier_log(env, ", %u %s", last_arg->type,
3945 __btf_name_by_offset(env->btf,
3946 last_arg->name_off));
3947 else
3948 btf_verifier_log(env, ", vararg");
3949 }
3950
3951 done:
3952 btf_verifier_log(env, ")");
3953 }
3954
3955 static struct btf_kind_operations func_proto_ops = {
3956 .check_meta = btf_func_proto_check_meta,
3957 .resolve = btf_df_resolve,
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967 .check_member = btf_df_check_member,
3968 .check_kflag_member = btf_df_check_kflag_member,
3969 .log_details = btf_func_proto_log,
3970 .show = btf_df_show,
3971 };
3972
3973 static s32 btf_func_check_meta(struct btf_verifier_env *env,
3974 const struct btf_type *t,
3975 u32 meta_left)
3976 {
3977 if (!t->name_off ||
3978 !btf_name_valid_identifier(env->btf, t->name_off)) {
3979 btf_verifier_log_type(env, t, "Invalid name");
3980 return -EINVAL;
3981 }
3982
3983 if (btf_type_vlen(t) > BTF_FUNC_GLOBAL) {
3984 btf_verifier_log_type(env, t, "Invalid func linkage");
3985 return -EINVAL;
3986 }
3987
3988 if (btf_type_kflag(t)) {
3989 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag");
3990 return -EINVAL;
3991 }
3992
3993 btf_verifier_log_type(env, t, NULL);
3994
3995 return 0;
3996 }
3997
3998 static int btf_func_resolve(struct btf_verifier_env *env,
3999 const struct resolve_vertex *v)
4000 {
4001 const struct btf_type *t = v->t;
4002 u32 next_type_id = t->type;
4003 int err;
4004
4005 err = btf_func_check(env, t);
4006 if (err)
4007 return err;
4008
4009 env_stack_pop_resolved(env, next_type_id, 0);
4010 return 0;
4011 }
4012
4013 static struct btf_kind_operations func_ops = {
4014 .check_meta = btf_func_check_meta,
4015 .resolve = btf_func_resolve,
4016 .check_member = btf_df_check_member,
4017 .check_kflag_member = btf_df_check_kflag_member,
4018 .log_details = btf_ref_type_log,
4019 .show = btf_df_show,
4020 };
4021
4022 static s32 btf_var_check_meta(struct btf_verifier_env *env,
4023 const struct btf_type *t,
4024 u32 meta_left)
4025 {
4026 const struct btf_var *var;
4027 u32 meta_needed = sizeof(*var);
4028
4029 if (meta_left < meta_needed) {
4030 btf_verifier_log_basic(env, t,
4031 "meta_left:%u meta_needed:%u",
4032 meta_left, meta_needed);
4033 return -EINVAL;
4034 }
4035
4036 if (btf_type_vlen(t)) {
4037 btf_verifier_log_type(env, t, "vlen != 0");
4038 return -EINVAL;
4039 }
4040
4041 if (btf_type_kflag(t)) {
4042 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag");
4043 return -EINVAL;
4044 }
4045
4046 if (!t->name_off ||
4047 !__btf_name_valid(env->btf, t->name_off, true)) {
4048 btf_verifier_log_type(env, t, "Invalid name");
4049 return -EINVAL;
4050 }
4051
4052
4053 if (!t->type || !BTF_TYPE_ID_VALID(t->type)) {
4054 btf_verifier_log_type(env, t, "Invalid type_id");
4055 return -EINVAL;
4056 }
4057
4058 var = btf_type_var(t);
4059 if (var->linkage != BTF_VAR_STATIC &&
4060 var->linkage != BTF_VAR_GLOBAL_ALLOCATED) {
4061 btf_verifier_log_type(env, t, "Linkage not supported");
4062 return -EINVAL;
4063 }
4064
4065 btf_verifier_log_type(env, t, NULL);
4066
4067 return meta_needed;
4068 }
4069
4070 static void btf_var_log(struct btf_verifier_env *env, const struct btf_type *t)
4071 {
4072 const struct btf_var *var = btf_type_var(t);
4073
4074 btf_verifier_log(env, "type_id=%u linkage=%u", t->type, var->linkage);
4075 }
4076
4077 static const struct btf_kind_operations var_ops = {
4078 .check_meta = btf_var_check_meta,
4079 .resolve = btf_var_resolve,
4080 .check_member = btf_df_check_member,
4081 .check_kflag_member = btf_df_check_kflag_member,
4082 .log_details = btf_var_log,
4083 .show = btf_var_show,
4084 };
4085
4086 static s32 btf_datasec_check_meta(struct btf_verifier_env *env,
4087 const struct btf_type *t,
4088 u32 meta_left)
4089 {
4090 const struct btf_var_secinfo *vsi;
4091 u64 last_vsi_end_off = 0, sum = 0;
4092 u32 i, meta_needed;
4093
4094 meta_needed = btf_type_vlen(t) * sizeof(*vsi);
4095 if (meta_left < meta_needed) {
4096 btf_verifier_log_basic(env, t,
4097 "meta_left:%u meta_needed:%u",
4098 meta_left, meta_needed);
4099 return -EINVAL;
4100 }
4101
4102 if (!t->size) {
4103 btf_verifier_log_type(env, t, "size == 0");
4104 return -EINVAL;
4105 }
4106
4107 if (btf_type_kflag(t)) {
4108 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag");
4109 return -EINVAL;
4110 }
4111
4112 if (!t->name_off ||
4113 !btf_name_valid_section(env->btf, t->name_off)) {
4114 btf_verifier_log_type(env, t, "Invalid name");
4115 return -EINVAL;
4116 }
4117
4118 btf_verifier_log_type(env, t, NULL);
4119
4120 for_each_vsi(i, t, vsi) {
4121
4122 if (!vsi->type || !BTF_TYPE_ID_VALID(vsi->type)) {
4123 btf_verifier_log_vsi(env, t, vsi,
4124 "Invalid type_id");
4125 return -EINVAL;
4126 }
4127
4128 if (vsi->offset < last_vsi_end_off || vsi->offset >= t->size) {
4129 btf_verifier_log_vsi(env, t, vsi,
4130 "Invalid offset");
4131 return -EINVAL;
4132 }
4133
4134 if (!vsi->size || vsi->size > t->size) {
4135 btf_verifier_log_vsi(env, t, vsi,
4136 "Invalid size");
4137 return -EINVAL;
4138 }
4139
4140 last_vsi_end_off = vsi->offset + vsi->size;
4141 if (last_vsi_end_off > t->size) {
4142 btf_verifier_log_vsi(env, t, vsi,
4143 "Invalid offset+size");
4144 return -EINVAL;
4145 }
4146
4147 btf_verifier_log_vsi(env, t, vsi, NULL);
4148 sum += vsi->size;
4149 }
4150
4151 if (t->size < sum) {
4152 btf_verifier_log_type(env, t, "Invalid btf_info size");
4153 return -EINVAL;
4154 }
4155
4156 return meta_needed;
4157 }
4158
4159 static int btf_datasec_resolve(struct btf_verifier_env *env,
4160 const struct resolve_vertex *v)
4161 {
4162 const struct btf_var_secinfo *vsi;
4163 struct btf *btf = env->btf;
4164 u16 i;
4165
4166 for_each_vsi_from(i, v->next_member, v->t, vsi) {
4167 u32 var_type_id = vsi->type, type_id, type_size = 0;
4168 const struct btf_type *var_type = btf_type_by_id(env->btf,
4169 var_type_id);
4170 if (!var_type || !btf_type_is_var(var_type)) {
4171 btf_verifier_log_vsi(env, v->t, vsi,
4172 "Not a VAR kind member");
4173 return -EINVAL;
4174 }
4175
4176 if (!env_type_is_resolve_sink(env, var_type) &&
4177 !env_type_is_resolved(env, var_type_id)) {
4178 env_stack_set_next_member(env, i + 1);
4179 return env_stack_push(env, var_type, var_type_id);
4180 }
4181
4182 type_id = var_type->type;
4183 if (!btf_type_id_size(btf, &type_id, &type_size)) {
4184 btf_verifier_log_vsi(env, v->t, vsi, "Invalid type");
4185 return -EINVAL;
4186 }
4187
4188 if (vsi->size < type_size) {
4189 btf_verifier_log_vsi(env, v->t, vsi, "Invalid size");
4190 return -EINVAL;
4191 }
4192 }
4193
4194 env_stack_pop_resolved(env, 0, 0);
4195 return 0;
4196 }
4197
4198 static void btf_datasec_log(struct btf_verifier_env *env,
4199 const struct btf_type *t)
4200 {
4201 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t));
4202 }
4203
4204 static void btf_datasec_show(const struct btf *btf,
4205 const struct btf_type *t, u32 type_id,
4206 void *data, u8 bits_offset,
4207 struct btf_show *show)
4208 {
4209 const struct btf_var_secinfo *vsi;
4210 const struct btf_type *var;
4211 u32 i;
4212
4213 if (!btf_show_start_type(show, t, type_id, data))
4214 return;
4215
4216 btf_show_type_value(show, "section (\"%s\") = {",
4217 __btf_name_by_offset(btf, t->name_off));
4218 for_each_vsi(i, t, vsi) {
4219 var = btf_type_by_id(btf, vsi->type);
4220 if (i)
4221 btf_show(show, ",");
4222 btf_type_ops(var)->show(btf, var, vsi->type,
4223 data + vsi->offset, bits_offset, show);
4224 }
4225 btf_show_end_type(show);
4226 }
4227
4228 static const struct btf_kind_operations datasec_ops = {
4229 .check_meta = btf_datasec_check_meta,
4230 .resolve = btf_datasec_resolve,
4231 .check_member = btf_df_check_member,
4232 .check_kflag_member = btf_df_check_kflag_member,
4233 .log_details = btf_datasec_log,
4234 .show = btf_datasec_show,
4235 };
4236
4237 static s32 btf_float_check_meta(struct btf_verifier_env *env,
4238 const struct btf_type *t,
4239 u32 meta_left)
4240 {
4241 if (btf_type_vlen(t)) {
4242 btf_verifier_log_type(env, t, "vlen != 0");
4243 return -EINVAL;
4244 }
4245
4246 if (btf_type_kflag(t)) {
4247 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag");
4248 return -EINVAL;
4249 }
4250
4251 if (t->size != 2 && t->size != 4 && t->size != 8 && t->size != 12 &&
4252 t->size != 16) {
4253 btf_verifier_log_type(env, t, "Invalid type_size");
4254 return -EINVAL;
4255 }
4256
4257 btf_verifier_log_type(env, t, NULL);
4258
4259 return 0;
4260 }
4261
4262 static int btf_float_check_member(struct btf_verifier_env *env,
4263 const struct btf_type *struct_type,
4264 const struct btf_member *member,
4265 const struct btf_type *member_type)
4266 {
4267 u64 start_offset_bytes;
4268 u64 end_offset_bytes;
4269 u64 misalign_bits;
4270 u64 align_bytes;
4271 u64 align_bits;
4272
4273
4274
4275
4276
4277 align_bytes = min_t(u64, sizeof(void *), member_type->size);
4278 align_bits = align_bytes * BITS_PER_BYTE;
4279 div64_u64_rem(member->offset, align_bits, &misalign_bits);
4280 if (misalign_bits) {
4281 btf_verifier_log_member(env, struct_type, member,
4282 "Member is not properly aligned");
4283 return -EINVAL;
4284 }
4285
4286 start_offset_bytes = member->offset / BITS_PER_BYTE;
4287 end_offset_bytes = start_offset_bytes + member_type->size;
4288 if (end_offset_bytes > struct_type->size) {
4289 btf_verifier_log_member(env, struct_type, member,
4290 "Member exceeds struct_size");
4291 return -EINVAL;
4292 }
4293
4294 return 0;
4295 }
4296
4297 static void btf_float_log(struct btf_verifier_env *env,
4298 const struct btf_type *t)
4299 {
4300 btf_verifier_log(env, "size=%u", t->size);
4301 }
4302
4303 static const struct btf_kind_operations float_ops = {
4304 .check_meta = btf_float_check_meta,
4305 .resolve = btf_df_resolve,
4306 .check_member = btf_float_check_member,
4307 .check_kflag_member = btf_generic_check_kflag_member,
4308 .log_details = btf_float_log,
4309 .show = btf_df_show,
4310 };
4311
4312 static s32 btf_decl_tag_check_meta(struct btf_verifier_env *env,
4313 const struct btf_type *t,
4314 u32 meta_left)
4315 {
4316 const struct btf_decl_tag *tag;
4317 u32 meta_needed = sizeof(*tag);
4318 s32 component_idx;
4319 const char *value;
4320
4321 if (meta_left < meta_needed) {
4322 btf_verifier_log_basic(env, t,
4323 "meta_left:%u meta_needed:%u",
4324 meta_left, meta_needed);
4325 return -EINVAL;
4326 }
4327
4328 value = btf_name_by_offset(env->btf, t->name_off);
4329 if (!value || !value[0]) {
4330 btf_verifier_log_type(env, t, "Invalid value");
4331 return -EINVAL;
4332 }
4333
4334 if (btf_type_vlen(t)) {
4335 btf_verifier_log_type(env, t, "vlen != 0");
4336 return -EINVAL;
4337 }
4338
4339 if (btf_type_kflag(t)) {
4340 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag");
4341 return -EINVAL;
4342 }
4343
4344 component_idx = btf_type_decl_tag(t)->component_idx;
4345 if (component_idx < -1) {
4346 btf_verifier_log_type(env, t, "Invalid component_idx");
4347 return -EINVAL;
4348 }
4349
4350 btf_verifier_log_type(env, t, NULL);
4351
4352 return meta_needed;
4353 }
4354
4355 static int btf_decl_tag_resolve(struct btf_verifier_env *env,
4356 const struct resolve_vertex *v)
4357 {
4358 const struct btf_type *next_type;
4359 const struct btf_type *t = v->t;
4360 u32 next_type_id = t->type;
4361 struct btf *btf = env->btf;
4362 s32 component_idx;
4363 u32 vlen;
4364
4365 next_type = btf_type_by_id(btf, next_type_id);
4366 if (!next_type || !btf_type_is_decl_tag_target(next_type)) {
4367 btf_verifier_log_type(env, v->t, "Invalid type_id");
4368 return -EINVAL;
4369 }
4370
4371 if (!env_type_is_resolve_sink(env, next_type) &&
4372 !env_type_is_resolved(env, next_type_id))
4373 return env_stack_push(env, next_type, next_type_id);
4374
4375 component_idx = btf_type_decl_tag(t)->component_idx;
4376 if (component_idx != -1) {
4377 if (btf_type_is_var(next_type) || btf_type_is_typedef(next_type)) {
4378 btf_verifier_log_type(env, v->t, "Invalid component_idx");
4379 return -EINVAL;
4380 }
4381
4382 if (btf_type_is_struct(next_type)) {
4383 vlen = btf_type_vlen(next_type);
4384 } else {
4385
4386 next_type = btf_type_by_id(btf, next_type->type);
4387 vlen = btf_type_vlen(next_type);
4388 }
4389
4390 if ((u32)component_idx >= vlen) {
4391 btf_verifier_log_type(env, v->t, "Invalid component_idx");
4392 return -EINVAL;
4393 }
4394 }
4395
4396 env_stack_pop_resolved(env, next_type_id, 0);
4397
4398 return 0;
4399 }
4400
4401 static void btf_decl_tag_log(struct btf_verifier_env *env, const struct btf_type *t)
4402 {
4403 btf_verifier_log(env, "type=%u component_idx=%d", t->type,
4404 btf_type_decl_tag(t)->component_idx);
4405 }
4406
4407 static const struct btf_kind_operations decl_tag_ops = {
4408 .check_meta = btf_decl_tag_check_meta,
4409 .resolve = btf_decl_tag_resolve,
4410 .check_member = btf_df_check_member,
4411 .check_kflag_member = btf_df_check_kflag_member,
4412 .log_details = btf_decl_tag_log,
4413 .show = btf_df_show,
4414 };
4415
4416 static int btf_func_proto_check(struct btf_verifier_env *env,
4417 const struct btf_type *t)
4418 {
4419 const struct btf_type *ret_type;
4420 const struct btf_param *args;
4421 const struct btf *btf;
4422 u16 nr_args, i;
4423 int err;
4424
4425 btf = env->btf;
4426 args = (const struct btf_param *)(t + 1);
4427 nr_args = btf_type_vlen(t);
4428
4429
4430 if (t->type) {
4431 u32 ret_type_id = t->type;
4432
4433 ret_type = btf_type_by_id(btf, ret_type_id);
4434 if (!ret_type) {
4435 btf_verifier_log_type(env, t, "Invalid return type");
4436 return -EINVAL;
4437 }
4438
4439 if (btf_type_needs_resolve(ret_type) &&
4440 !env_type_is_resolved(env, ret_type_id)) {
4441 err = btf_resolve(env, ret_type, ret_type_id);
4442 if (err)
4443 return err;
4444 }
4445
4446
4447 if (!btf_type_id_size(btf, &ret_type_id, NULL)) {
4448 btf_verifier_log_type(env, t, "Invalid return type");
4449 return -EINVAL;
4450 }
4451 }
4452
4453 if (!nr_args)
4454 return 0;
4455
4456
4457 if (!args[nr_args - 1].type) {
4458 if (args[nr_args - 1].name_off) {
4459 btf_verifier_log_type(env, t, "Invalid arg#%u",
4460 nr_args);
4461 return -EINVAL;
4462 }
4463 nr_args--;
4464 }
4465
4466 err = 0;
4467 for (i = 0; i < nr_args; i++) {
4468 const struct btf_type *arg_type;
4469 u32 arg_type_id;
4470
4471 arg_type_id = args[i].type;
4472 arg_type = btf_type_by_id(btf, arg_type_id);
4473 if (!arg_type) {
4474 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1);
4475 err = -EINVAL;
4476 break;
4477 }
4478
4479 if (args[i].name_off &&
4480 (!btf_name_offset_valid(btf, args[i].name_off) ||
4481 !btf_name_valid_identifier(btf, args[i].name_off))) {
4482 btf_verifier_log_type(env, t,
4483 "Invalid arg#%u", i + 1);
4484 err = -EINVAL;
4485 break;
4486 }
4487
4488 if (btf_type_needs_resolve(arg_type) &&
4489 !env_type_is_resolved(env, arg_type_id)) {
4490 err = btf_resolve(env, arg_type, arg_type_id);
4491 if (err)
4492 break;
4493 }
4494
4495 if (!btf_type_id_size(btf, &arg_type_id, NULL)) {
4496 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1);
4497 err = -EINVAL;
4498 break;
4499 }
4500 }
4501
4502 return err;
4503 }
4504
4505 static int btf_func_check(struct btf_verifier_env *env,
4506 const struct btf_type *t)
4507 {
4508 const struct btf_type *proto_type;
4509 const struct btf_param *args;
4510 const struct btf *btf;
4511 u16 nr_args, i;
4512
4513 btf = env->btf;
4514 proto_type = btf_type_by_id(btf, t->type);
4515
4516 if (!proto_type || !btf_type_is_func_proto(proto_type)) {
4517 btf_verifier_log_type(env, t, "Invalid type_id");
4518 return -EINVAL;
4519 }
4520
4521 args = (const struct btf_param *)(proto_type + 1);
4522 nr_args = btf_type_vlen(proto_type);
4523 for (i = 0; i < nr_args; i++) {
4524 if (!args[i].name_off && args[i].type) {
4525 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1);
4526 return -EINVAL;
4527 }
4528 }
4529
4530 return 0;
4531 }
4532
4533 static const struct btf_kind_operations * const kind_ops[NR_BTF_KINDS] = {
4534 [BTF_KIND_INT] = &int_ops,
4535 [BTF_KIND_PTR] = &ptr_ops,
4536 [BTF_KIND_ARRAY] = &array_ops,
4537 [BTF_KIND_STRUCT] = &struct_ops,
4538 [BTF_KIND_UNION] = &struct_ops,
4539 [BTF_KIND_ENUM] = &enum_ops,
4540 [BTF_KIND_FWD] = &fwd_ops,
4541 [BTF_KIND_TYPEDEF] = &modifier_ops,
4542 [BTF_KIND_VOLATILE] = &modifier_ops,
4543 [BTF_KIND_CONST] = &modifier_ops,
4544 [BTF_KIND_RESTRICT] = &modifier_ops,
4545 [BTF_KIND_FUNC] = &func_ops,
4546 [BTF_KIND_FUNC_PROTO] = &func_proto_ops,
4547 [BTF_KIND_VAR] = &var_ops,
4548 [BTF_KIND_DATASEC] = &datasec_ops,
4549 [BTF_KIND_FLOAT] = &float_ops,
4550 [BTF_KIND_DECL_TAG] = &decl_tag_ops,
4551 [BTF_KIND_TYPE_TAG] = &modifier_ops,
4552 [BTF_KIND_ENUM64] = &enum64_ops,
4553 };
4554
4555 static s32 btf_check_meta(struct btf_verifier_env *env,
4556 const struct btf_type *t,
4557 u32 meta_left)
4558 {
4559 u32 saved_meta_left = meta_left;
4560 s32 var_meta_size;
4561
4562 if (meta_left < sizeof(*t)) {
4563 btf_verifier_log(env, "[%u] meta_left:%u meta_needed:%zu",
4564 env->log_type_id, meta_left, sizeof(*t));
4565 return -EINVAL;
4566 }
4567 meta_left -= sizeof(*t);
4568
4569 if (t->info & ~BTF_INFO_MASK) {
4570 btf_verifier_log(env, "[%u] Invalid btf_info:%x",
4571 env->log_type_id, t->info);
4572 return -EINVAL;
4573 }
4574
4575 if (BTF_INFO_KIND(t->info) > BTF_KIND_MAX ||
4576 BTF_INFO_KIND(t->info) == BTF_KIND_UNKN) {
4577 btf_verifier_log(env, "[%u] Invalid kind:%u",
4578 env->log_type_id, BTF_INFO_KIND(t->info));
4579 return -EINVAL;
4580 }
4581
4582 if (!btf_name_offset_valid(env->btf, t->name_off)) {
4583 btf_verifier_log(env, "[%u] Invalid name_offset:%u",
4584 env->log_type_id, t->name_off);
4585 return -EINVAL;
4586 }
4587
4588 var_meta_size = btf_type_ops(t)->check_meta(env, t, meta_left);
4589 if (var_meta_size < 0)
4590 return var_meta_size;
4591
4592 meta_left -= var_meta_size;
4593
4594 return saved_meta_left - meta_left;
4595 }
4596
4597 static int btf_check_all_metas(struct btf_verifier_env *env)
4598 {
4599 struct btf *btf = env->btf;
4600 struct btf_header *hdr;
4601 void *cur, *end;
4602
4603 hdr = &btf->hdr;
4604 cur = btf->nohdr_data + hdr->type_off;
4605 end = cur + hdr->type_len;
4606
4607 env->log_type_id = btf->base_btf ? btf->start_id : 1;
4608 while (cur < end) {
4609 struct btf_type *t = cur;
4610 s32 meta_size;
4611
4612 meta_size = btf_check_meta(env, t, end - cur);
4613 if (meta_size < 0)
4614 return meta_size;
4615
4616 btf_add_type(env, t);
4617 cur += meta_size;
4618 env->log_type_id++;
4619 }
4620
4621 return 0;
4622 }
4623
4624 static bool btf_resolve_valid(struct btf_verifier_env *env,
4625 const struct btf_type *t,
4626 u32 type_id)
4627 {
4628 struct btf *btf = env->btf;
4629
4630 if (!env_type_is_resolved(env, type_id))
4631 return false;
4632
4633 if (btf_type_is_struct(t) || btf_type_is_datasec(t))
4634 return !btf_resolved_type_id(btf, type_id) &&
4635 !btf_resolved_type_size(btf, type_id);
4636
4637 if (btf_type_is_decl_tag(t) || btf_type_is_func(t))
4638 return btf_resolved_type_id(btf, type_id) &&
4639 !btf_resolved_type_size(btf, type_id);
4640
4641 if (btf_type_is_modifier(t) || btf_type_is_ptr(t) ||
4642 btf_type_is_var(t)) {
4643 t = btf_type_id_resolve(btf, &type_id);
4644 return t &&
4645 !btf_type_is_modifier(t) &&
4646 !btf_type_is_var(t) &&
4647 !btf_type_is_datasec(t);
4648 }
4649
4650 if (btf_type_is_array(t)) {
4651 const struct btf_array *array = btf_type_array(t);
4652 const struct btf_type *elem_type;
4653 u32 elem_type_id = array->type;
4654 u32 elem_size;
4655
4656 elem_type = btf_type_id_size(btf, &elem_type_id, &elem_size);
4657 return elem_type && !btf_type_is_modifier(elem_type) &&
4658 (array->nelems * elem_size ==
4659 btf_resolved_type_size(btf, type_id));
4660 }
4661
4662 return false;
4663 }
4664
4665 static int btf_resolve(struct btf_verifier_env *env,
4666 const struct btf_type *t, u32 type_id)
4667 {
4668 u32 save_log_type_id = env->log_type_id;
4669 const struct resolve_vertex *v;
4670 int err = 0;
4671
4672 env->resolve_mode = RESOLVE_TBD;
4673 env_stack_push(env, t, type_id);
4674 while (!err && (v = env_stack_peak(env))) {
4675 env->log_type_id = v->type_id;
4676 err = btf_type_ops(v->t)->resolve(env, v);
4677 }
4678
4679 env->log_type_id = type_id;
4680 if (err == -E2BIG) {
4681 btf_verifier_log_type(env, t,
4682 "Exceeded max resolving depth:%u",
4683 MAX_RESOLVE_DEPTH);
4684 } else if (err == -EEXIST) {
4685 btf_verifier_log_type(env, t, "Loop detected");
4686 }
4687
4688
4689 if (!err && !btf_resolve_valid(env, t, type_id)) {
4690 btf_verifier_log_type(env, t, "Invalid resolve state");
4691 err = -EINVAL;
4692 }
4693
4694 env->log_type_id = save_log_type_id;
4695 return err;
4696 }
4697
4698 static int btf_check_all_types(struct btf_verifier_env *env)
4699 {
4700 struct btf *btf = env->btf;
4701 const struct btf_type *t;
4702 u32 type_id, i;
4703 int err;
4704
4705 err = env_resolve_init(env);
4706 if (err)
4707 return err;
4708
4709 env->phase++;
4710 for (i = btf->base_btf ? 0 : 1; i < btf->nr_types; i++) {
4711 type_id = btf->start_id + i;
4712 t = btf_type_by_id(btf, type_id);
4713
4714 env->log_type_id = type_id;
4715 if (btf_type_needs_resolve(t) &&
4716 !env_type_is_resolved(env, type_id)) {
4717 err = btf_resolve(env, t, type_id);
4718 if (err)
4719 return err;
4720 }
4721
4722 if (btf_type_is_func_proto(t)) {
4723 err = btf_func_proto_check(env, t);
4724 if (err)
4725 return err;
4726 }
4727 }
4728
4729 return 0;
4730 }
4731
4732 static int btf_parse_type_sec(struct btf_verifier_env *env)
4733 {
4734 const struct btf_header *hdr = &env->btf->hdr;
4735 int err;
4736
4737
4738 if (hdr->type_off & (sizeof(u32) - 1)) {
4739 btf_verifier_log(env, "Unaligned type_off");
4740 return -EINVAL;
4741 }
4742
4743 if (!env->btf->base_btf && !hdr->type_len) {
4744 btf_verifier_log(env, "No type found");
4745 return -EINVAL;
4746 }
4747
4748 err = btf_check_all_metas(env);
4749 if (err)
4750 return err;
4751
4752 return btf_check_all_types(env);
4753 }
4754
4755 static int btf_parse_str_sec(struct btf_verifier_env *env)
4756 {
4757 const struct btf_header *hdr;
4758 struct btf *btf = env->btf;
4759 const char *start, *end;
4760
4761 hdr = &btf->hdr;
4762 start = btf->nohdr_data + hdr->str_off;
4763 end = start + hdr->str_len;
4764
4765 if (end != btf->data + btf->data_size) {
4766 btf_verifier_log(env, "String section is not at the end");
4767 return -EINVAL;
4768 }
4769
4770 btf->strings = start;
4771
4772 if (btf->base_btf && !hdr->str_len)
4773 return 0;
4774 if (!hdr->str_len || hdr->str_len - 1 > BTF_MAX_NAME_OFFSET || end[-1]) {
4775 btf_verifier_log(env, "Invalid string section");
4776 return -EINVAL;
4777 }
4778 if (!btf->base_btf && start[0]) {
4779 btf_verifier_log(env, "Invalid string section");
4780 return -EINVAL;
4781 }
4782
4783 return 0;
4784 }
4785
4786 static const size_t btf_sec_info_offset[] = {
4787 offsetof(struct btf_header, type_off),
4788 offsetof(struct btf_header, str_off),
4789 };
4790
4791 static int btf_sec_info_cmp(const void *a, const void *b)
4792 {
4793 const struct btf_sec_info *x = a;
4794 const struct btf_sec_info *y = b;
4795
4796 return (int)(x->off - y->off) ? : (int)(x->len - y->len);
4797 }
4798
4799 static int btf_check_sec_info(struct btf_verifier_env *env,
4800 u32 btf_data_size)
4801 {
4802 struct btf_sec_info secs[ARRAY_SIZE(btf_sec_info_offset)];
4803 u32 total, expected_total, i;
4804 const struct btf_header *hdr;
4805 const struct btf *btf;
4806
4807 btf = env->btf;
4808 hdr = &btf->hdr;
4809
4810
4811 for (i = 0; i < ARRAY_SIZE(btf_sec_info_offset); i++)
4812 secs[i] = *(struct btf_sec_info *)((void *)hdr +
4813 btf_sec_info_offset[i]);
4814
4815 sort(secs, ARRAY_SIZE(btf_sec_info_offset),
4816 sizeof(struct btf_sec_info), btf_sec_info_cmp, NULL);
4817
4818
4819 total = 0;
4820 expected_total = btf_data_size - hdr->hdr_len;
4821 for (i = 0; i < ARRAY_SIZE(btf_sec_info_offset); i++) {
4822 if (expected_total < secs[i].off) {
4823 btf_verifier_log(env, "Invalid section offset");
4824 return -EINVAL;
4825 }
4826 if (total < secs[i].off) {
4827
4828 btf_verifier_log(env, "Unsupported section found");
4829 return -EINVAL;
4830 }
4831 if (total > secs[i].off) {
4832 btf_verifier_log(env, "Section overlap found");
4833 return -EINVAL;
4834 }
4835 if (expected_total - total < secs[i].len) {
4836 btf_verifier_log(env,
4837 "Total section length too long");
4838 return -EINVAL;
4839 }
4840 total += secs[i].len;
4841 }
4842
4843
4844 if (expected_total != total) {
4845 btf_verifier_log(env, "Unsupported section found");
4846 return -EINVAL;
4847 }
4848
4849 return 0;
4850 }
4851
4852 static int btf_parse_hdr(struct btf_verifier_env *env)
4853 {
4854 u32 hdr_len, hdr_copy, btf_data_size;
4855 const struct btf_header *hdr;
4856 struct btf *btf;
4857 int err;
4858
4859 btf = env->btf;
4860 btf_data_size = btf->data_size;
4861
4862 if (btf_data_size < offsetofend(struct btf_header, hdr_len)) {
4863 btf_verifier_log(env, "hdr_len not found");
4864 return -EINVAL;
4865 }
4866
4867 hdr = btf->data;
4868 hdr_len = hdr->hdr_len;
4869 if (btf_data_size < hdr_len) {
4870 btf_verifier_log(env, "btf_header not found");
4871 return -EINVAL;
4872 }
4873
4874
4875 if (hdr_len > sizeof(btf->hdr)) {
4876 u8 *expected_zero = btf->data + sizeof(btf->hdr);
4877 u8 *end = btf->data + hdr_len;
4878
4879 for (; expected_zero < end; expected_zero++) {
4880 if (*expected_zero) {
4881 btf_verifier_log(env, "Unsupported btf_header");
4882 return -E2BIG;
4883 }
4884 }
4885 }
4886
4887 hdr_copy = min_t(u32, hdr_len, sizeof(btf->hdr));
4888 memcpy(&btf->hdr, btf->data, hdr_copy);
4889
4890 hdr = &btf->hdr;
4891
4892 btf_verifier_log_hdr(env, btf_data_size);
4893
4894 if (hdr->magic != BTF_MAGIC) {
4895 btf_verifier_log(env, "Invalid magic");
4896 return -EINVAL;
4897 }
4898
4899 if (hdr->version != BTF_VERSION) {
4900 btf_verifier_log(env, "Unsupported version");
4901 return -ENOTSUPP;
4902 }
4903
4904 if (hdr->flags) {
4905 btf_verifier_log(env, "Unsupported flags");
4906 return -ENOTSUPP;
4907 }
4908
4909 if (!btf->base_btf && btf_data_size == hdr->hdr_len) {
4910 btf_verifier_log(env, "No data");
4911 return -EINVAL;
4912 }
4913
4914 err = btf_check_sec_info(env, btf_data_size);
4915 if (err)
4916 return err;
4917
4918 return 0;
4919 }
4920
4921 static int btf_check_type_tags(struct btf_verifier_env *env,
4922 struct btf *btf, int start_id)
4923 {
4924 int i, n, good_id = start_id - 1;
4925 bool in_tags;
4926
4927 n = btf_nr_types(btf);
4928 for (i = start_id; i < n; i++) {
4929 const struct btf_type *t;
4930 int chain_limit = 32;
4931 u32 cur_id = i;
4932
4933 t = btf_type_by_id(btf, i);
4934 if (!t)
4935 return -EINVAL;
4936 if (!btf_type_is_modifier(t))
4937 continue;
4938
4939 cond_resched();
4940
4941 in_tags = btf_type_is_type_tag(t);
4942 while (btf_type_is_modifier(t)) {
4943 if (!chain_limit--) {
4944 btf_verifier_log(env, "Max chain length or cycle detected");
4945 return -ELOOP;
4946 }
4947 if (btf_type_is_type_tag(t)) {
4948 if (!in_tags) {
4949 btf_verifier_log(env, "Type tags don't precede modifiers");
4950 return -EINVAL;
4951 }
4952 } else if (in_tags) {
4953 in_tags = false;
4954 }
4955 if (cur_id <= good_id)
4956 break;
4957
4958 cur_id = t->type;
4959 t = btf_type_by_id(btf, cur_id);
4960 if (!t)
4961 return -EINVAL;
4962 }
4963 good_id = i;
4964 }
4965 return 0;
4966 }
4967
4968 static struct btf *btf_parse(bpfptr_t btf_data, u32 btf_data_size,
4969 u32 log_level, char __user *log_ubuf, u32 log_size)
4970 {
4971 struct btf_verifier_env *env = NULL;
4972 struct bpf_verifier_log *log;
4973 struct btf *btf = NULL;
4974 u8 *data;
4975 int err;
4976
4977 if (btf_data_size > BTF_MAX_SIZE)
4978 return ERR_PTR(-E2BIG);
4979
4980 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN);
4981 if (!env)
4982 return ERR_PTR(-ENOMEM);
4983
4984 log = &env->log;
4985 if (log_level || log_ubuf || log_size) {
4986
4987
4988
4989 log->level = log_level;
4990 log->ubuf = log_ubuf;
4991 log->len_total = log_size;
4992
4993
4994 if (!bpf_verifier_log_attr_valid(log)) {
4995 err = -EINVAL;
4996 goto errout;
4997 }
4998 }
4999
5000 btf = kzalloc(sizeof(*btf), GFP_KERNEL | __GFP_NOWARN);
5001 if (!btf) {
5002 err = -ENOMEM;
5003 goto errout;
5004 }
5005 env->btf = btf;
5006
5007 data = kvmalloc(btf_data_size, GFP_KERNEL | __GFP_NOWARN);
5008 if (!data) {
5009 err = -ENOMEM;
5010 goto errout;
5011 }
5012
5013 btf->data = data;
5014 btf->data_size = btf_data_size;
5015
5016 if (copy_from_bpfptr(data, btf_data, btf_data_size)) {
5017 err = -EFAULT;
5018 goto errout;
5019 }
5020
5021 err = btf_parse_hdr(env);
5022 if (err)
5023 goto errout;
5024
5025 btf->nohdr_data = btf->data + btf->hdr.hdr_len;
5026
5027 err = btf_parse_str_sec(env);
5028 if (err)
5029 goto errout;
5030
5031 err = btf_parse_type_sec(env);
5032 if (err)
5033 goto errout;
5034
5035 err = btf_check_type_tags(env, btf, 1);
5036 if (err)
5037 goto errout;
5038
5039 if (log->level && bpf_verifier_log_full(log)) {
5040 err = -ENOSPC;
5041 goto errout;
5042 }
5043
5044 btf_verifier_env_free(env);
5045 refcount_set(&btf->refcnt, 1);
5046 return btf;
5047
5048 errout:
5049 btf_verifier_env_free(env);
5050 if (btf)
5051 btf_free(btf);
5052 return ERR_PTR(err);
5053 }
5054
5055 extern char __weak __start_BTF[];
5056 extern char __weak __stop_BTF[];
5057 extern struct btf *btf_vmlinux;
5058
5059 #define BPF_MAP_TYPE(_id, _ops)
5060 #define BPF_LINK_TYPE(_id, _name)
5061 static union {
5062 struct bpf_ctx_convert {
5063 #define BPF_PROG_TYPE(_id, _name, prog_ctx_type, kern_ctx_type) \
5064 prog_ctx_type _id##_prog; \
5065 kern_ctx_type _id##_kern;
5066 #include <linux/bpf_types.h>
5067 #undef BPF_PROG_TYPE
5068 } *__t;
5069
5070 const struct btf_type *t;
5071 } bpf_ctx_convert;
5072 enum {
5073 #define BPF_PROG_TYPE(_id, _name, prog_ctx_type, kern_ctx_type) \
5074 __ctx_convert##_id,
5075 #include <linux/bpf_types.h>
5076 #undef BPF_PROG_TYPE
5077 __ctx_convert_unused,
5078 };
5079 static u8 bpf_ctx_convert_map[] = {
5080 #define BPF_PROG_TYPE(_id, _name, prog_ctx_type, kern_ctx_type) \
5081 [_id] = __ctx_convert##_id,
5082 #include <linux/bpf_types.h>
5083 #undef BPF_PROG_TYPE
5084 0,
5085 };
5086 #undef BPF_MAP_TYPE
5087 #undef BPF_LINK_TYPE
5088
5089 static const struct btf_member *
5090 btf_get_prog_ctx_type(struct bpf_verifier_log *log, const struct btf *btf,
5091 const struct btf_type *t, enum bpf_prog_type prog_type,
5092 int arg)
5093 {
5094 const struct btf_type *conv_struct;
5095 const struct btf_type *ctx_struct;
5096 const struct btf_member *ctx_type;
5097 const char *tname, *ctx_tname;
5098
5099 conv_struct = bpf_ctx_convert.t;
5100 if (!conv_struct) {
5101 bpf_log(log, "btf_vmlinux is malformed\n");
5102 return NULL;
5103 }
5104 t = btf_type_by_id(btf, t->type);
5105 while (btf_type_is_modifier(t))
5106 t = btf_type_by_id(btf, t->type);
5107 if (!btf_type_is_struct(t)) {
5108
5109
5110
5111
5112
5113 return NULL;
5114 }
5115 tname = btf_name_by_offset(btf, t->name_off);
5116 if (!tname) {
5117 bpf_log(log, "arg#%d struct doesn't have a name\n", arg);
5118 return NULL;
5119 }
5120
5121 ctx_type = btf_type_member(conv_struct) + bpf_ctx_convert_map[prog_type] * 2;
5122
5123
5124
5125 ctx_struct = btf_type_by_id(btf_vmlinux, ctx_type->type);
5126 if (!ctx_struct)
5127
5128 return NULL;
5129 ctx_tname = btf_name_by_offset(btf_vmlinux, ctx_struct->name_off);
5130 if (!ctx_tname) {
5131
5132 bpf_log(log, "Please fix kernel include/linux/bpf_types.h\n");
5133 return NULL;
5134 }
5135
5136
5137
5138
5139
5140
5141
5142 if (strcmp(ctx_tname, tname))
5143 return NULL;
5144 return ctx_type;
5145 }
5146
5147 static int btf_translate_to_vmlinux(struct bpf_verifier_log *log,
5148 struct btf *btf,
5149 const struct btf_type *t,
5150 enum bpf_prog_type prog_type,
5151 int arg)
5152 {
5153 const struct btf_member *prog_ctx_type, *kern_ctx_type;
5154
5155 prog_ctx_type = btf_get_prog_ctx_type(log, btf, t, prog_type, arg);
5156 if (!prog_ctx_type)
5157 return -ENOENT;
5158 kern_ctx_type = prog_ctx_type + 1;
5159 return kern_ctx_type->type;
5160 }
5161
5162 BTF_ID_LIST(bpf_ctx_convert_btf_id)
5163 BTF_ID(struct, bpf_ctx_convert)
5164
5165 struct btf *btf_parse_vmlinux(void)
5166 {
5167 struct btf_verifier_env *env = NULL;
5168 struct bpf_verifier_log *log;
5169 struct btf *btf = NULL;
5170 int err;
5171
5172 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN);
5173 if (!env)
5174 return ERR_PTR(-ENOMEM);
5175
5176 log = &env->log;
5177 log->level = BPF_LOG_KERNEL;
5178
5179 btf = kzalloc(sizeof(*btf), GFP_KERNEL | __GFP_NOWARN);
5180 if (!btf) {
5181 err = -ENOMEM;
5182 goto errout;
5183 }
5184 env->btf = btf;
5185
5186 btf->data = __start_BTF;
5187 btf->data_size = __stop_BTF - __start_BTF;
5188 btf->kernel_btf = true;
5189 snprintf(btf->name, sizeof(btf->name), "vmlinux");
5190
5191 err = btf_parse_hdr(env);
5192 if (err)
5193 goto errout;
5194
5195 btf->nohdr_data = btf->data + btf->hdr.hdr_len;
5196
5197 err = btf_parse_str_sec(env);
5198 if (err)
5199 goto errout;
5200
5201 err = btf_check_all_metas(env);
5202 if (err)
5203 goto errout;
5204
5205 err = btf_check_type_tags(env, btf, 1);
5206 if (err)
5207 goto errout;
5208
5209
5210 bpf_ctx_convert.t = btf_type_by_id(btf, bpf_ctx_convert_btf_id[0]);
5211
5212 bpf_struct_ops_init(btf, log);
5213
5214 refcount_set(&btf->refcnt, 1);
5215
5216 err = btf_alloc_id(btf);
5217 if (err)
5218 goto errout;
5219
5220 btf_verifier_env_free(env);
5221 return btf;
5222
5223 errout:
5224 btf_verifier_env_free(env);
5225 if (btf) {
5226 kvfree(btf->types);
5227 kfree(btf);
5228 }
5229 return ERR_PTR(err);
5230 }
5231
5232 #ifdef CONFIG_DEBUG_INFO_BTF_MODULES
5233
5234 static struct btf *btf_parse_module(const char *module_name, const void *data, unsigned int data_size)
5235 {
5236 struct btf_verifier_env *env = NULL;
5237 struct bpf_verifier_log *log;
5238 struct btf *btf = NULL, *base_btf;
5239 int err;
5240
5241 base_btf = bpf_get_btf_vmlinux();
5242 if (IS_ERR(base_btf))
5243 return base_btf;
5244 if (!base_btf)
5245 return ERR_PTR(-EINVAL);
5246
5247 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN);
5248 if (!env)
5249 return ERR_PTR(-ENOMEM);
5250
5251 log = &env->log;
5252 log->level = BPF_LOG_KERNEL;
5253
5254 btf = kzalloc(sizeof(*btf), GFP_KERNEL | __GFP_NOWARN);
5255 if (!btf) {
5256 err = -ENOMEM;
5257 goto errout;
5258 }
5259 env->btf = btf;
5260
5261 btf->base_btf = base_btf;
5262 btf->start_id = base_btf->nr_types;
5263 btf->start_str_off = base_btf->hdr.str_len;
5264 btf->kernel_btf = true;
5265 snprintf(btf->name, sizeof(btf->name), "%s", module_name);
5266
5267 btf->data = kvmalloc(data_size, GFP_KERNEL | __GFP_NOWARN);
5268 if (!btf->data) {
5269 err = -ENOMEM;
5270 goto errout;
5271 }
5272 memcpy(btf->data, data, data_size);
5273 btf->data_size = data_size;
5274
5275 err = btf_parse_hdr(env);
5276 if (err)
5277 goto errout;
5278
5279 btf->nohdr_data = btf->data + btf->hdr.hdr_len;
5280
5281 err = btf_parse_str_sec(env);
5282 if (err)
5283 goto errout;
5284
5285 err = btf_check_all_metas(env);
5286 if (err)
5287 goto errout;
5288
5289 err = btf_check_type_tags(env, btf, btf_nr_types(base_btf));
5290 if (err)
5291 goto errout;
5292
5293 btf_verifier_env_free(env);
5294 refcount_set(&btf->refcnt, 1);
5295 return btf;
5296
5297 errout:
5298 btf_verifier_env_free(env);
5299 if (btf) {
5300 kvfree(btf->data);
5301 kvfree(btf->types);
5302 kfree(btf);
5303 }
5304 return ERR_PTR(err);
5305 }
5306
5307 #endif
5308
5309 struct btf *bpf_prog_get_target_btf(const struct bpf_prog *prog)
5310 {
5311 struct bpf_prog *tgt_prog = prog->aux->dst_prog;
5312
5313 if (tgt_prog)
5314 return tgt_prog->aux->btf;
5315 else
5316 return prog->aux->attach_btf;
5317 }
5318
5319 static bool is_int_ptr(struct btf *btf, const struct btf_type *t)
5320 {
5321
5322 t = btf_type_by_id(btf, t->type);
5323
5324
5325 if (BTF_INFO_KIND(t->info) == BTF_KIND_CONST)
5326 t = btf_type_by_id(btf, t->type);
5327
5328 return btf_type_is_int(t);
5329 }
5330
5331 bool btf_ctx_access(int off, int size, enum bpf_access_type type,
5332 const struct bpf_prog *prog,
5333 struct bpf_insn_access_aux *info)
5334 {
5335 const struct btf_type *t = prog->aux->attach_func_proto;
5336 struct bpf_prog *tgt_prog = prog->aux->dst_prog;
5337 struct btf *btf = bpf_prog_get_target_btf(prog);
5338 const char *tname = prog->aux->attach_func_name;
5339 struct bpf_verifier_log *log = info->log;
5340 const struct btf_param *args;
5341 const char *tag_value;
5342 u32 nr_args, arg;
5343 int i, ret;
5344
5345 if (off % 8) {
5346 bpf_log(log, "func '%s' offset %d is not multiple of 8\n",
5347 tname, off);
5348 return false;
5349 }
5350 arg = off / 8;
5351 args = (const struct btf_param *)(t + 1);
5352
5353
5354
5355 nr_args = t ? btf_type_vlen(t) : MAX_BPF_FUNC_REG_ARGS;
5356 if (prog->aux->attach_btf_trace) {
5357
5358 args++;
5359 nr_args--;
5360 }
5361
5362 if (arg > nr_args) {
5363 bpf_log(log, "func '%s' doesn't have %d-th argument\n",
5364 tname, arg + 1);
5365 return false;
5366 }
5367
5368 if (arg == nr_args) {
5369 switch (prog->expected_attach_type) {
5370 case BPF_LSM_CGROUP:
5371 case BPF_LSM_MAC:
5372 case BPF_TRACE_FEXIT:
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386 if (!t)
5387 return true;
5388 t = btf_type_by_id(btf, t->type);
5389 break;
5390 case BPF_MODIFY_RETURN:
5391
5392
5393
5394 if (!t)
5395 return false;
5396
5397 t = btf_type_skip_modifiers(btf, t->type, NULL);
5398 if (!btf_type_is_small_int(t)) {
5399 bpf_log(log,
5400 "ret type %s not allowed for fmod_ret\n",
5401 btf_kind_str[BTF_INFO_KIND(t->info)]);
5402 return false;
5403 }
5404 break;
5405 default:
5406 bpf_log(log, "func '%s' doesn't have %d-th argument\n",
5407 tname, arg + 1);
5408 return false;
5409 }
5410 } else {
5411 if (!t)
5412
5413 return true;
5414 t = btf_type_by_id(btf, args[arg].type);
5415 }
5416
5417
5418 while (btf_type_is_modifier(t))
5419 t = btf_type_by_id(btf, t->type);
5420 if (btf_type_is_small_int(t) || btf_is_any_enum(t))
5421
5422 return true;
5423 if (!btf_type_is_ptr(t)) {
5424 bpf_log(log,
5425 "func '%s' arg%d '%s' has type %s. Only pointer access is allowed\n",
5426 tname, arg,
5427 __btf_name_by_offset(btf, t->name_off),
5428 btf_kind_str[BTF_INFO_KIND(t->info)]);
5429 return false;
5430 }
5431
5432
5433 for (i = 0; i < prog->aux->ctx_arg_info_size; i++) {
5434 const struct bpf_ctx_arg_aux *ctx_arg_info = &prog->aux->ctx_arg_info[i];
5435 u32 type, flag;
5436
5437 type = base_type(ctx_arg_info->reg_type);
5438 flag = type_flag(ctx_arg_info->reg_type);
5439 if (ctx_arg_info->offset == off && type == PTR_TO_BUF &&
5440 (flag & PTR_MAYBE_NULL)) {
5441 info->reg_type = ctx_arg_info->reg_type;
5442 return true;
5443 }
5444 }
5445
5446 if (t->type == 0)
5447
5448
5449
5450
5451 return true;
5452
5453 if (is_int_ptr(btf, t))
5454 return true;
5455
5456
5457 for (i = 0; i < prog->aux->ctx_arg_info_size; i++) {
5458 const struct bpf_ctx_arg_aux *ctx_arg_info = &prog->aux->ctx_arg_info[i];
5459
5460 if (ctx_arg_info->offset == off) {
5461 if (!ctx_arg_info->btf_id) {
5462 bpf_log(log,"invalid btf_id for context argument offset %u\n", off);
5463 return false;
5464 }
5465
5466 info->reg_type = ctx_arg_info->reg_type;
5467 info->btf = btf_vmlinux;
5468 info->btf_id = ctx_arg_info->btf_id;
5469 return true;
5470 }
5471 }
5472
5473 info->reg_type = PTR_TO_BTF_ID;
5474 if (tgt_prog) {
5475 enum bpf_prog_type tgt_type;
5476
5477 if (tgt_prog->type == BPF_PROG_TYPE_EXT)
5478 tgt_type = tgt_prog->aux->saved_dst_prog_type;
5479 else
5480 tgt_type = tgt_prog->type;
5481
5482 ret = btf_translate_to_vmlinux(log, btf, t, tgt_type, arg);
5483 if (ret > 0) {
5484 info->btf = btf_vmlinux;
5485 info->btf_id = ret;
5486 return true;
5487 } else {
5488 return false;
5489 }
5490 }
5491
5492 info->btf = btf;
5493 info->btf_id = t->type;
5494 t = btf_type_by_id(btf, t->type);
5495
5496 if (btf_type_is_type_tag(t)) {
5497 tag_value = __btf_name_by_offset(btf, t->name_off);
5498 if (strcmp(tag_value, "user") == 0)
5499 info->reg_type |= MEM_USER;
5500 if (strcmp(tag_value, "percpu") == 0)
5501 info->reg_type |= MEM_PERCPU;
5502 }
5503
5504
5505 while (btf_type_is_modifier(t)) {
5506 info->btf_id = t->type;
5507 t = btf_type_by_id(btf, t->type);
5508 }
5509 if (!btf_type_is_struct(t)) {
5510 bpf_log(log,
5511 "func '%s' arg%d type %s is not a struct\n",
5512 tname, arg, btf_kind_str[BTF_INFO_KIND(t->info)]);
5513 return false;
5514 }
5515 bpf_log(log, "func '%s' arg%d has btf_id %d type %s '%s'\n",
5516 tname, arg, info->btf_id, btf_kind_str[BTF_INFO_KIND(t->info)],
5517 __btf_name_by_offset(btf, t->name_off));
5518 return true;
5519 }
5520
5521 enum bpf_struct_walk_result {
5522
5523 WALK_SCALAR = 0,
5524 WALK_PTR,
5525 WALK_STRUCT,
5526 };
5527
5528 static int btf_struct_walk(struct bpf_verifier_log *log, const struct btf *btf,
5529 const struct btf_type *t, int off, int size,
5530 u32 *next_btf_id, enum bpf_type_flag *flag)
5531 {
5532 u32 i, moff, mtrue_end, msize = 0, total_nelems = 0;
5533 const struct btf_type *mtype, *elem_type = NULL;
5534 const struct btf_member *member;
5535 const char *tname, *mname, *tag_value;
5536 u32 vlen, elem_id, mid;
5537
5538 again:
5539 tname = __btf_name_by_offset(btf, t->name_off);
5540 if (!btf_type_is_struct(t)) {
5541 bpf_log(log, "Type '%s' is not a struct\n", tname);
5542 return -EINVAL;
5543 }
5544
5545 vlen = btf_type_vlen(t);
5546 if (off + size > t->size) {
5547
5548
5549
5550 struct btf_array *array_elem;
5551
5552 if (vlen == 0)
5553 goto error;
5554
5555 member = btf_type_member(t) + vlen - 1;
5556 mtype = btf_type_skip_modifiers(btf, member->type,
5557 NULL);
5558 if (!btf_type_is_array(mtype))
5559 goto error;
5560
5561 array_elem = (struct btf_array *)(mtype + 1);
5562 if (array_elem->nelems != 0)
5563 goto error;
5564
5565 moff = __btf_member_bit_offset(t, member) / 8;
5566 if (off < moff)
5567 goto error;
5568
5569
5570
5571
5572 t = btf_type_skip_modifiers(btf, array_elem->type,
5573 NULL);
5574 if (!btf_type_is_struct(t))
5575 goto error;
5576
5577 off = (off - moff) % t->size;
5578 goto again;
5579
5580 error:
5581 bpf_log(log, "access beyond struct %s at off %u size %u\n",
5582 tname, off, size);
5583 return -EACCES;
5584 }
5585
5586 for_each_member(i, t, member) {
5587
5588 moff = __btf_member_bit_offset(t, member) / 8;
5589 if (off + size <= moff)
5590
5591 break;
5592
5593 if (__btf_member_bitfield_size(t, member)) {
5594 u32 end_bit = __btf_member_bit_offset(t, member) +
5595 __btf_member_bitfield_size(t, member);
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605 if (off <= moff &&
5606 BITS_ROUNDUP_BYTES(end_bit) <= off + size)
5607 return WALK_SCALAR;
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621 continue;
5622 }
5623
5624
5625 if (off < moff)
5626 break;
5627
5628
5629 mid = member->type;
5630 mtype = btf_type_by_id(btf, member->type);
5631 mname = __btf_name_by_offset(btf, member->name_off);
5632
5633 mtype = __btf_resolve_size(btf, mtype, &msize,
5634 &elem_type, &elem_id, &total_nelems,
5635 &mid);
5636 if (IS_ERR(mtype)) {
5637 bpf_log(log, "field %s doesn't have size\n", mname);
5638 return -EFAULT;
5639 }
5640
5641 mtrue_end = moff + msize;
5642 if (off >= mtrue_end)
5643
5644 continue;
5645
5646 if (btf_type_is_array(mtype)) {
5647 u32 elem_idx;
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690 if (moff == mtrue_end)
5691 continue;
5692
5693 msize /= total_nelems;
5694 elem_idx = (off - moff) / msize;
5695 moff += elem_idx * msize;
5696 mtype = elem_type;
5697 mid = elem_id;
5698 }
5699
5700
5701
5702
5703 if (btf_type_is_struct(mtype)) {
5704
5705 t = mtype;
5706
5707
5708 if (off == moff) {
5709 *next_btf_id = mid;
5710 return WALK_STRUCT;
5711 }
5712
5713
5714 off -= moff;
5715 goto again;
5716 }
5717
5718 if (btf_type_is_ptr(mtype)) {
5719 const struct btf_type *stype, *t;
5720 enum bpf_type_flag tmp_flag = 0;
5721 u32 id;
5722
5723 if (msize != size || off != moff) {
5724 bpf_log(log,
5725 "cannot access ptr member %s with moff %u in struct %s with off %u size %u\n",
5726 mname, moff, tname, off, size);
5727 return -EACCES;
5728 }
5729
5730
5731 t = btf_type_by_id(btf, mtype->type);
5732 if (btf_type_is_type_tag(t)) {
5733 tag_value = __btf_name_by_offset(btf, t->name_off);
5734
5735 if (strcmp(tag_value, "user") == 0)
5736 tmp_flag = MEM_USER;
5737
5738 if (strcmp(tag_value, "percpu") == 0)
5739 tmp_flag = MEM_PERCPU;
5740 }
5741
5742 stype = btf_type_skip_modifiers(btf, mtype->type, &id);
5743 if (btf_type_is_struct(stype)) {
5744 *next_btf_id = id;
5745 *flag = tmp_flag;
5746 return WALK_PTR;
5747 }
5748 }
5749
5750
5751
5752
5753
5754
5755
5756 if (off + size > mtrue_end) {
5757 bpf_log(log,
5758 "access beyond the end of member %s (mend:%u) in struct %s with off %u size %u\n",
5759 mname, mtrue_end, tname, off, size);
5760 return -EACCES;
5761 }
5762
5763 return WALK_SCALAR;
5764 }
5765 bpf_log(log, "struct %s doesn't have field at offset %d\n", tname, off);
5766 return -EINVAL;
5767 }
5768
5769 int btf_struct_access(struct bpf_verifier_log *log, const struct btf *btf,
5770 const struct btf_type *t, int off, int size,
5771 enum bpf_access_type atype __maybe_unused,
5772 u32 *next_btf_id, enum bpf_type_flag *flag)
5773 {
5774 enum bpf_type_flag tmp_flag = 0;
5775 int err;
5776 u32 id;
5777
5778 do {
5779 err = btf_struct_walk(log, btf, t, off, size, &id, &tmp_flag);
5780
5781 switch (err) {
5782 case WALK_PTR:
5783
5784
5785
5786 *next_btf_id = id;
5787 *flag = tmp_flag;
5788 return PTR_TO_BTF_ID;
5789 case WALK_SCALAR:
5790 return SCALAR_VALUE;
5791 case WALK_STRUCT:
5792
5793
5794
5795
5796 t = btf_type_by_id(btf, id);
5797 off = 0;
5798 break;
5799 default:
5800
5801
5802
5803 if (WARN_ONCE(err > 0, "unknown btf_struct_walk return value"))
5804 return -EINVAL;
5805 return err;
5806 }
5807 } while (t);
5808
5809 return -EINVAL;
5810 }
5811
5812
5813
5814
5815
5816
5817 static bool btf_types_are_same(const struct btf *btf1, u32 id1,
5818 const struct btf *btf2, u32 id2)
5819 {
5820 if (id1 != id2)
5821 return false;
5822 if (btf1 == btf2)
5823 return true;
5824 return btf_type_by_id(btf1, id1) == btf_type_by_id(btf2, id2);
5825 }
5826
5827 bool btf_struct_ids_match(struct bpf_verifier_log *log,
5828 const struct btf *btf, u32 id, int off,
5829 const struct btf *need_btf, u32 need_type_id,
5830 bool strict)
5831 {
5832 const struct btf_type *type;
5833 enum bpf_type_flag flag;
5834 int err;
5835
5836
5837 if (off == 0 && btf_types_are_same(btf, id, need_btf, need_type_id))
5838 return true;
5839
5840
5841
5842
5843 if (strict)
5844 return false;
5845 again:
5846 type = btf_type_by_id(btf, id);
5847 if (!type)
5848 return false;
5849 err = btf_struct_walk(log, btf, type, off, 1, &id, &flag);
5850 if (err != WALK_STRUCT)
5851 return false;
5852
5853
5854
5855
5856
5857
5858 if (!btf_types_are_same(btf, id, need_btf, need_type_id)) {
5859 off = 0;
5860 goto again;
5861 }
5862
5863 return true;
5864 }
5865
5866 static int __get_type_size(struct btf *btf, u32 btf_id,
5867 const struct btf_type **bad_type)
5868 {
5869 const struct btf_type *t;
5870
5871 if (!btf_id)
5872
5873 return 0;
5874 t = btf_type_by_id(btf, btf_id);
5875 while (t && btf_type_is_modifier(t))
5876 t = btf_type_by_id(btf, t->type);
5877 if (!t) {
5878 *bad_type = btf_type_by_id(btf, 0);
5879 return -EINVAL;
5880 }
5881 if (btf_type_is_ptr(t))
5882
5883 return sizeof(void *);
5884 if (btf_type_is_int(t) || btf_is_any_enum(t))
5885 return t->size;
5886 *bad_type = t;
5887 return -EINVAL;
5888 }
5889
5890 int btf_distill_func_proto(struct bpf_verifier_log *log,
5891 struct btf *btf,
5892 const struct btf_type *func,
5893 const char *tname,
5894 struct btf_func_model *m)
5895 {
5896 const struct btf_param *args;
5897 const struct btf_type *t;
5898 u32 i, nargs;
5899 int ret;
5900
5901 if (!func) {
5902
5903
5904
5905 for (i = 0; i < MAX_BPF_FUNC_REG_ARGS; i++)
5906 m->arg_size[i] = 8;
5907 m->ret_size = 8;
5908 m->nr_args = MAX_BPF_FUNC_REG_ARGS;
5909 return 0;
5910 }
5911 args = (const struct btf_param *)(func + 1);
5912 nargs = btf_type_vlen(func);
5913 if (nargs > MAX_BPF_FUNC_ARGS) {
5914 bpf_log(log,
5915 "The function %s has %d arguments. Too many.\n",
5916 tname, nargs);
5917 return -EINVAL;
5918 }
5919 ret = __get_type_size(btf, func->type, &t);
5920 if (ret < 0) {
5921 bpf_log(log,
5922 "The function %s return type %s is unsupported.\n",
5923 tname, btf_kind_str[BTF_INFO_KIND(t->info)]);
5924 return -EINVAL;
5925 }
5926 m->ret_size = ret;
5927
5928 for (i = 0; i < nargs; i++) {
5929 if (i == nargs - 1 && args[i].type == 0) {
5930 bpf_log(log,
5931 "The function %s with variable args is unsupported.\n",
5932 tname);
5933 return -EINVAL;
5934 }
5935 ret = __get_type_size(btf, args[i].type, &t);
5936 if (ret < 0) {
5937 bpf_log(log,
5938 "The function %s arg%d type %s is unsupported.\n",
5939 tname, i, btf_kind_str[BTF_INFO_KIND(t->info)]);
5940 return -EINVAL;
5941 }
5942 if (ret == 0) {
5943 bpf_log(log,
5944 "The function %s has malformed void argument.\n",
5945 tname);
5946 return -EINVAL;
5947 }
5948 m->arg_size[i] = ret;
5949 }
5950 m->nr_args = nargs;
5951 return 0;
5952 }
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962 static int btf_check_func_type_match(struct bpf_verifier_log *log,
5963 struct btf *btf1, const struct btf_type *t1,
5964 struct btf *btf2, const struct btf_type *t2)
5965 {
5966 const struct btf_param *args1, *args2;
5967 const char *fn1, *fn2, *s1, *s2;
5968 u32 nargs1, nargs2, i;
5969
5970 fn1 = btf_name_by_offset(btf1, t1->name_off);
5971 fn2 = btf_name_by_offset(btf2, t2->name_off);
5972
5973 if (btf_func_linkage(t1) != BTF_FUNC_GLOBAL) {
5974 bpf_log(log, "%s() is not a global function\n", fn1);
5975 return -EINVAL;
5976 }
5977 if (btf_func_linkage(t2) != BTF_FUNC_GLOBAL) {
5978 bpf_log(log, "%s() is not a global function\n", fn2);
5979 return -EINVAL;
5980 }
5981
5982 t1 = btf_type_by_id(btf1, t1->type);
5983 if (!t1 || !btf_type_is_func_proto(t1))
5984 return -EFAULT;
5985 t2 = btf_type_by_id(btf2, t2->type);
5986 if (!t2 || !btf_type_is_func_proto(t2))
5987 return -EFAULT;
5988
5989 args1 = (const struct btf_param *)(t1 + 1);
5990 nargs1 = btf_type_vlen(t1);
5991 args2 = (const struct btf_param *)(t2 + 1);
5992 nargs2 = btf_type_vlen(t2);
5993
5994 if (nargs1 != nargs2) {
5995 bpf_log(log, "%s() has %d args while %s() has %d args\n",
5996 fn1, nargs1, fn2, nargs2);
5997 return -EINVAL;
5998 }
5999
6000 t1 = btf_type_skip_modifiers(btf1, t1->type, NULL);
6001 t2 = btf_type_skip_modifiers(btf2, t2->type, NULL);
6002 if (t1->info != t2->info) {
6003 bpf_log(log,
6004 "Return type %s of %s() doesn't match type %s of %s()\n",
6005 btf_type_str(t1), fn1,
6006 btf_type_str(t2), fn2);
6007 return -EINVAL;
6008 }
6009
6010 for (i = 0; i < nargs1; i++) {
6011 t1 = btf_type_skip_modifiers(btf1, args1[i].type, NULL);
6012 t2 = btf_type_skip_modifiers(btf2, args2[i].type, NULL);
6013
6014 if (t1->info != t2->info) {
6015 bpf_log(log, "arg%d in %s() is %s while %s() has %s\n",
6016 i, fn1, btf_type_str(t1),
6017 fn2, btf_type_str(t2));
6018 return -EINVAL;
6019 }
6020 if (btf_type_has_size(t1) && t1->size != t2->size) {
6021 bpf_log(log,
6022 "arg%d in %s() has size %d while %s() has %d\n",
6023 i, fn1, t1->size,
6024 fn2, t2->size);
6025 return -EINVAL;
6026 }
6027
6028
6029
6030
6031
6032 if (btf_type_is_int(t1) || btf_is_any_enum(t1))
6033 continue;
6034 if (!btf_type_is_ptr(t1)) {
6035 bpf_log(log,
6036 "arg%d in %s() has unrecognized type\n",
6037 i, fn1);
6038 return -EINVAL;
6039 }
6040 t1 = btf_type_skip_modifiers(btf1, t1->type, NULL);
6041 t2 = btf_type_skip_modifiers(btf2, t2->type, NULL);
6042 if (!btf_type_is_struct(t1)) {
6043 bpf_log(log,
6044 "arg%d in %s() is not a pointer to context\n",
6045 i, fn1);
6046 return -EINVAL;
6047 }
6048 if (!btf_type_is_struct(t2)) {
6049 bpf_log(log,
6050 "arg%d in %s() is not a pointer to context\n",
6051 i, fn2);
6052 return -EINVAL;
6053 }
6054
6055
6056
6057
6058
6059
6060 s1 = btf_name_by_offset(btf1, t1->name_off);
6061 s2 = btf_name_by_offset(btf2, t2->name_off);
6062 if (strcmp(s1, s2)) {
6063 bpf_log(log,
6064 "arg%d %s(struct %s *) doesn't match %s(struct %s *)\n",
6065 i, fn1, s1, fn2, s2);
6066 return -EINVAL;
6067 }
6068 }
6069 return 0;
6070 }
6071
6072
6073 int btf_check_type_match(struct bpf_verifier_log *log, const struct bpf_prog *prog,
6074 struct btf *btf2, const struct btf_type *t2)
6075 {
6076 struct btf *btf1 = prog->aux->btf;
6077 const struct btf_type *t1;
6078 u32 btf_id = 0;
6079
6080 if (!prog->aux->func_info) {
6081 bpf_log(log, "Program extension requires BTF\n");
6082 return -EINVAL;
6083 }
6084
6085 btf_id = prog->aux->func_info[0].type_id;
6086 if (!btf_id)
6087 return -EFAULT;
6088
6089 t1 = btf_type_by_id(btf1, btf_id);
6090 if (!t1 || !btf_type_is_func(t1))
6091 return -EFAULT;
6092
6093 return btf_check_func_type_match(log, btf1, t1, btf2, t2);
6094 }
6095
6096 static u32 *reg2btf_ids[__BPF_REG_TYPE_MAX] = {
6097 #ifdef CONFIG_NET
6098 [PTR_TO_SOCKET] = &btf_sock_ids[BTF_SOCK_TYPE_SOCK],
6099 [PTR_TO_SOCK_COMMON] = &btf_sock_ids[BTF_SOCK_TYPE_SOCK_COMMON],
6100 [PTR_TO_TCP_SOCK] = &btf_sock_ids[BTF_SOCK_TYPE_TCP],
6101 #endif
6102 };
6103
6104
6105 static bool __btf_type_is_scalar_struct(struct bpf_verifier_log *log,
6106 const struct btf *btf,
6107 const struct btf_type *t, int rec)
6108 {
6109 const struct btf_type *member_type;
6110 const struct btf_member *member;
6111 u32 i;
6112
6113 if (!btf_type_is_struct(t))
6114 return false;
6115
6116 for_each_member(i, t, member) {
6117 const struct btf_array *array;
6118
6119 member_type = btf_type_skip_modifiers(btf, member->type, NULL);
6120 if (btf_type_is_struct(member_type)) {
6121 if (rec >= 3) {
6122 bpf_log(log, "max struct nesting depth exceeded\n");
6123 return false;
6124 }
6125 if (!__btf_type_is_scalar_struct(log, btf, member_type, rec + 1))
6126 return false;
6127 continue;
6128 }
6129 if (btf_type_is_array(member_type)) {
6130 array = btf_type_array(member_type);
6131 if (!array->nelems)
6132 return false;
6133 member_type = btf_type_skip_modifiers(btf, array->type, NULL);
6134 if (!btf_type_is_scalar(member_type))
6135 return false;
6136 continue;
6137 }
6138 if (!btf_type_is_scalar(member_type))
6139 return false;
6140 }
6141 return true;
6142 }
6143
6144 static bool is_kfunc_arg_mem_size(const struct btf *btf,
6145 const struct btf_param *arg,
6146 const struct bpf_reg_state *reg)
6147 {
6148 int len, sfx_len = sizeof("__sz") - 1;
6149 const struct btf_type *t;
6150 const char *param_name;
6151
6152 t = btf_type_skip_modifiers(btf, arg->type, NULL);
6153 if (!btf_type_is_scalar(t) || reg->type != SCALAR_VALUE)
6154 return false;
6155
6156
6157 param_name = btf_name_by_offset(btf, arg->name_off);
6158 if (str_is_empty(param_name))
6159 return false;
6160 len = strlen(param_name);
6161 if (len < sfx_len)
6162 return false;
6163 param_name += len - sfx_len;
6164 if (strncmp(param_name, "__sz", sfx_len))
6165 return false;
6166
6167 return true;
6168 }
6169
6170 static int btf_check_func_arg_match(struct bpf_verifier_env *env,
6171 const struct btf *btf, u32 func_id,
6172 struct bpf_reg_state *regs,
6173 bool ptr_to_mem_ok,
6174 u32 kfunc_flags)
6175 {
6176 enum bpf_prog_type prog_type = resolve_prog_type(env->prog);
6177 bool rel = false, kptr_get = false, trusted_arg = false;
6178 struct bpf_verifier_log *log = &env->log;
6179 u32 i, nargs, ref_id, ref_obj_id = 0;
6180 bool is_kfunc = btf_is_kernel(btf);
6181 const char *func_name, *ref_tname;
6182 const struct btf_type *t, *ref_t;
6183 const struct btf_param *args;
6184 int ref_regno = 0, ret;
6185
6186 t = btf_type_by_id(btf, func_id);
6187 if (!t || !btf_type_is_func(t)) {
6188
6189
6190
6191 bpf_log(log, "BTF of func_id %u doesn't point to KIND_FUNC\n",
6192 func_id);
6193 return -EFAULT;
6194 }
6195 func_name = btf_name_by_offset(btf, t->name_off);
6196
6197 t = btf_type_by_id(btf, t->type);
6198 if (!t || !btf_type_is_func_proto(t)) {
6199 bpf_log(log, "Invalid BTF of func %s\n", func_name);
6200 return -EFAULT;
6201 }
6202 args = (const struct btf_param *)(t + 1);
6203 nargs = btf_type_vlen(t);
6204 if (nargs > MAX_BPF_FUNC_REG_ARGS) {
6205 bpf_log(log, "Function %s has %d > %d args\n", func_name, nargs,
6206 MAX_BPF_FUNC_REG_ARGS);
6207 return -EINVAL;
6208 }
6209
6210 if (is_kfunc) {
6211
6212 rel = kfunc_flags & KF_RELEASE;
6213 kptr_get = kfunc_flags & KF_KPTR_GET;
6214 trusted_arg = kfunc_flags & KF_TRUSTED_ARGS;
6215 }
6216
6217
6218
6219
6220 for (i = 0; i < nargs; i++) {
6221 enum bpf_arg_type arg_type = ARG_DONTCARE;
6222 u32 regno = i + 1;
6223 struct bpf_reg_state *reg = ®s[regno];
6224
6225 t = btf_type_skip_modifiers(btf, args[i].type, NULL);
6226 if (btf_type_is_scalar(t)) {
6227 if (reg->type == SCALAR_VALUE)
6228 continue;
6229 bpf_log(log, "R%d is not a scalar\n", regno);
6230 return -EINVAL;
6231 }
6232
6233 if (!btf_type_is_ptr(t)) {
6234 bpf_log(log, "Unrecognized arg#%d type %s\n",
6235 i, btf_type_str(t));
6236 return -EINVAL;
6237 }
6238
6239
6240
6241
6242 if (is_kfunc && trusted_arg && !reg->ref_obj_id) {
6243 bpf_log(log, "R%d must be referenced\n", regno);
6244 return -EINVAL;
6245 }
6246
6247 ref_t = btf_type_skip_modifiers(btf, t->type, &ref_id);
6248 ref_tname = btf_name_by_offset(btf, ref_t->name_off);
6249
6250
6251 if (trusted_arg || (rel && reg->ref_obj_id))
6252 arg_type |= OBJ_RELEASE;
6253 ret = check_func_arg_reg_off(env, reg, regno, arg_type);
6254 if (ret < 0)
6255 return ret;
6256
6257
6258 if (i == 0 && kptr_get) {
6259 struct bpf_map_value_off_desc *off_desc;
6260
6261 if (reg->type != PTR_TO_MAP_VALUE) {
6262 bpf_log(log, "arg#0 expected pointer to map value\n");
6263 return -EINVAL;
6264 }
6265
6266
6267
6268
6269
6270 if (!tnum_is_const(reg->var_off)) {
6271 bpf_log(log, "arg#0 must have constant offset\n");
6272 return -EINVAL;
6273 }
6274
6275 off_desc = bpf_map_kptr_off_contains(reg->map_ptr, reg->off + reg->var_off.value);
6276 if (!off_desc || off_desc->type != BPF_KPTR_REF) {
6277 bpf_log(log, "arg#0 no referenced kptr at map value offset=%llu\n",
6278 reg->off + reg->var_off.value);
6279 return -EINVAL;
6280 }
6281
6282 if (!btf_type_is_ptr(ref_t)) {
6283 bpf_log(log, "arg#0 BTF type must be a double pointer\n");
6284 return -EINVAL;
6285 }
6286
6287 ref_t = btf_type_skip_modifiers(btf, ref_t->type, &ref_id);
6288 ref_tname = btf_name_by_offset(btf, ref_t->name_off);
6289
6290 if (!btf_type_is_struct(ref_t)) {
6291 bpf_log(log, "kernel function %s args#%d pointer type %s %s is not supported\n",
6292 func_name, i, btf_type_str(ref_t), ref_tname);
6293 return -EINVAL;
6294 }
6295 if (!btf_struct_ids_match(log, btf, ref_id, 0, off_desc->kptr.btf,
6296 off_desc->kptr.btf_id, true)) {
6297 bpf_log(log, "kernel function %s args#%d expected pointer to %s %s\n",
6298 func_name, i, btf_type_str(ref_t), ref_tname);
6299 return -EINVAL;
6300 }
6301
6302 } else if (btf_get_prog_ctx_type(log, btf, t, prog_type, i)) {
6303
6304
6305
6306 if (reg->type != PTR_TO_CTX) {
6307 bpf_log(log,
6308 "arg#%d expected pointer to ctx, but got %s\n",
6309 i, btf_type_str(t));
6310 return -EINVAL;
6311 }
6312 } else if (is_kfunc && (reg->type == PTR_TO_BTF_ID ||
6313 (reg2btf_ids[base_type(reg->type)] && !type_flag(reg->type)))) {
6314 const struct btf_type *reg_ref_t;
6315 const struct btf *reg_btf;
6316 const char *reg_ref_tname;
6317 u32 reg_ref_id;
6318
6319 if (!btf_type_is_struct(ref_t)) {
6320 bpf_log(log, "kernel function %s args#%d pointer type %s %s is not supported\n",
6321 func_name, i, btf_type_str(ref_t),
6322 ref_tname);
6323 return -EINVAL;
6324 }
6325
6326 if (reg->type == PTR_TO_BTF_ID) {
6327 reg_btf = reg->btf;
6328 reg_ref_id = reg->btf_id;
6329
6330 if (reg->ref_obj_id) {
6331 if (ref_obj_id) {
6332 bpf_log(log, "verifier internal error: more than one arg with ref_obj_id R%d %u %u\n",
6333 regno, reg->ref_obj_id, ref_obj_id);
6334 return -EFAULT;
6335 }
6336 ref_regno = regno;
6337 ref_obj_id = reg->ref_obj_id;
6338 }
6339 } else {
6340 reg_btf = btf_vmlinux;
6341 reg_ref_id = *reg2btf_ids[base_type(reg->type)];
6342 }
6343
6344 reg_ref_t = btf_type_skip_modifiers(reg_btf, reg_ref_id,
6345 ®_ref_id);
6346 reg_ref_tname = btf_name_by_offset(reg_btf,
6347 reg_ref_t->name_off);
6348 if (!btf_struct_ids_match(log, reg_btf, reg_ref_id,
6349 reg->off, btf, ref_id,
6350 trusted_arg || (rel && reg->ref_obj_id))) {
6351 bpf_log(log, "kernel function %s args#%d expected pointer to %s %s but R%d has a pointer to %s %s\n",
6352 func_name, i,
6353 btf_type_str(ref_t), ref_tname,
6354 regno, btf_type_str(reg_ref_t),
6355 reg_ref_tname);
6356 return -EINVAL;
6357 }
6358 } else if (ptr_to_mem_ok) {
6359 const struct btf_type *resolve_ret;
6360 u32 type_size;
6361
6362 if (is_kfunc) {
6363 bool arg_mem_size = i + 1 < nargs && is_kfunc_arg_mem_size(btf, &args[i + 1], ®s[regno + 1]);
6364
6365
6366
6367
6368
6369
6370
6371 if (!btf_type_is_scalar(ref_t) &&
6372 !__btf_type_is_scalar_struct(log, btf, ref_t, 0) &&
6373 (arg_mem_size ? !btf_type_is_void(ref_t) : 1)) {
6374 bpf_log(log,
6375 "arg#%d pointer type %s %s must point to %sscalar, or struct with scalar\n",
6376 i, btf_type_str(ref_t), ref_tname, arg_mem_size ? "void, " : "");
6377 return -EINVAL;
6378 }
6379
6380
6381 if (arg_mem_size) {
6382 if (check_kfunc_mem_size_reg(env, ®s[regno + 1], regno + 1)) {
6383 bpf_log(log, "arg#%d arg#%d memory, len pair leads to invalid memory access\n",
6384 i, i + 1);
6385 return -EINVAL;
6386 }
6387 i++;
6388 continue;
6389 }
6390 }
6391
6392 resolve_ret = btf_resolve_size(btf, ref_t, &type_size);
6393 if (IS_ERR(resolve_ret)) {
6394 bpf_log(log,
6395 "arg#%d reference type('%s %s') size cannot be determined: %ld\n",
6396 i, btf_type_str(ref_t), ref_tname,
6397 PTR_ERR(resolve_ret));
6398 return -EINVAL;
6399 }
6400
6401 if (check_mem_reg(env, reg, regno, type_size))
6402 return -EINVAL;
6403 } else {
6404 bpf_log(log, "reg type unsupported for arg#%d %sfunction %s#%d\n", i,
6405 is_kfunc ? "kernel " : "", func_name, func_id);
6406 return -EINVAL;
6407 }
6408 }
6409
6410
6411 WARN_ON_ONCE((ref_obj_id && !ref_regno) || (!ref_obj_id && ref_regno));
6412
6413
6414
6415
6416
6417 if (rel && !ref_obj_id) {
6418 bpf_log(log, "release kernel function %s expects refcounted PTR_TO_BTF_ID\n",
6419 func_name);
6420 return -EINVAL;
6421 }
6422
6423 return rel ? ref_regno : 0;
6424 }
6425
6426
6427
6428
6429
6430
6431
6432
6433 int btf_check_subprog_arg_match(struct bpf_verifier_env *env, int subprog,
6434 struct bpf_reg_state *regs)
6435 {
6436 struct bpf_prog *prog = env->prog;
6437 struct btf *btf = prog->aux->btf;
6438 bool is_global;
6439 u32 btf_id;
6440 int err;
6441
6442 if (!prog->aux->func_info)
6443 return -EINVAL;
6444
6445 btf_id = prog->aux->func_info[subprog].type_id;
6446 if (!btf_id)
6447 return -EFAULT;
6448
6449 if (prog->aux->func_info_aux[subprog].unreliable)
6450 return -EINVAL;
6451
6452 is_global = prog->aux->func_info_aux[subprog].linkage == BTF_FUNC_GLOBAL;
6453 err = btf_check_func_arg_match(env, btf, btf_id, regs, is_global, 0);
6454
6455
6456
6457
6458
6459 if (err)
6460 prog->aux->func_info_aux[subprog].unreliable = true;
6461 return err;
6462 }
6463
6464 int btf_check_kfunc_arg_match(struct bpf_verifier_env *env,
6465 const struct btf *btf, u32 func_id,
6466 struct bpf_reg_state *regs,
6467 u32 kfunc_flags)
6468 {
6469 return btf_check_func_arg_match(env, btf, func_id, regs, true, kfunc_flags);
6470 }
6471
6472
6473
6474
6475
6476
6477
6478
6479 int btf_prepare_func_args(struct bpf_verifier_env *env, int subprog,
6480 struct bpf_reg_state *regs)
6481 {
6482 struct bpf_verifier_log *log = &env->log;
6483 struct bpf_prog *prog = env->prog;
6484 enum bpf_prog_type prog_type = prog->type;
6485 struct btf *btf = prog->aux->btf;
6486 const struct btf_param *args;
6487 const struct btf_type *t, *ref_t;
6488 u32 i, nargs, btf_id;
6489 const char *tname;
6490
6491 if (!prog->aux->func_info ||
6492 prog->aux->func_info_aux[subprog].linkage != BTF_FUNC_GLOBAL) {
6493 bpf_log(log, "Verifier bug\n");
6494 return -EFAULT;
6495 }
6496
6497 btf_id = prog->aux->func_info[subprog].type_id;
6498 if (!btf_id) {
6499 bpf_log(log, "Global functions need valid BTF\n");
6500 return -EFAULT;
6501 }
6502
6503 t = btf_type_by_id(btf, btf_id);
6504 if (!t || !btf_type_is_func(t)) {
6505
6506
6507
6508 bpf_log(log, "BTF of func#%d doesn't point to KIND_FUNC\n",
6509 subprog);
6510 return -EFAULT;
6511 }
6512 tname = btf_name_by_offset(btf, t->name_off);
6513
6514 if (log->level & BPF_LOG_LEVEL)
6515 bpf_log(log, "Validating %s() func#%d...\n",
6516 tname, subprog);
6517
6518 if (prog->aux->func_info_aux[subprog].unreliable) {
6519 bpf_log(log, "Verifier bug in function %s()\n", tname);
6520 return -EFAULT;
6521 }
6522 if (prog_type == BPF_PROG_TYPE_EXT)
6523 prog_type = prog->aux->dst_prog->type;
6524
6525 t = btf_type_by_id(btf, t->type);
6526 if (!t || !btf_type_is_func_proto(t)) {
6527 bpf_log(log, "Invalid type of function %s()\n", tname);
6528 return -EFAULT;
6529 }
6530 args = (const struct btf_param *)(t + 1);
6531 nargs = btf_type_vlen(t);
6532 if (nargs > MAX_BPF_FUNC_REG_ARGS) {
6533 bpf_log(log, "Global function %s() with %d > %d args. Buggy compiler.\n",
6534 tname, nargs, MAX_BPF_FUNC_REG_ARGS);
6535 return -EINVAL;
6536 }
6537
6538 t = btf_type_by_id(btf, t->type);
6539 while (btf_type_is_modifier(t))
6540 t = btf_type_by_id(btf, t->type);
6541 if (!btf_type_is_int(t) && !btf_is_any_enum(t)) {
6542 bpf_log(log,
6543 "Global function %s() doesn't return scalar. Only those are supported.\n",
6544 tname);
6545 return -EINVAL;
6546 }
6547
6548
6549
6550 for (i = 0; i < nargs; i++) {
6551 struct bpf_reg_state *reg = ®s[i + 1];
6552
6553 t = btf_type_by_id(btf, args[i].type);
6554 while (btf_type_is_modifier(t))
6555 t = btf_type_by_id(btf, t->type);
6556 if (btf_type_is_int(t) || btf_is_any_enum(t)) {
6557 reg->type = SCALAR_VALUE;
6558 continue;
6559 }
6560 if (btf_type_is_ptr(t)) {
6561 if (btf_get_prog_ctx_type(log, btf, t, prog_type, i)) {
6562 reg->type = PTR_TO_CTX;
6563 continue;
6564 }
6565
6566 t = btf_type_skip_modifiers(btf, t->type, NULL);
6567
6568 ref_t = btf_resolve_size(btf, t, ®->mem_size);
6569 if (IS_ERR(ref_t)) {
6570 bpf_log(log,
6571 "arg#%d reference type('%s %s') size cannot be determined: %ld\n",
6572 i, btf_type_str(t), btf_name_by_offset(btf, t->name_off),
6573 PTR_ERR(ref_t));
6574 return -EINVAL;
6575 }
6576
6577 reg->type = PTR_TO_MEM | PTR_MAYBE_NULL;
6578 reg->id = ++env->id_gen;
6579
6580 continue;
6581 }
6582 bpf_log(log, "Arg#%d type %s in %s() is not supported yet.\n",
6583 i, btf_kind_str[BTF_INFO_KIND(t->info)], tname);
6584 return -EINVAL;
6585 }
6586 return 0;
6587 }
6588
6589 static void btf_type_show(const struct btf *btf, u32 type_id, void *obj,
6590 struct btf_show *show)
6591 {
6592 const struct btf_type *t = btf_type_by_id(btf, type_id);
6593
6594 show->btf = btf;
6595 memset(&show->state, 0, sizeof(show->state));
6596 memset(&show->obj, 0, sizeof(show->obj));
6597
6598 btf_type_ops(t)->show(btf, t, type_id, obj, 0, show);
6599 }
6600
6601 static void btf_seq_show(struct btf_show *show, const char *fmt,
6602 va_list args)
6603 {
6604 seq_vprintf((struct seq_file *)show->target, fmt, args);
6605 }
6606
6607 int btf_type_seq_show_flags(const struct btf *btf, u32 type_id,
6608 void *obj, struct seq_file *m, u64 flags)
6609 {
6610 struct btf_show sseq;
6611
6612 sseq.target = m;
6613 sseq.showfn = btf_seq_show;
6614 sseq.flags = flags;
6615
6616 btf_type_show(btf, type_id, obj, &sseq);
6617
6618 return sseq.state.status;
6619 }
6620
6621 void btf_type_seq_show(const struct btf *btf, u32 type_id, void *obj,
6622 struct seq_file *m)
6623 {
6624 (void) btf_type_seq_show_flags(btf, type_id, obj, m,
6625 BTF_SHOW_NONAME | BTF_SHOW_COMPACT |
6626 BTF_SHOW_ZERO | BTF_SHOW_UNSAFE);
6627 }
6628
6629 struct btf_show_snprintf {
6630 struct btf_show show;
6631 int len_left;
6632 int len;
6633 };
6634
6635 static void btf_snprintf_show(struct btf_show *show, const char *fmt,
6636 va_list args)
6637 {
6638 struct btf_show_snprintf *ssnprintf = (struct btf_show_snprintf *)show;
6639 int len;
6640
6641 len = vsnprintf(show->target, ssnprintf->len_left, fmt, args);
6642
6643 if (len < 0) {
6644 ssnprintf->len_left = 0;
6645 ssnprintf->len = len;
6646 } else if (len >= ssnprintf->len_left) {
6647
6648 ssnprintf->len_left = 0;
6649 ssnprintf->len += len;
6650 } else {
6651 ssnprintf->len_left -= len;
6652 ssnprintf->len += len;
6653 show->target += len;
6654 }
6655 }
6656
6657 int btf_type_snprintf_show(const struct btf *btf, u32 type_id, void *obj,
6658 char *buf, int len, u64 flags)
6659 {
6660 struct btf_show_snprintf ssnprintf;
6661
6662 ssnprintf.show.target = buf;
6663 ssnprintf.show.flags = flags;
6664 ssnprintf.show.showfn = btf_snprintf_show;
6665 ssnprintf.len_left = len;
6666 ssnprintf.len = 0;
6667
6668 btf_type_show(btf, type_id, obj, (struct btf_show *)&ssnprintf);
6669
6670
6671 if (ssnprintf.show.state.status)
6672 return ssnprintf.show.state.status;
6673
6674
6675 return ssnprintf.len;
6676 }
6677
6678 #ifdef CONFIG_PROC_FS
6679 static void bpf_btf_show_fdinfo(struct seq_file *m, struct file *filp)
6680 {
6681 const struct btf *btf = filp->private_data;
6682
6683 seq_printf(m, "btf_id:\t%u\n", btf->id);
6684 }
6685 #endif
6686
6687 static int btf_release(struct inode *inode, struct file *filp)
6688 {
6689 btf_put(filp->private_data);
6690 return 0;
6691 }
6692
6693 const struct file_operations btf_fops = {
6694 #ifdef CONFIG_PROC_FS
6695 .show_fdinfo = bpf_btf_show_fdinfo,
6696 #endif
6697 .release = btf_release,
6698 };
6699
6700 static int __btf_new_fd(struct btf *btf)
6701 {
6702 return anon_inode_getfd("btf", &btf_fops, btf, O_RDONLY | O_CLOEXEC);
6703 }
6704
6705 int btf_new_fd(const union bpf_attr *attr, bpfptr_t uattr)
6706 {
6707 struct btf *btf;
6708 int ret;
6709
6710 btf = btf_parse(make_bpfptr(attr->btf, uattr.is_kernel),
6711 attr->btf_size, attr->btf_log_level,
6712 u64_to_user_ptr(attr->btf_log_buf),
6713 attr->btf_log_size);
6714 if (IS_ERR(btf))
6715 return PTR_ERR(btf);
6716
6717 ret = btf_alloc_id(btf);
6718 if (ret) {
6719 btf_free(btf);
6720 return ret;
6721 }
6722
6723
6724
6725
6726
6727
6728
6729 ret = __btf_new_fd(btf);
6730 if (ret < 0)
6731 btf_put(btf);
6732
6733 return ret;
6734 }
6735
6736 struct btf *btf_get_by_fd(int fd)
6737 {
6738 struct btf *btf;
6739 struct fd f;
6740
6741 f = fdget(fd);
6742
6743 if (!f.file)
6744 return ERR_PTR(-EBADF);
6745
6746 if (f.file->f_op != &btf_fops) {
6747 fdput(f);
6748 return ERR_PTR(-EINVAL);
6749 }
6750
6751 btf = f.file->private_data;
6752 refcount_inc(&btf->refcnt);
6753 fdput(f);
6754
6755 return btf;
6756 }
6757
6758 int btf_get_info_by_fd(const struct btf *btf,
6759 const union bpf_attr *attr,
6760 union bpf_attr __user *uattr)
6761 {
6762 struct bpf_btf_info __user *uinfo;
6763 struct bpf_btf_info info;
6764 u32 info_copy, btf_copy;
6765 void __user *ubtf;
6766 char __user *uname;
6767 u32 uinfo_len, uname_len, name_len;
6768 int ret = 0;
6769
6770 uinfo = u64_to_user_ptr(attr->info.info);
6771 uinfo_len = attr->info.info_len;
6772
6773 info_copy = min_t(u32, uinfo_len, sizeof(info));
6774 memset(&info, 0, sizeof(info));
6775 if (copy_from_user(&info, uinfo, info_copy))
6776 return -EFAULT;
6777
6778 info.id = btf->id;
6779 ubtf = u64_to_user_ptr(info.btf);
6780 btf_copy = min_t(u32, btf->data_size, info.btf_size);
6781 if (copy_to_user(ubtf, btf->data, btf_copy))
6782 return -EFAULT;
6783 info.btf_size = btf->data_size;
6784
6785 info.kernel_btf = btf->kernel_btf;
6786
6787 uname = u64_to_user_ptr(info.name);
6788 uname_len = info.name_len;
6789 if (!uname ^ !uname_len)
6790 return -EINVAL;
6791
6792 name_len = strlen(btf->name);
6793 info.name_len = name_len;
6794
6795 if (uname) {
6796 if (uname_len >= name_len + 1) {
6797 if (copy_to_user(uname, btf->name, name_len + 1))
6798 return -EFAULT;
6799 } else {
6800 char zero = '\0';
6801
6802 if (copy_to_user(uname, btf->name, uname_len - 1))
6803 return -EFAULT;
6804 if (put_user(zero, uname + uname_len - 1))
6805 return -EFAULT;
6806
6807 ret = -ENOSPC;
6808 }
6809 }
6810
6811 if (copy_to_user(uinfo, &info, info_copy) ||
6812 put_user(info_copy, &uattr->info.info_len))
6813 return -EFAULT;
6814
6815 return ret;
6816 }
6817
6818 int btf_get_fd_by_id(u32 id)
6819 {
6820 struct btf *btf;
6821 int fd;
6822
6823 rcu_read_lock();
6824 btf = idr_find(&btf_idr, id);
6825 if (!btf || !refcount_inc_not_zero(&btf->refcnt))
6826 btf = ERR_PTR(-ENOENT);
6827 rcu_read_unlock();
6828
6829 if (IS_ERR(btf))
6830 return PTR_ERR(btf);
6831
6832 fd = __btf_new_fd(btf);
6833 if (fd < 0)
6834 btf_put(btf);
6835
6836 return fd;
6837 }
6838
6839 u32 btf_obj_id(const struct btf *btf)
6840 {
6841 return btf->id;
6842 }
6843
6844 bool btf_is_kernel(const struct btf *btf)
6845 {
6846 return btf->kernel_btf;
6847 }
6848
6849 bool btf_is_module(const struct btf *btf)
6850 {
6851 return btf->kernel_btf && strcmp(btf->name, "vmlinux") != 0;
6852 }
6853
6854 static int btf_id_cmp_func(const void *a, const void *b)
6855 {
6856 const int *pa = a, *pb = b;
6857
6858 return *pa - *pb;
6859 }
6860
6861 bool btf_id_set_contains(const struct btf_id_set *set, u32 id)
6862 {
6863 return bsearch(&id, set->ids, set->cnt, sizeof(u32), btf_id_cmp_func) != NULL;
6864 }
6865
6866 static void *btf_id_set8_contains(const struct btf_id_set8 *set, u32 id)
6867 {
6868 return bsearch(&id, set->pairs, set->cnt, sizeof(set->pairs[0]), btf_id_cmp_func);
6869 }
6870
6871 enum {
6872 BTF_MODULE_F_LIVE = (1 << 0),
6873 };
6874
6875 #ifdef CONFIG_DEBUG_INFO_BTF_MODULES
6876 struct btf_module {
6877 struct list_head list;
6878 struct module *module;
6879 struct btf *btf;
6880 struct bin_attribute *sysfs_attr;
6881 int flags;
6882 };
6883
6884 static LIST_HEAD(btf_modules);
6885 static DEFINE_MUTEX(btf_module_mutex);
6886
6887 static ssize_t
6888 btf_module_read(struct file *file, struct kobject *kobj,
6889 struct bin_attribute *bin_attr,
6890 char *buf, loff_t off, size_t len)
6891 {
6892 const struct btf *btf = bin_attr->private;
6893
6894 memcpy(buf, btf->data + off, len);
6895 return len;
6896 }
6897
6898 static void purge_cand_cache(struct btf *btf);
6899
6900 static int btf_module_notify(struct notifier_block *nb, unsigned long op,
6901 void *module)
6902 {
6903 struct btf_module *btf_mod, *tmp;
6904 struct module *mod = module;
6905 struct btf *btf;
6906 int err = 0;
6907
6908 if (mod->btf_data_size == 0 ||
6909 (op != MODULE_STATE_COMING && op != MODULE_STATE_LIVE &&
6910 op != MODULE_STATE_GOING))
6911 goto out;
6912
6913 switch (op) {
6914 case MODULE_STATE_COMING:
6915 btf_mod = kzalloc(sizeof(*btf_mod), GFP_KERNEL);
6916 if (!btf_mod) {
6917 err = -ENOMEM;
6918 goto out;
6919 }
6920 btf = btf_parse_module(mod->name, mod->btf_data, mod->btf_data_size);
6921 if (IS_ERR(btf)) {
6922 pr_warn("failed to validate module [%s] BTF: %ld\n",
6923 mod->name, PTR_ERR(btf));
6924 kfree(btf_mod);
6925 if (!IS_ENABLED(CONFIG_MODULE_ALLOW_BTF_MISMATCH))
6926 err = PTR_ERR(btf);
6927 goto out;
6928 }
6929 err = btf_alloc_id(btf);
6930 if (err) {
6931 btf_free(btf);
6932 kfree(btf_mod);
6933 goto out;
6934 }
6935
6936 purge_cand_cache(NULL);
6937 mutex_lock(&btf_module_mutex);
6938 btf_mod->module = module;
6939 btf_mod->btf = btf;
6940 list_add(&btf_mod->list, &btf_modules);
6941 mutex_unlock(&btf_module_mutex);
6942
6943 if (IS_ENABLED(CONFIG_SYSFS)) {
6944 struct bin_attribute *attr;
6945
6946 attr = kzalloc(sizeof(*attr), GFP_KERNEL);
6947 if (!attr)
6948 goto out;
6949
6950 sysfs_bin_attr_init(attr);
6951 attr->attr.name = btf->name;
6952 attr->attr.mode = 0444;
6953 attr->size = btf->data_size;
6954 attr->private = btf;
6955 attr->read = btf_module_read;
6956
6957 err = sysfs_create_bin_file(btf_kobj, attr);
6958 if (err) {
6959 pr_warn("failed to register module [%s] BTF in sysfs: %d\n",
6960 mod->name, err);
6961 kfree(attr);
6962 err = 0;
6963 goto out;
6964 }
6965
6966 btf_mod->sysfs_attr = attr;
6967 }
6968
6969 break;
6970 case MODULE_STATE_LIVE:
6971 mutex_lock(&btf_module_mutex);
6972 list_for_each_entry_safe(btf_mod, tmp, &btf_modules, list) {
6973 if (btf_mod->module != module)
6974 continue;
6975
6976 btf_mod->flags |= BTF_MODULE_F_LIVE;
6977 break;
6978 }
6979 mutex_unlock(&btf_module_mutex);
6980 break;
6981 case MODULE_STATE_GOING:
6982 mutex_lock(&btf_module_mutex);
6983 list_for_each_entry_safe(btf_mod, tmp, &btf_modules, list) {
6984 if (btf_mod->module != module)
6985 continue;
6986
6987 list_del(&btf_mod->list);
6988 if (btf_mod->sysfs_attr)
6989 sysfs_remove_bin_file(btf_kobj, btf_mod->sysfs_attr);
6990 purge_cand_cache(btf_mod->btf);
6991 btf_put(btf_mod->btf);
6992 kfree(btf_mod->sysfs_attr);
6993 kfree(btf_mod);
6994 break;
6995 }
6996 mutex_unlock(&btf_module_mutex);
6997 break;
6998 }
6999 out:
7000 return notifier_from_errno(err);
7001 }
7002
7003 static struct notifier_block btf_module_nb = {
7004 .notifier_call = btf_module_notify,
7005 };
7006
7007 static int __init btf_module_init(void)
7008 {
7009 register_module_notifier(&btf_module_nb);
7010 return 0;
7011 }
7012
7013 fs_initcall(btf_module_init);
7014 #endif
7015
7016 struct module *btf_try_get_module(const struct btf *btf)
7017 {
7018 struct module *res = NULL;
7019 #ifdef CONFIG_DEBUG_INFO_BTF_MODULES
7020 struct btf_module *btf_mod, *tmp;
7021
7022 mutex_lock(&btf_module_mutex);
7023 list_for_each_entry_safe(btf_mod, tmp, &btf_modules, list) {
7024 if (btf_mod->btf != btf)
7025 continue;
7026
7027
7028
7029
7030
7031
7032 if ((btf_mod->flags & BTF_MODULE_F_LIVE) && try_module_get(btf_mod->module))
7033 res = btf_mod->module;
7034
7035 break;
7036 }
7037 mutex_unlock(&btf_module_mutex);
7038 #endif
7039
7040 return res;
7041 }
7042
7043
7044
7045
7046 static struct btf *btf_get_module_btf(const struct module *module)
7047 {
7048 #ifdef CONFIG_DEBUG_INFO_BTF_MODULES
7049 struct btf_module *btf_mod, *tmp;
7050 #endif
7051 struct btf *btf = NULL;
7052
7053 if (!module) {
7054 btf = bpf_get_btf_vmlinux();
7055 if (!IS_ERR_OR_NULL(btf))
7056 btf_get(btf);
7057 return btf;
7058 }
7059
7060 #ifdef CONFIG_DEBUG_INFO_BTF_MODULES
7061 mutex_lock(&btf_module_mutex);
7062 list_for_each_entry_safe(btf_mod, tmp, &btf_modules, list) {
7063 if (btf_mod->module != module)
7064 continue;
7065
7066 btf_get(btf_mod->btf);
7067 btf = btf_mod->btf;
7068 break;
7069 }
7070 mutex_unlock(&btf_module_mutex);
7071 #endif
7072
7073 return btf;
7074 }
7075
7076 BPF_CALL_4(bpf_btf_find_by_name_kind, char *, name, int, name_sz, u32, kind, int, flags)
7077 {
7078 struct btf *btf = NULL;
7079 int btf_obj_fd = 0;
7080 long ret;
7081
7082 if (flags)
7083 return -EINVAL;
7084
7085 if (name_sz <= 1 || name[name_sz - 1])
7086 return -EINVAL;
7087
7088 ret = bpf_find_btf_id(name, kind, &btf);
7089 if (ret > 0 && btf_is_module(btf)) {
7090 btf_obj_fd = __btf_new_fd(btf);
7091 if (btf_obj_fd < 0) {
7092 btf_put(btf);
7093 return btf_obj_fd;
7094 }
7095 return ret | (((u64)btf_obj_fd) << 32);
7096 }
7097 if (ret > 0)
7098 btf_put(btf);
7099 return ret;
7100 }
7101
7102 const struct bpf_func_proto bpf_btf_find_by_name_kind_proto = {
7103 .func = bpf_btf_find_by_name_kind,
7104 .gpl_only = false,
7105 .ret_type = RET_INTEGER,
7106 .arg1_type = ARG_PTR_TO_MEM | MEM_RDONLY,
7107 .arg2_type = ARG_CONST_SIZE,
7108 .arg3_type = ARG_ANYTHING,
7109 .arg4_type = ARG_ANYTHING,
7110 };
7111
7112 BTF_ID_LIST_GLOBAL(btf_tracing_ids, MAX_BTF_TRACING_TYPE)
7113 #define BTF_TRACING_TYPE(name, type) BTF_ID(struct, type)
7114 BTF_TRACING_TYPE_xxx
7115 #undef BTF_TRACING_TYPE
7116
7117
7118
7119 static int btf_populate_kfunc_set(struct btf *btf, enum btf_kfunc_hook hook,
7120 struct btf_id_set8 *add_set)
7121 {
7122 bool vmlinux_set = !btf_is_module(btf);
7123 struct btf_kfunc_set_tab *tab;
7124 struct btf_id_set8 *set;
7125 u32 set_cnt;
7126 int ret;
7127
7128 if (hook >= BTF_KFUNC_HOOK_MAX) {
7129 ret = -EINVAL;
7130 goto end;
7131 }
7132
7133 if (!add_set->cnt)
7134 return 0;
7135
7136 tab = btf->kfunc_set_tab;
7137 if (!tab) {
7138 tab = kzalloc(sizeof(*tab), GFP_KERNEL | __GFP_NOWARN);
7139 if (!tab)
7140 return -ENOMEM;
7141 btf->kfunc_set_tab = tab;
7142 }
7143
7144 set = tab->sets[hook];
7145
7146
7147
7148 if (WARN_ON_ONCE(set && !vmlinux_set)) {
7149 ret = -EINVAL;
7150 goto end;
7151 }
7152
7153
7154
7155
7156
7157 if (!vmlinux_set) {
7158 tab->sets[hook] = add_set;
7159 return 0;
7160 }
7161
7162
7163
7164
7165
7166
7167
7168
7169 set_cnt = set ? set->cnt : 0;
7170
7171 if (set_cnt > U32_MAX - add_set->cnt) {
7172 ret = -EOVERFLOW;
7173 goto end;
7174 }
7175
7176 if (set_cnt + add_set->cnt > BTF_KFUNC_SET_MAX_CNT) {
7177 ret = -E2BIG;
7178 goto end;
7179 }
7180
7181
7182 set = krealloc(tab->sets[hook],
7183 offsetof(struct btf_id_set8, pairs[set_cnt + add_set->cnt]),
7184 GFP_KERNEL | __GFP_NOWARN);
7185 if (!set) {
7186 ret = -ENOMEM;
7187 goto end;
7188 }
7189
7190
7191 if (!tab->sets[hook])
7192 set->cnt = 0;
7193 tab->sets[hook] = set;
7194
7195
7196 memcpy(set->pairs + set->cnt, add_set->pairs, add_set->cnt * sizeof(set->pairs[0]));
7197 set->cnt += add_set->cnt;
7198
7199 sort(set->pairs, set->cnt, sizeof(set->pairs[0]), btf_id_cmp_func, NULL);
7200
7201 return 0;
7202 end:
7203 btf_free_kfunc_set_tab(btf);
7204 return ret;
7205 }
7206
7207 static u32 *__btf_kfunc_id_set_contains(const struct btf *btf,
7208 enum btf_kfunc_hook hook,
7209 u32 kfunc_btf_id)
7210 {
7211 struct btf_id_set8 *set;
7212 u32 *id;
7213
7214 if (hook >= BTF_KFUNC_HOOK_MAX)
7215 return NULL;
7216 if (!btf->kfunc_set_tab)
7217 return NULL;
7218 set = btf->kfunc_set_tab->sets[hook];
7219 if (!set)
7220 return NULL;
7221 id = btf_id_set8_contains(set, kfunc_btf_id);
7222 if (!id)
7223 return NULL;
7224
7225 return id + 1;
7226 }
7227
7228 static int bpf_prog_type_to_kfunc_hook(enum bpf_prog_type prog_type)
7229 {
7230 switch (prog_type) {
7231 case BPF_PROG_TYPE_XDP:
7232 return BTF_KFUNC_HOOK_XDP;
7233 case BPF_PROG_TYPE_SCHED_CLS:
7234 return BTF_KFUNC_HOOK_TC;
7235 case BPF_PROG_TYPE_STRUCT_OPS:
7236 return BTF_KFUNC_HOOK_STRUCT_OPS;
7237 case BPF_PROG_TYPE_TRACING:
7238 return BTF_KFUNC_HOOK_TRACING;
7239 case BPF_PROG_TYPE_SYSCALL:
7240 return BTF_KFUNC_HOOK_SYSCALL;
7241 default:
7242 return BTF_KFUNC_HOOK_MAX;
7243 }
7244 }
7245
7246
7247
7248
7249
7250
7251
7252
7253 u32 *btf_kfunc_id_set_contains(const struct btf *btf,
7254 enum bpf_prog_type prog_type,
7255 u32 kfunc_btf_id)
7256 {
7257 enum btf_kfunc_hook hook;
7258
7259 hook = bpf_prog_type_to_kfunc_hook(prog_type);
7260 return __btf_kfunc_id_set_contains(btf, hook, kfunc_btf_id);
7261 }
7262
7263
7264 int register_btf_kfunc_id_set(enum bpf_prog_type prog_type,
7265 const struct btf_kfunc_id_set *kset)
7266 {
7267 enum btf_kfunc_hook hook;
7268 struct btf *btf;
7269 int ret;
7270
7271 btf = btf_get_module_btf(kset->owner);
7272 if (!btf) {
7273 if (!kset->owner && IS_ENABLED(CONFIG_DEBUG_INFO_BTF)) {
7274 pr_err("missing vmlinux BTF, cannot register kfuncs\n");
7275 return -ENOENT;
7276 }
7277 if (kset->owner && IS_ENABLED(CONFIG_DEBUG_INFO_BTF_MODULES)) {
7278 pr_err("missing module BTF, cannot register kfuncs\n");
7279 return -ENOENT;
7280 }
7281 return 0;
7282 }
7283 if (IS_ERR(btf))
7284 return PTR_ERR(btf);
7285
7286 hook = bpf_prog_type_to_kfunc_hook(prog_type);
7287 ret = btf_populate_kfunc_set(btf, hook, kset->set);
7288 btf_put(btf);
7289 return ret;
7290 }
7291 EXPORT_SYMBOL_GPL(register_btf_kfunc_id_set);
7292
7293 s32 btf_find_dtor_kfunc(struct btf *btf, u32 btf_id)
7294 {
7295 struct btf_id_dtor_kfunc_tab *tab = btf->dtor_kfunc_tab;
7296 struct btf_id_dtor_kfunc *dtor;
7297
7298 if (!tab)
7299 return -ENOENT;
7300
7301
7302
7303 BUILD_BUG_ON(offsetof(struct btf_id_dtor_kfunc, btf_id) != 0);
7304 dtor = bsearch(&btf_id, tab->dtors, tab->cnt, sizeof(tab->dtors[0]), btf_id_cmp_func);
7305 if (!dtor)
7306 return -ENOENT;
7307 return dtor->kfunc_btf_id;
7308 }
7309
7310 static int btf_check_dtor_kfuncs(struct btf *btf, const struct btf_id_dtor_kfunc *dtors, u32 cnt)
7311 {
7312 const struct btf_type *dtor_func, *dtor_func_proto, *t;
7313 const struct btf_param *args;
7314 s32 dtor_btf_id;
7315 u32 nr_args, i;
7316
7317 for (i = 0; i < cnt; i++) {
7318 dtor_btf_id = dtors[i].kfunc_btf_id;
7319
7320 dtor_func = btf_type_by_id(btf, dtor_btf_id);
7321 if (!dtor_func || !btf_type_is_func(dtor_func))
7322 return -EINVAL;
7323
7324 dtor_func_proto = btf_type_by_id(btf, dtor_func->type);
7325 if (!dtor_func_proto || !btf_type_is_func_proto(dtor_func_proto))
7326 return -EINVAL;
7327
7328
7329 t = btf_type_by_id(btf, dtor_func_proto->type);
7330 if (!t || !btf_type_is_void(t))
7331 return -EINVAL;
7332
7333 nr_args = btf_type_vlen(dtor_func_proto);
7334 if (nr_args != 1)
7335 return -EINVAL;
7336 args = btf_params(dtor_func_proto);
7337 t = btf_type_by_id(btf, args[0].type);
7338
7339
7340
7341 if (!t || !btf_type_is_ptr(t))
7342 return -EINVAL;
7343 }
7344 return 0;
7345 }
7346
7347
7348 int register_btf_id_dtor_kfuncs(const struct btf_id_dtor_kfunc *dtors, u32 add_cnt,
7349 struct module *owner)
7350 {
7351 struct btf_id_dtor_kfunc_tab *tab;
7352 struct btf *btf;
7353 u32 tab_cnt;
7354 int ret;
7355
7356 btf = btf_get_module_btf(owner);
7357 if (!btf) {
7358 if (!owner && IS_ENABLED(CONFIG_DEBUG_INFO_BTF)) {
7359 pr_err("missing vmlinux BTF, cannot register dtor kfuncs\n");
7360 return -ENOENT;
7361 }
7362 if (owner && IS_ENABLED(CONFIG_DEBUG_INFO_BTF_MODULES)) {
7363 pr_err("missing module BTF, cannot register dtor kfuncs\n");
7364 return -ENOENT;
7365 }
7366 return 0;
7367 }
7368 if (IS_ERR(btf))
7369 return PTR_ERR(btf);
7370
7371 if (add_cnt >= BTF_DTOR_KFUNC_MAX_CNT) {
7372 pr_err("cannot register more than %d kfunc destructors\n", BTF_DTOR_KFUNC_MAX_CNT);
7373 ret = -E2BIG;
7374 goto end;
7375 }
7376
7377
7378 ret = btf_check_dtor_kfuncs(btf, dtors, add_cnt);
7379 if (ret < 0)
7380 goto end;
7381
7382 tab = btf->dtor_kfunc_tab;
7383
7384 if (WARN_ON_ONCE(tab && btf_is_module(btf))) {
7385 ret = -EINVAL;
7386 goto end;
7387 }
7388
7389 tab_cnt = tab ? tab->cnt : 0;
7390 if (tab_cnt > U32_MAX - add_cnt) {
7391 ret = -EOVERFLOW;
7392 goto end;
7393 }
7394 if (tab_cnt + add_cnt >= BTF_DTOR_KFUNC_MAX_CNT) {
7395 pr_err("cannot register more than %d kfunc destructors\n", BTF_DTOR_KFUNC_MAX_CNT);
7396 ret = -E2BIG;
7397 goto end;
7398 }
7399
7400 tab = krealloc(btf->dtor_kfunc_tab,
7401 offsetof(struct btf_id_dtor_kfunc_tab, dtors[tab_cnt + add_cnt]),
7402 GFP_KERNEL | __GFP_NOWARN);
7403 if (!tab) {
7404 ret = -ENOMEM;
7405 goto end;
7406 }
7407
7408 if (!btf->dtor_kfunc_tab)
7409 tab->cnt = 0;
7410 btf->dtor_kfunc_tab = tab;
7411
7412 memcpy(tab->dtors + tab->cnt, dtors, add_cnt * sizeof(tab->dtors[0]));
7413 tab->cnt += add_cnt;
7414
7415 sort(tab->dtors, tab->cnt, sizeof(tab->dtors[0]), btf_id_cmp_func, NULL);
7416
7417 return 0;
7418 end:
7419 btf_free_dtor_kfunc_tab(btf);
7420 btf_put(btf);
7421 return ret;
7422 }
7423 EXPORT_SYMBOL_GPL(register_btf_id_dtor_kfuncs);
7424
7425 #define MAX_TYPES_ARE_COMPAT_DEPTH 2
7426
7427
7428
7429
7430
7431
7432
7433
7434
7435
7436
7437
7438
7439
7440
7441
7442
7443
7444
7445
7446 int bpf_core_types_are_compat(const struct btf *local_btf, __u32 local_id,
7447 const struct btf *targ_btf, __u32 targ_id)
7448 {
7449 return __bpf_core_types_are_compat(local_btf, local_id, targ_btf, targ_id,
7450 MAX_TYPES_ARE_COMPAT_DEPTH);
7451 }
7452
7453 #define MAX_TYPES_MATCH_DEPTH 2
7454
7455 int bpf_core_types_match(const struct btf *local_btf, u32 local_id,
7456 const struct btf *targ_btf, u32 targ_id)
7457 {
7458 return __bpf_core_types_match(local_btf, local_id, targ_btf, targ_id, false,
7459 MAX_TYPES_MATCH_DEPTH);
7460 }
7461
7462 static bool bpf_core_is_flavor_sep(const char *s)
7463 {
7464
7465 return s[0] != '_' &&
7466 s[1] == '_' && s[2] == '_' && s[3] == '_' &&
7467 s[4] != '_';
7468 }
7469
7470 size_t bpf_core_essential_name_len(const char *name)
7471 {
7472 size_t n = strlen(name);
7473 int i;
7474
7475 for (i = n - 5; i >= 0; i--) {
7476 if (bpf_core_is_flavor_sep(name + i))
7477 return i + 1;
7478 }
7479 return n;
7480 }
7481
7482 struct bpf_cand_cache {
7483 const char *name;
7484 u32 name_len;
7485 u16 kind;
7486 u16 cnt;
7487 struct {
7488 const struct btf *btf;
7489 u32 id;
7490 } cands[];
7491 };
7492
7493 static void bpf_free_cands(struct bpf_cand_cache *cands)
7494 {
7495 if (!cands->cnt)
7496
7497 return;
7498 kfree(cands);
7499 }
7500
7501 static void bpf_free_cands_from_cache(struct bpf_cand_cache *cands)
7502 {
7503 kfree(cands->name);
7504 kfree(cands);
7505 }
7506
7507 #define VMLINUX_CAND_CACHE_SIZE 31
7508 static struct bpf_cand_cache *vmlinux_cand_cache[VMLINUX_CAND_CACHE_SIZE];
7509
7510 #define MODULE_CAND_CACHE_SIZE 31
7511 static struct bpf_cand_cache *module_cand_cache[MODULE_CAND_CACHE_SIZE];
7512
7513 static DEFINE_MUTEX(cand_cache_mutex);
7514
7515 static void __print_cand_cache(struct bpf_verifier_log *log,
7516 struct bpf_cand_cache **cache,
7517 int cache_size)
7518 {
7519 struct bpf_cand_cache *cc;
7520 int i, j;
7521
7522 for (i = 0; i < cache_size; i++) {
7523 cc = cache[i];
7524 if (!cc)
7525 continue;
7526 bpf_log(log, "[%d]%s(", i, cc->name);
7527 for (j = 0; j < cc->cnt; j++) {
7528 bpf_log(log, "%d", cc->cands[j].id);
7529 if (j < cc->cnt - 1)
7530 bpf_log(log, " ");
7531 }
7532 bpf_log(log, "), ");
7533 }
7534 }
7535
7536 static void print_cand_cache(struct bpf_verifier_log *log)
7537 {
7538 mutex_lock(&cand_cache_mutex);
7539 bpf_log(log, "vmlinux_cand_cache:");
7540 __print_cand_cache(log, vmlinux_cand_cache, VMLINUX_CAND_CACHE_SIZE);
7541 bpf_log(log, "\nmodule_cand_cache:");
7542 __print_cand_cache(log, module_cand_cache, MODULE_CAND_CACHE_SIZE);
7543 bpf_log(log, "\n");
7544 mutex_unlock(&cand_cache_mutex);
7545 }
7546
7547 static u32 hash_cands(struct bpf_cand_cache *cands)
7548 {
7549 return jhash(cands->name, cands->name_len, 0);
7550 }
7551
7552 static struct bpf_cand_cache *check_cand_cache(struct bpf_cand_cache *cands,
7553 struct bpf_cand_cache **cache,
7554 int cache_size)
7555 {
7556 struct bpf_cand_cache *cc = cache[hash_cands(cands) % cache_size];
7557
7558 if (cc && cc->name_len == cands->name_len &&
7559 !strncmp(cc->name, cands->name, cands->name_len))
7560 return cc;
7561 return NULL;
7562 }
7563
7564 static size_t sizeof_cands(int cnt)
7565 {
7566 return offsetof(struct bpf_cand_cache, cands[cnt]);
7567 }
7568
7569 static struct bpf_cand_cache *populate_cand_cache(struct bpf_cand_cache *cands,
7570 struct bpf_cand_cache **cache,
7571 int cache_size)
7572 {
7573 struct bpf_cand_cache **cc = &cache[hash_cands(cands) % cache_size], *new_cands;
7574
7575 if (*cc) {
7576 bpf_free_cands_from_cache(*cc);
7577 *cc = NULL;
7578 }
7579 new_cands = kmemdup(cands, sizeof_cands(cands->cnt), GFP_KERNEL);
7580 if (!new_cands) {
7581 bpf_free_cands(cands);
7582 return ERR_PTR(-ENOMEM);
7583 }
7584
7585
7586
7587 new_cands->name = kmemdup_nul(cands->name, cands->name_len, GFP_KERNEL);
7588 bpf_free_cands(cands);
7589 if (!new_cands->name) {
7590 kfree(new_cands);
7591 return ERR_PTR(-ENOMEM);
7592 }
7593 *cc = new_cands;
7594 return new_cands;
7595 }
7596
7597 #ifdef CONFIG_DEBUG_INFO_BTF_MODULES
7598 static void __purge_cand_cache(struct btf *btf, struct bpf_cand_cache **cache,
7599 int cache_size)
7600 {
7601 struct bpf_cand_cache *cc;
7602 int i, j;
7603
7604 for (i = 0; i < cache_size; i++) {
7605 cc = cache[i];
7606 if (!cc)
7607 continue;
7608 if (!btf) {
7609
7610
7611
7612
7613 bpf_free_cands_from_cache(cc);
7614 cache[i] = NULL;
7615 continue;
7616 }
7617
7618
7619
7620 for (j = 0; j < cc->cnt; j++)
7621 if (cc->cands[j].btf == btf) {
7622 bpf_free_cands_from_cache(cc);
7623 cache[i] = NULL;
7624 break;
7625 }
7626 }
7627
7628 }
7629
7630 static void purge_cand_cache(struct btf *btf)
7631 {
7632 mutex_lock(&cand_cache_mutex);
7633 __purge_cand_cache(btf, module_cand_cache, MODULE_CAND_CACHE_SIZE);
7634 mutex_unlock(&cand_cache_mutex);
7635 }
7636 #endif
7637
7638 static struct bpf_cand_cache *
7639 bpf_core_add_cands(struct bpf_cand_cache *cands, const struct btf *targ_btf,
7640 int targ_start_id)
7641 {
7642 struct bpf_cand_cache *new_cands;
7643 const struct btf_type *t;
7644 const char *targ_name;
7645 size_t targ_essent_len;
7646 int n, i;
7647
7648 n = btf_nr_types(targ_btf);
7649 for (i = targ_start_id; i < n; i++) {
7650 t = btf_type_by_id(targ_btf, i);
7651 if (btf_kind(t) != cands->kind)
7652 continue;
7653
7654 targ_name = btf_name_by_offset(targ_btf, t->name_off);
7655 if (!targ_name)
7656 continue;
7657
7658
7659
7660
7661 cond_resched();
7662
7663 if (strncmp(cands->name, targ_name, cands->name_len) != 0)
7664 continue;
7665
7666 targ_essent_len = bpf_core_essential_name_len(targ_name);
7667 if (targ_essent_len != cands->name_len)
7668 continue;
7669
7670
7671 new_cands = kmalloc(sizeof_cands(cands->cnt + 1), GFP_KERNEL);
7672 if (!new_cands) {
7673 bpf_free_cands(cands);
7674 return ERR_PTR(-ENOMEM);
7675 }
7676
7677 memcpy(new_cands, cands, sizeof_cands(cands->cnt));
7678 bpf_free_cands(cands);
7679 cands = new_cands;
7680 cands->cands[cands->cnt].btf = targ_btf;
7681 cands->cands[cands->cnt].id = i;
7682 cands->cnt++;
7683 }
7684 return cands;
7685 }
7686
7687 static struct bpf_cand_cache *
7688 bpf_core_find_cands(struct bpf_core_ctx *ctx, u32 local_type_id)
7689 {
7690 struct bpf_cand_cache *cands, *cc, local_cand = {};
7691 const struct btf *local_btf = ctx->btf;
7692 const struct btf_type *local_type;
7693 const struct btf *main_btf;
7694 size_t local_essent_len;
7695 struct btf *mod_btf;
7696 const char *name;
7697 int id;
7698
7699 main_btf = bpf_get_btf_vmlinux();
7700 if (IS_ERR(main_btf))
7701 return ERR_CAST(main_btf);
7702 if (!main_btf)
7703 return ERR_PTR(-EINVAL);
7704
7705 local_type = btf_type_by_id(local_btf, local_type_id);
7706 if (!local_type)
7707 return ERR_PTR(-EINVAL);
7708
7709 name = btf_name_by_offset(local_btf, local_type->name_off);
7710 if (str_is_empty(name))
7711 return ERR_PTR(-EINVAL);
7712 local_essent_len = bpf_core_essential_name_len(name);
7713
7714 cands = &local_cand;
7715 cands->name = name;
7716 cands->kind = btf_kind(local_type);
7717 cands->name_len = local_essent_len;
7718
7719 cc = check_cand_cache(cands, vmlinux_cand_cache, VMLINUX_CAND_CACHE_SIZE);
7720
7721 if (cc) {
7722 if (cc->cnt)
7723 return cc;
7724 goto check_modules;
7725 }
7726
7727
7728 cands = bpf_core_add_cands(cands, main_btf, 1);
7729 if (IS_ERR(cands))
7730 return ERR_CAST(cands);
7731
7732
7733
7734
7735 cc = populate_cand_cache(cands, vmlinux_cand_cache, VMLINUX_CAND_CACHE_SIZE);
7736 if (IS_ERR(cc))
7737 return ERR_CAST(cc);
7738
7739
7740 if (cc->cnt)
7741 return cc;
7742
7743 check_modules:
7744
7745 cc = check_cand_cache(cands, module_cand_cache, MODULE_CAND_CACHE_SIZE);
7746 if (cc)
7747
7748 return cc;
7749
7750
7751 spin_lock_bh(&btf_idr_lock);
7752 idr_for_each_entry(&btf_idr, mod_btf, id) {
7753 if (!btf_is_module(mod_btf))
7754 continue;
7755
7756
7757
7758 btf_get(mod_btf);
7759 spin_unlock_bh(&btf_idr_lock);
7760 cands = bpf_core_add_cands(cands, mod_btf, btf_nr_types(main_btf));
7761 if (IS_ERR(cands)) {
7762 btf_put(mod_btf);
7763 return ERR_CAST(cands);
7764 }
7765 spin_lock_bh(&btf_idr_lock);
7766 btf_put(mod_btf);
7767 }
7768 spin_unlock_bh(&btf_idr_lock);
7769
7770
7771
7772
7773
7774 return populate_cand_cache(cands, module_cand_cache, MODULE_CAND_CACHE_SIZE);
7775 }
7776
7777 int bpf_core_apply(struct bpf_core_ctx *ctx, const struct bpf_core_relo *relo,
7778 int relo_idx, void *insn)
7779 {
7780 bool need_cands = relo->kind != BPF_CORE_TYPE_ID_LOCAL;
7781 struct bpf_core_cand_list cands = {};
7782 struct bpf_core_relo_res targ_res;
7783 struct bpf_core_spec *specs;
7784 int err;
7785
7786
7787
7788
7789 specs = kcalloc(3, sizeof(*specs), GFP_KERNEL);
7790 if (!specs)
7791 return -ENOMEM;
7792
7793 if (need_cands) {
7794 struct bpf_cand_cache *cc;
7795 int i;
7796
7797 mutex_lock(&cand_cache_mutex);
7798 cc = bpf_core_find_cands(ctx, relo->type_id);
7799 if (IS_ERR(cc)) {
7800 bpf_log(ctx->log, "target candidate search failed for %d\n",
7801 relo->type_id);
7802 err = PTR_ERR(cc);
7803 goto out;
7804 }
7805 if (cc->cnt) {
7806 cands.cands = kcalloc(cc->cnt, sizeof(*cands.cands), GFP_KERNEL);
7807 if (!cands.cands) {
7808 err = -ENOMEM;
7809 goto out;
7810 }
7811 }
7812 for (i = 0; i < cc->cnt; i++) {
7813 bpf_log(ctx->log,
7814 "CO-RE relocating %s %s: found target candidate [%d]\n",
7815 btf_kind_str[cc->kind], cc->name, cc->cands[i].id);
7816 cands.cands[i].btf = cc->cands[i].btf;
7817 cands.cands[i].id = cc->cands[i].id;
7818 }
7819 cands.len = cc->cnt;
7820
7821
7822
7823
7824
7825 }
7826
7827 err = bpf_core_calc_relo_insn((void *)ctx->log, relo, relo_idx, ctx->btf, &cands, specs,
7828 &targ_res);
7829 if (err)
7830 goto out;
7831
7832 err = bpf_core_patch_insn((void *)ctx->log, insn, relo->insn_off / 8, relo, relo_idx,
7833 &targ_res);
7834
7835 out:
7836 kfree(specs);
7837 if (need_cands) {
7838 kfree(cands.cands);
7839 mutex_unlock(&cand_cache_mutex);
7840 if (ctx->log->level & BPF_LOG_LEVEL2)
7841 print_cand_cache(ctx->log);
7842 }
7843 return err;
7844 }