1
2
3
4
5
6#include <uapi/linux/btf.h>
7#include <linux/kernel.h>
8#include <linux/types.h>
9#include <linux/slab.h>
10#include <linux/bpf.h>
11#include <linux/btf.h>
12#include <linux/bpf_verifier.h>
13#include <linux/filter.h>
14#include <net/netlink.h>
15#include <linux/file.h>
16#include <linux/vmalloc.h>
17#include <linux/stringify.h>
18#include <linux/bsearch.h>
19#include <linux/sort.h>
20#include <linux/perf_event.h>
21#include <linux/ctype.h>
22#include <linux/error-injection.h>
23#include <linux/bpf_lsm.h>
24#include <linux/btf_ids.h>
25
26#include "disasm.h"
27
28static const struct bpf_verifier_ops * const bpf_verifier_ops[] = {
29#define BPF_PROG_TYPE(_id, _name, prog_ctx_type, kern_ctx_type) \
30 [_id] = & _name ## _verifier_ops,
31#define BPF_MAP_TYPE(_id, _ops)
32#define BPF_LINK_TYPE(_id, _name)
33#include <linux/bpf_types.h>
34#undef BPF_PROG_TYPE
35#undef BPF_MAP_TYPE
36#undef BPF_LINK_TYPE
37};
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165struct bpf_verifier_stack_elem {
166
167
168
169
170 struct bpf_verifier_state st;
171 int insn_idx;
172 int prev_insn_idx;
173 struct bpf_verifier_stack_elem *next;
174
175 u32 log_pos;
176};
177
178#define BPF_COMPLEXITY_LIMIT_JMP_SEQ 8192
179#define BPF_COMPLEXITY_LIMIT_STATES 64
180
181#define BPF_MAP_KEY_POISON (1ULL << 63)
182#define BPF_MAP_KEY_SEEN (1ULL << 62)
183
184#define BPF_MAP_PTR_UNPRIV 1UL
185#define BPF_MAP_PTR_POISON ((void *)((0xeB9FUL << 1) + \
186 POISON_POINTER_DELTA))
187#define BPF_MAP_PTR(X) ((struct bpf_map *)((X) & ~BPF_MAP_PTR_UNPRIV))
188
189static bool bpf_map_ptr_poisoned(const struct bpf_insn_aux_data *aux)
190{
191 return BPF_MAP_PTR(aux->map_ptr_state) == BPF_MAP_PTR_POISON;
192}
193
194static bool bpf_map_ptr_unpriv(const struct bpf_insn_aux_data *aux)
195{
196 return aux->map_ptr_state & BPF_MAP_PTR_UNPRIV;
197}
198
199static void bpf_map_ptr_store(struct bpf_insn_aux_data *aux,
200 const struct bpf_map *map, bool unpriv)
201{
202 BUILD_BUG_ON((unsigned long)BPF_MAP_PTR_POISON & BPF_MAP_PTR_UNPRIV);
203 unpriv |= bpf_map_ptr_unpriv(aux);
204 aux->map_ptr_state = (unsigned long)map |
205 (unpriv ? BPF_MAP_PTR_UNPRIV : 0UL);
206}
207
208static bool bpf_map_key_poisoned(const struct bpf_insn_aux_data *aux)
209{
210 return aux->map_key_state & BPF_MAP_KEY_POISON;
211}
212
213static bool bpf_map_key_unseen(const struct bpf_insn_aux_data *aux)
214{
215 return !(aux->map_key_state & BPF_MAP_KEY_SEEN);
216}
217
218static u64 bpf_map_key_immediate(const struct bpf_insn_aux_data *aux)
219{
220 return aux->map_key_state & ~(BPF_MAP_KEY_SEEN | BPF_MAP_KEY_POISON);
221}
222
223static void bpf_map_key_store(struct bpf_insn_aux_data *aux, u64 state)
224{
225 bool poisoned = bpf_map_key_poisoned(aux);
226
227 aux->map_key_state = state | BPF_MAP_KEY_SEEN |
228 (poisoned ? BPF_MAP_KEY_POISON : 0ULL);
229}
230
231static bool bpf_pseudo_call(const struct bpf_insn *insn)
232{
233 return insn->code == (BPF_JMP | BPF_CALL) &&
234 insn->src_reg == BPF_PSEUDO_CALL;
235}
236
237static bool bpf_pseudo_kfunc_call(const struct bpf_insn *insn)
238{
239 return insn->code == (BPF_JMP | BPF_CALL) &&
240 insn->src_reg == BPF_PSEUDO_KFUNC_CALL;
241}
242
243static bool bpf_pseudo_func(const struct bpf_insn *insn)
244{
245 return insn->code == (BPF_LD | BPF_IMM | BPF_DW) &&
246 insn->src_reg == BPF_PSEUDO_FUNC;
247}
248
249struct bpf_call_arg_meta {
250 struct bpf_map *map_ptr;
251 bool raw_mode;
252 bool pkt_access;
253 int regno;
254 int access_size;
255 int mem_size;
256 u64 msize_max_value;
257 int ref_obj_id;
258 int func_id;
259 struct btf *btf;
260 u32 btf_id;
261 struct btf *ret_btf;
262 u32 ret_btf_id;
263 u32 subprogno;
264};
265
266struct btf *btf_vmlinux;
267
268static DEFINE_MUTEX(bpf_verifier_lock);
269
270static const struct bpf_line_info *
271find_linfo(const struct bpf_verifier_env *env, u32 insn_off)
272{
273 const struct bpf_line_info *linfo;
274 const struct bpf_prog *prog;
275 u32 i, nr_linfo;
276
277 prog = env->prog;
278 nr_linfo = prog->aux->nr_linfo;
279
280 if (!nr_linfo || insn_off >= prog->len)
281 return NULL;
282
283 linfo = prog->aux->linfo;
284 for (i = 1; i < nr_linfo; i++)
285 if (insn_off < linfo[i].insn_off)
286 break;
287
288 return &linfo[i - 1];
289}
290
291void bpf_verifier_vlog(struct bpf_verifier_log *log, const char *fmt,
292 va_list args)
293{
294 unsigned int n;
295
296 n = vscnprintf(log->kbuf, BPF_VERIFIER_TMP_LOG_SIZE, fmt, args);
297
298 WARN_ONCE(n >= BPF_VERIFIER_TMP_LOG_SIZE - 1,
299 "verifier log line truncated - local buffer too short\n");
300
301 n = min(log->len_total - log->len_used - 1, n);
302 log->kbuf[n] = '\0';
303
304 if (log->level == BPF_LOG_KERNEL) {
305 pr_err("BPF:%s\n", log->kbuf);
306 return;
307 }
308 if (!copy_to_user(log->ubuf + log->len_used, log->kbuf, n + 1))
309 log->len_used += n;
310 else
311 log->ubuf = NULL;
312}
313
314static void bpf_vlog_reset(struct bpf_verifier_log *log, u32 new_pos)
315{
316 char zero = 0;
317
318 if (!bpf_verifier_log_needed(log))
319 return;
320
321 log->len_used = new_pos;
322 if (put_user(zero, log->ubuf + new_pos))
323 log->ubuf = NULL;
324}
325
326
327
328
329
330__printf(2, 3) void bpf_verifier_log_write(struct bpf_verifier_env *env,
331 const char *fmt, ...)
332{
333 va_list args;
334
335 if (!bpf_verifier_log_needed(&env->log))
336 return;
337
338 va_start(args, fmt);
339 bpf_verifier_vlog(&env->log, fmt, args);
340 va_end(args);
341}
342EXPORT_SYMBOL_GPL(bpf_verifier_log_write);
343
344__printf(2, 3) static void verbose(void *private_data, const char *fmt, ...)
345{
346 struct bpf_verifier_env *env = private_data;
347 va_list args;
348
349 if (!bpf_verifier_log_needed(&env->log))
350 return;
351
352 va_start(args, fmt);
353 bpf_verifier_vlog(&env->log, fmt, args);
354 va_end(args);
355}
356
357__printf(2, 3) void bpf_log(struct bpf_verifier_log *log,
358 const char *fmt, ...)
359{
360 va_list args;
361
362 if (!bpf_verifier_log_needed(log))
363 return;
364
365 va_start(args, fmt);
366 bpf_verifier_vlog(log, fmt, args);
367 va_end(args);
368}
369
370static const char *ltrim(const char *s)
371{
372 while (isspace(*s))
373 s++;
374
375 return s;
376}
377
378__printf(3, 4) static void verbose_linfo(struct bpf_verifier_env *env,
379 u32 insn_off,
380 const char *prefix_fmt, ...)
381{
382 const struct bpf_line_info *linfo;
383
384 if (!bpf_verifier_log_needed(&env->log))
385 return;
386
387 linfo = find_linfo(env, insn_off);
388 if (!linfo || linfo == env->prev_linfo)
389 return;
390
391 if (prefix_fmt) {
392 va_list args;
393
394 va_start(args, prefix_fmt);
395 bpf_verifier_vlog(&env->log, prefix_fmt, args);
396 va_end(args);
397 }
398
399 verbose(env, "%s\n",
400 ltrim(btf_name_by_offset(env->prog->aux->btf,
401 linfo->line_off)));
402
403 env->prev_linfo = linfo;
404}
405
406static void verbose_invalid_scalar(struct bpf_verifier_env *env,
407 struct bpf_reg_state *reg,
408 struct tnum *range, const char *ctx,
409 const char *reg_name)
410{
411 char tn_buf[48];
412
413 verbose(env, "At %s the register %s ", ctx, reg_name);
414 if (!tnum_is_unknown(reg->var_off)) {
415 tnum_strn(tn_buf, sizeof(tn_buf), reg->var_off);
416 verbose(env, "has value %s", tn_buf);
417 } else {
418 verbose(env, "has unknown scalar value");
419 }
420 tnum_strn(tn_buf, sizeof(tn_buf), *range);
421 verbose(env, " should have been in %s\n", tn_buf);
422}
423
424static bool type_is_pkt_pointer(enum bpf_reg_type type)
425{
426 return type == PTR_TO_PACKET ||
427 type == PTR_TO_PACKET_META;
428}
429
430static bool type_is_sk_pointer(enum bpf_reg_type type)
431{
432 return type == PTR_TO_SOCKET ||
433 type == PTR_TO_SOCK_COMMON ||
434 type == PTR_TO_TCP_SOCK ||
435 type == PTR_TO_XDP_SOCK;
436}
437
438static bool reg_type_not_null(enum bpf_reg_type type)
439{
440 return type == PTR_TO_SOCKET ||
441 type == PTR_TO_TCP_SOCK ||
442 type == PTR_TO_MAP_VALUE ||
443 type == PTR_TO_MAP_KEY ||
444 type == PTR_TO_SOCK_COMMON;
445}
446
447static bool reg_type_may_be_null(enum bpf_reg_type type)
448{
449 return type == PTR_TO_MAP_VALUE_OR_NULL ||
450 type == PTR_TO_SOCKET_OR_NULL ||
451 type == PTR_TO_SOCK_COMMON_OR_NULL ||
452 type == PTR_TO_TCP_SOCK_OR_NULL ||
453 type == PTR_TO_BTF_ID_OR_NULL ||
454 type == PTR_TO_MEM_OR_NULL ||
455 type == PTR_TO_RDONLY_BUF_OR_NULL ||
456 type == PTR_TO_RDWR_BUF_OR_NULL;
457}
458
459static bool reg_may_point_to_spin_lock(const struct bpf_reg_state *reg)
460{
461 return reg->type == PTR_TO_MAP_VALUE &&
462 map_value_has_spin_lock(reg->map_ptr);
463}
464
465static bool reg_type_may_be_refcounted_or_null(enum bpf_reg_type type)
466{
467 return type == PTR_TO_SOCKET ||
468 type == PTR_TO_SOCKET_OR_NULL ||
469 type == PTR_TO_TCP_SOCK ||
470 type == PTR_TO_TCP_SOCK_OR_NULL ||
471 type == PTR_TO_MEM ||
472 type == PTR_TO_MEM_OR_NULL;
473}
474
475static bool arg_type_may_be_refcounted(enum bpf_arg_type type)
476{
477 return type == ARG_PTR_TO_SOCK_COMMON;
478}
479
480static bool arg_type_may_be_null(enum bpf_arg_type type)
481{
482 return type == ARG_PTR_TO_MAP_VALUE_OR_NULL ||
483 type == ARG_PTR_TO_MEM_OR_NULL ||
484 type == ARG_PTR_TO_CTX_OR_NULL ||
485 type == ARG_PTR_TO_SOCKET_OR_NULL ||
486 type == ARG_PTR_TO_ALLOC_MEM_OR_NULL ||
487 type == ARG_PTR_TO_STACK_OR_NULL;
488}
489
490
491
492
493
494static bool is_release_function(enum bpf_func_id func_id)
495{
496 return func_id == BPF_FUNC_sk_release ||
497 func_id == BPF_FUNC_ringbuf_submit ||
498 func_id == BPF_FUNC_ringbuf_discard;
499}
500
501static bool may_be_acquire_function(enum bpf_func_id func_id)
502{
503 return func_id == BPF_FUNC_sk_lookup_tcp ||
504 func_id == BPF_FUNC_sk_lookup_udp ||
505 func_id == BPF_FUNC_skc_lookup_tcp ||
506 func_id == BPF_FUNC_map_lookup_elem ||
507 func_id == BPF_FUNC_ringbuf_reserve;
508}
509
510static bool is_acquire_function(enum bpf_func_id func_id,
511 const struct bpf_map *map)
512{
513 enum bpf_map_type map_type = map ? map->map_type : BPF_MAP_TYPE_UNSPEC;
514
515 if (func_id == BPF_FUNC_sk_lookup_tcp ||
516 func_id == BPF_FUNC_sk_lookup_udp ||
517 func_id == BPF_FUNC_skc_lookup_tcp ||
518 func_id == BPF_FUNC_ringbuf_reserve)
519 return true;
520
521 if (func_id == BPF_FUNC_map_lookup_elem &&
522 (map_type == BPF_MAP_TYPE_SOCKMAP ||
523 map_type == BPF_MAP_TYPE_SOCKHASH))
524 return true;
525
526 return false;
527}
528
529static bool is_ptr_cast_function(enum bpf_func_id func_id)
530{
531 return func_id == BPF_FUNC_tcp_sock ||
532 func_id == BPF_FUNC_sk_fullsock ||
533 func_id == BPF_FUNC_skc_to_tcp_sock ||
534 func_id == BPF_FUNC_skc_to_tcp6_sock ||
535 func_id == BPF_FUNC_skc_to_udp6_sock ||
536 func_id == BPF_FUNC_skc_to_tcp_timewait_sock ||
537 func_id == BPF_FUNC_skc_to_tcp_request_sock;
538}
539
540static bool is_cmpxchg_insn(const struct bpf_insn *insn)
541{
542 return BPF_CLASS(insn->code) == BPF_STX &&
543 BPF_MODE(insn->code) == BPF_ATOMIC &&
544 insn->imm == BPF_CMPXCHG;
545}
546
547
548static const char * const reg_type_str[] = {
549 [NOT_INIT] = "?",
550 [SCALAR_VALUE] = "inv",
551 [PTR_TO_CTX] = "ctx",
552 [CONST_PTR_TO_MAP] = "map_ptr",
553 [PTR_TO_MAP_VALUE] = "map_value",
554 [PTR_TO_MAP_VALUE_OR_NULL] = "map_value_or_null",
555 [PTR_TO_STACK] = "fp",
556 [PTR_TO_PACKET] = "pkt",
557 [PTR_TO_PACKET_META] = "pkt_meta",
558 [PTR_TO_PACKET_END] = "pkt_end",
559 [PTR_TO_FLOW_KEYS] = "flow_keys",
560 [PTR_TO_SOCKET] = "sock",
561 [PTR_TO_SOCKET_OR_NULL] = "sock_or_null",
562 [PTR_TO_SOCK_COMMON] = "sock_common",
563 [PTR_TO_SOCK_COMMON_OR_NULL] = "sock_common_or_null",
564 [PTR_TO_TCP_SOCK] = "tcp_sock",
565 [PTR_TO_TCP_SOCK_OR_NULL] = "tcp_sock_or_null",
566 [PTR_TO_TP_BUFFER] = "tp_buffer",
567 [PTR_TO_XDP_SOCK] = "xdp_sock",
568 [PTR_TO_BTF_ID] = "ptr_",
569 [PTR_TO_BTF_ID_OR_NULL] = "ptr_or_null_",
570 [PTR_TO_PERCPU_BTF_ID] = "percpu_ptr_",
571 [PTR_TO_MEM] = "mem",
572 [PTR_TO_MEM_OR_NULL] = "mem_or_null",
573 [PTR_TO_RDONLY_BUF] = "rdonly_buf",
574 [PTR_TO_RDONLY_BUF_OR_NULL] = "rdonly_buf_or_null",
575 [PTR_TO_RDWR_BUF] = "rdwr_buf",
576 [PTR_TO_RDWR_BUF_OR_NULL] = "rdwr_buf_or_null",
577 [PTR_TO_FUNC] = "func",
578 [PTR_TO_MAP_KEY] = "map_key",
579};
580
581static char slot_type_char[] = {
582 [STACK_INVALID] = '?',
583 [STACK_SPILL] = 'r',
584 [STACK_MISC] = 'm',
585 [STACK_ZERO] = '0',
586};
587
588static void print_liveness(struct bpf_verifier_env *env,
589 enum bpf_reg_liveness live)
590{
591 if (live & (REG_LIVE_READ | REG_LIVE_WRITTEN | REG_LIVE_DONE))
592 verbose(env, "_");
593 if (live & REG_LIVE_READ)
594 verbose(env, "r");
595 if (live & REG_LIVE_WRITTEN)
596 verbose(env, "w");
597 if (live & REG_LIVE_DONE)
598 verbose(env, "D");
599}
600
601static struct bpf_func_state *func(struct bpf_verifier_env *env,
602 const struct bpf_reg_state *reg)
603{
604 struct bpf_verifier_state *cur = env->cur_state;
605
606 return cur->frame[reg->frameno];
607}
608
609static const char *kernel_type_name(const struct btf* btf, u32 id)
610{
611 return btf_name_by_offset(btf, btf_type_by_id(btf, id)->name_off);
612}
613
614static void print_verifier_state(struct bpf_verifier_env *env,
615 const struct bpf_func_state *state)
616{
617 const struct bpf_reg_state *reg;
618 enum bpf_reg_type t;
619 int i;
620
621 if (state->frameno)
622 verbose(env, " frame%d:", state->frameno);
623 for (i = 0; i < MAX_BPF_REG; i++) {
624 reg = &state->regs[i];
625 t = reg->type;
626 if (t == NOT_INIT)
627 continue;
628 verbose(env, " R%d", i);
629 print_liveness(env, reg->live);
630 verbose(env, "=%s", reg_type_str[t]);
631 if (t == SCALAR_VALUE && reg->precise)
632 verbose(env, "P");
633 if ((t == SCALAR_VALUE || t == PTR_TO_STACK) &&
634 tnum_is_const(reg->var_off)) {
635
636 verbose(env, "%lld", reg->var_off.value + reg->off);
637 } else {
638 if (t == PTR_TO_BTF_ID ||
639 t == PTR_TO_BTF_ID_OR_NULL ||
640 t == PTR_TO_PERCPU_BTF_ID)
641 verbose(env, "%s", kernel_type_name(reg->btf, reg->btf_id));
642 verbose(env, "(id=%d", reg->id);
643 if (reg_type_may_be_refcounted_or_null(t))
644 verbose(env, ",ref_obj_id=%d", reg->ref_obj_id);
645 if (t != SCALAR_VALUE)
646 verbose(env, ",off=%d", reg->off);
647 if (type_is_pkt_pointer(t))
648 verbose(env, ",r=%d", reg->range);
649 else if (t == CONST_PTR_TO_MAP ||
650 t == PTR_TO_MAP_KEY ||
651 t == PTR_TO_MAP_VALUE ||
652 t == PTR_TO_MAP_VALUE_OR_NULL)
653 verbose(env, ",ks=%d,vs=%d",
654 reg->map_ptr->key_size,
655 reg->map_ptr->value_size);
656 if (tnum_is_const(reg->var_off)) {
657
658
659
660
661 verbose(env, ",imm=%llx", reg->var_off.value);
662 } else {
663 if (reg->smin_value != reg->umin_value &&
664 reg->smin_value != S64_MIN)
665 verbose(env, ",smin_value=%lld",
666 (long long)reg->smin_value);
667 if (reg->smax_value != reg->umax_value &&
668 reg->smax_value != S64_MAX)
669 verbose(env, ",smax_value=%lld",
670 (long long)reg->smax_value);
671 if (reg->umin_value != 0)
672 verbose(env, ",umin_value=%llu",
673 (unsigned long long)reg->umin_value);
674 if (reg->umax_value != U64_MAX)
675 verbose(env, ",umax_value=%llu",
676 (unsigned long long)reg->umax_value);
677 if (!tnum_is_unknown(reg->var_off)) {
678 char tn_buf[48];
679
680 tnum_strn(tn_buf, sizeof(tn_buf), reg->var_off);
681 verbose(env, ",var_off=%s", tn_buf);
682 }
683 if (reg->s32_min_value != reg->smin_value &&
684 reg->s32_min_value != S32_MIN)
685 verbose(env, ",s32_min_value=%d",
686 (int)(reg->s32_min_value));
687 if (reg->s32_max_value != reg->smax_value &&
688 reg->s32_max_value != S32_MAX)
689 verbose(env, ",s32_max_value=%d",
690 (int)(reg->s32_max_value));
691 if (reg->u32_min_value != reg->umin_value &&
692 reg->u32_min_value != U32_MIN)
693 verbose(env, ",u32_min_value=%d",
694 (int)(reg->u32_min_value));
695 if (reg->u32_max_value != reg->umax_value &&
696 reg->u32_max_value != U32_MAX)
697 verbose(env, ",u32_max_value=%d",
698 (int)(reg->u32_max_value));
699 }
700 verbose(env, ")");
701 }
702 }
703 for (i = 0; i < state->allocated_stack / BPF_REG_SIZE; i++) {
704 char types_buf[BPF_REG_SIZE + 1];
705 bool valid = false;
706 int j;
707
708 for (j = 0; j < BPF_REG_SIZE; j++) {
709 if (state->stack[i].slot_type[j] != STACK_INVALID)
710 valid = true;
711 types_buf[j] = slot_type_char[
712 state->stack[i].slot_type[j]];
713 }
714 types_buf[BPF_REG_SIZE] = 0;
715 if (!valid)
716 continue;
717 verbose(env, " fp%d", (-i - 1) * BPF_REG_SIZE);
718 print_liveness(env, state->stack[i].spilled_ptr.live);
719 if (state->stack[i].slot_type[0] == STACK_SPILL) {
720 reg = &state->stack[i].spilled_ptr;
721 t = reg->type;
722 verbose(env, "=%s", reg_type_str[t]);
723 if (t == SCALAR_VALUE && reg->precise)
724 verbose(env, "P");
725 if (t == SCALAR_VALUE && tnum_is_const(reg->var_off))
726 verbose(env, "%lld", reg->var_off.value + reg->off);
727 } else {
728 verbose(env, "=%s", types_buf);
729 }
730 }
731 if (state->acquired_refs && state->refs[0].id) {
732 verbose(env, " refs=%d", state->refs[0].id);
733 for (i = 1; i < state->acquired_refs; i++)
734 if (state->refs[i].id)
735 verbose(env, ",%d", state->refs[i].id);
736 }
737 verbose(env, "\n");
738}
739
740#define COPY_STATE_FN(NAME, COUNT, FIELD, SIZE) \
741static int copy_##NAME##_state(struct bpf_func_state *dst, \
742 const struct bpf_func_state *src) \
743{ \
744 if (!src->FIELD) \
745 return 0; \
746 if (WARN_ON_ONCE(dst->COUNT < src->COUNT)) { \
747 \
748 memset(dst, 0, sizeof(*dst)); \
749 return -EFAULT; \
750 } \
751 memcpy(dst->FIELD, src->FIELD, \
752 sizeof(*src->FIELD) * (src->COUNT / SIZE)); \
753 return 0; \
754}
755
756COPY_STATE_FN(reference, acquired_refs, refs, 1)
757
758COPY_STATE_FN(stack, allocated_stack, stack, BPF_REG_SIZE)
759#undef COPY_STATE_FN
760
761#define REALLOC_STATE_FN(NAME, COUNT, FIELD, SIZE) \
762static int realloc_##NAME##_state(struct bpf_func_state *state, int size, \
763 bool copy_old) \
764{ \
765 u32 old_size = state->COUNT; \
766 struct bpf_##NAME##_state *new_##FIELD; \
767 int slot = size / SIZE; \
768 \
769 if (size <= old_size || !size) { \
770 if (copy_old) \
771 return 0; \
772 state->COUNT = slot * SIZE; \
773 if (!size && old_size) { \
774 kfree(state->FIELD); \
775 state->FIELD = NULL; \
776 } \
777 return 0; \
778 } \
779 new_##FIELD = kmalloc_array(slot, sizeof(struct bpf_##NAME##_state), \
780 GFP_KERNEL); \
781 if (!new_##FIELD) \
782 return -ENOMEM; \
783 if (copy_old) { \
784 if (state->FIELD) \
785 memcpy(new_##FIELD, state->FIELD, \
786 sizeof(*new_##FIELD) * (old_size / SIZE)); \
787 memset(new_##FIELD + old_size / SIZE, 0, \
788 sizeof(*new_##FIELD) * (size - old_size) / SIZE); \
789 } \
790 state->COUNT = slot * SIZE; \
791 kfree(state->FIELD); \
792 state->FIELD = new_##FIELD; \
793 return 0; \
794}
795
796REALLOC_STATE_FN(reference, acquired_refs, refs, 1)
797
798REALLOC_STATE_FN(stack, allocated_stack, stack, BPF_REG_SIZE)
799#undef REALLOC_STATE_FN
800
801
802
803
804
805
806
807
808static int realloc_func_state(struct bpf_func_state *state, int stack_size,
809 int refs_size, bool copy_old)
810{
811 int err = realloc_reference_state(state, refs_size, copy_old);
812 if (err)
813 return err;
814 return realloc_stack_state(state, stack_size, copy_old);
815}
816
817
818
819
820
821
822static int acquire_reference_state(struct bpf_verifier_env *env, int insn_idx)
823{
824 struct bpf_func_state *state = cur_func(env);
825 int new_ofs = state->acquired_refs;
826 int id, err;
827
828 err = realloc_reference_state(state, state->acquired_refs + 1, true);
829 if (err)
830 return err;
831 id = ++env->id_gen;
832 state->refs[new_ofs].id = id;
833 state->refs[new_ofs].insn_idx = insn_idx;
834
835 return id;
836}
837
838
839static int release_reference_state(struct bpf_func_state *state, int ptr_id)
840{
841 int i, last_idx;
842
843 last_idx = state->acquired_refs - 1;
844 for (i = 0; i < state->acquired_refs; i++) {
845 if (state->refs[i].id == ptr_id) {
846 if (last_idx && i != last_idx)
847 memcpy(&state->refs[i], &state->refs[last_idx],
848 sizeof(*state->refs));
849 memset(&state->refs[last_idx], 0, sizeof(*state->refs));
850 state->acquired_refs--;
851 return 0;
852 }
853 }
854 return -EINVAL;
855}
856
857static int transfer_reference_state(struct bpf_func_state *dst,
858 struct bpf_func_state *src)
859{
860 int err = realloc_reference_state(dst, src->acquired_refs, false);
861 if (err)
862 return err;
863 err = copy_reference_state(dst, src);
864 if (err)
865 return err;
866 return 0;
867}
868
869static void free_func_state(struct bpf_func_state *state)
870{
871 if (!state)
872 return;
873 kfree(state->refs);
874 kfree(state->stack);
875 kfree(state);
876}
877
878static void clear_jmp_history(struct bpf_verifier_state *state)
879{
880 kfree(state->jmp_history);
881 state->jmp_history = NULL;
882 state->jmp_history_cnt = 0;
883}
884
885static void free_verifier_state(struct bpf_verifier_state *state,
886 bool free_self)
887{
888 int i;
889
890 for (i = 0; i <= state->curframe; i++) {
891 free_func_state(state->frame[i]);
892 state->frame[i] = NULL;
893 }
894 clear_jmp_history(state);
895 if (free_self)
896 kfree(state);
897}
898
899
900
901
902static int copy_func_state(struct bpf_func_state *dst,
903 const struct bpf_func_state *src)
904{
905 int err;
906
907 err = realloc_func_state(dst, src->allocated_stack, src->acquired_refs,
908 false);
909 if (err)
910 return err;
911 memcpy(dst, src, offsetof(struct bpf_func_state, acquired_refs));
912 err = copy_reference_state(dst, src);
913 if (err)
914 return err;
915 return copy_stack_state(dst, src);
916}
917
918static int copy_verifier_state(struct bpf_verifier_state *dst_state,
919 const struct bpf_verifier_state *src)
920{
921 struct bpf_func_state *dst;
922 u32 jmp_sz = sizeof(struct bpf_idx_pair) * src->jmp_history_cnt;
923 int i, err;
924
925 if (dst_state->jmp_history_cnt < src->jmp_history_cnt) {
926 kfree(dst_state->jmp_history);
927 dst_state->jmp_history = kmalloc(jmp_sz, GFP_USER);
928 if (!dst_state->jmp_history)
929 return -ENOMEM;
930 }
931 memcpy(dst_state->jmp_history, src->jmp_history, jmp_sz);
932 dst_state->jmp_history_cnt = src->jmp_history_cnt;
933
934
935 for (i = src->curframe + 1; i <= dst_state->curframe; i++) {
936 free_func_state(dst_state->frame[i]);
937 dst_state->frame[i] = NULL;
938 }
939 dst_state->speculative = src->speculative;
940 dst_state->curframe = src->curframe;
941 dst_state->active_spin_lock = src->active_spin_lock;
942 dst_state->branches = src->branches;
943 dst_state->parent = src->parent;
944 dst_state->first_insn_idx = src->first_insn_idx;
945 dst_state->last_insn_idx = src->last_insn_idx;
946 for (i = 0; i <= src->curframe; i++) {
947 dst = dst_state->frame[i];
948 if (!dst) {
949 dst = kzalloc(sizeof(*dst), GFP_KERNEL);
950 if (!dst)
951 return -ENOMEM;
952 dst_state->frame[i] = dst;
953 }
954 err = copy_func_state(dst, src->frame[i]);
955 if (err)
956 return err;
957 }
958 return 0;
959}
960
961static void update_branch_counts(struct bpf_verifier_env *env, struct bpf_verifier_state *st)
962{
963 while (st) {
964 u32 br = --st->branches;
965
966
967
968
969 WARN_ONCE((int)br < 0,
970 "BUG update_branch_counts:branches_to_explore=%d\n",
971 br);
972 if (br)
973 break;
974 st = st->parent;
975 }
976}
977
978static int pop_stack(struct bpf_verifier_env *env, int *prev_insn_idx,
979 int *insn_idx, bool pop_log)
980{
981 struct bpf_verifier_state *cur = env->cur_state;
982 struct bpf_verifier_stack_elem *elem, *head = env->head;
983 int err;
984
985 if (env->head == NULL)
986 return -ENOENT;
987
988 if (cur) {
989 err = copy_verifier_state(cur, &head->st);
990 if (err)
991 return err;
992 }
993 if (pop_log)
994 bpf_vlog_reset(&env->log, head->log_pos);
995 if (insn_idx)
996 *insn_idx = head->insn_idx;
997 if (prev_insn_idx)
998 *prev_insn_idx = head->prev_insn_idx;
999 elem = head->next;
1000 free_verifier_state(&head->st, false);
1001 kfree(head);
1002 env->head = elem;
1003 env->stack_size--;
1004 return 0;
1005}
1006
1007static struct bpf_verifier_state *push_stack(struct bpf_verifier_env *env,
1008 int insn_idx, int prev_insn_idx,
1009 bool speculative)
1010{
1011 struct bpf_verifier_state *cur = env->cur_state;
1012 struct bpf_verifier_stack_elem *elem;
1013 int err;
1014
1015 elem = kzalloc(sizeof(struct bpf_verifier_stack_elem), GFP_KERNEL);
1016 if (!elem)
1017 goto err;
1018
1019 elem->insn_idx = insn_idx;
1020 elem->prev_insn_idx = prev_insn_idx;
1021 elem->next = env->head;
1022 elem->log_pos = env->log.len_used;
1023 env->head = elem;
1024 env->stack_size++;
1025 err = copy_verifier_state(&elem->st, cur);
1026 if (err)
1027 goto err;
1028 elem->st.speculative |= speculative;
1029 if (env->stack_size > BPF_COMPLEXITY_LIMIT_JMP_SEQ) {
1030 verbose(env, "The sequence of %d jumps is too complex.\n",
1031 env->stack_size);
1032 goto err;
1033 }
1034 if (elem->st.parent) {
1035 ++elem->st.parent->branches;
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045 }
1046 return &elem->st;
1047err:
1048 free_verifier_state(env->cur_state, true);
1049 env->cur_state = NULL;
1050
1051 while (!pop_stack(env, NULL, NULL, false));
1052 return NULL;
1053}
1054
1055#define CALLER_SAVED_REGS 6
1056static const int caller_saved[CALLER_SAVED_REGS] = {
1057 BPF_REG_0, BPF_REG_1, BPF_REG_2, BPF_REG_3, BPF_REG_4, BPF_REG_5
1058};
1059
1060static void __mark_reg_not_init(const struct bpf_verifier_env *env,
1061 struct bpf_reg_state *reg);
1062
1063
1064static void ___mark_reg_known(struct bpf_reg_state *reg, u64 imm)
1065{
1066 reg->var_off = tnum_const(imm);
1067 reg->smin_value = (s64)imm;
1068 reg->smax_value = (s64)imm;
1069 reg->umin_value = imm;
1070 reg->umax_value = imm;
1071
1072 reg->s32_min_value = (s32)imm;
1073 reg->s32_max_value = (s32)imm;
1074 reg->u32_min_value = (u32)imm;
1075 reg->u32_max_value = (u32)imm;
1076}
1077
1078
1079
1080
1081static void __mark_reg_known(struct bpf_reg_state *reg, u64 imm)
1082{
1083
1084 memset(((u8 *)reg) + sizeof(reg->type), 0,
1085 offsetof(struct bpf_reg_state, var_off) - sizeof(reg->type));
1086 ___mark_reg_known(reg, imm);
1087}
1088
1089static void __mark_reg32_known(struct bpf_reg_state *reg, u64 imm)
1090{
1091 reg->var_off = tnum_const_subreg(reg->var_off, imm);
1092 reg->s32_min_value = (s32)imm;
1093 reg->s32_max_value = (s32)imm;
1094 reg->u32_min_value = (u32)imm;
1095 reg->u32_max_value = (u32)imm;
1096}
1097
1098
1099
1100
1101static void __mark_reg_known_zero(struct bpf_reg_state *reg)
1102{
1103 __mark_reg_known(reg, 0);
1104}
1105
1106static void __mark_reg_const_zero(struct bpf_reg_state *reg)
1107{
1108 __mark_reg_known(reg, 0);
1109 reg->type = SCALAR_VALUE;
1110}
1111
1112static void mark_reg_known_zero(struct bpf_verifier_env *env,
1113 struct bpf_reg_state *regs, u32 regno)
1114{
1115 if (WARN_ON(regno >= MAX_BPF_REG)) {
1116 verbose(env, "mark_reg_known_zero(regs, %u)\n", regno);
1117
1118 for (regno = 0; regno < MAX_BPF_REG; regno++)
1119 __mark_reg_not_init(env, regs + regno);
1120 return;
1121 }
1122 __mark_reg_known_zero(regs + regno);
1123}
1124
1125static void mark_ptr_not_null_reg(struct bpf_reg_state *reg)
1126{
1127 switch (reg->type) {
1128 case PTR_TO_MAP_VALUE_OR_NULL: {
1129 const struct bpf_map *map = reg->map_ptr;
1130
1131 if (map->inner_map_meta) {
1132 reg->type = CONST_PTR_TO_MAP;
1133 reg->map_ptr = map->inner_map_meta;
1134 } else if (map->map_type == BPF_MAP_TYPE_XSKMAP) {
1135 reg->type = PTR_TO_XDP_SOCK;
1136 } else if (map->map_type == BPF_MAP_TYPE_SOCKMAP ||
1137 map->map_type == BPF_MAP_TYPE_SOCKHASH) {
1138 reg->type = PTR_TO_SOCKET;
1139 } else {
1140 reg->type = PTR_TO_MAP_VALUE;
1141 }
1142 break;
1143 }
1144 case PTR_TO_SOCKET_OR_NULL:
1145 reg->type = PTR_TO_SOCKET;
1146 break;
1147 case PTR_TO_SOCK_COMMON_OR_NULL:
1148 reg->type = PTR_TO_SOCK_COMMON;
1149 break;
1150 case PTR_TO_TCP_SOCK_OR_NULL:
1151 reg->type = PTR_TO_TCP_SOCK;
1152 break;
1153 case PTR_TO_BTF_ID_OR_NULL:
1154 reg->type = PTR_TO_BTF_ID;
1155 break;
1156 case PTR_TO_MEM_OR_NULL:
1157 reg->type = PTR_TO_MEM;
1158 break;
1159 case PTR_TO_RDONLY_BUF_OR_NULL:
1160 reg->type = PTR_TO_RDONLY_BUF;
1161 break;
1162 case PTR_TO_RDWR_BUF_OR_NULL:
1163 reg->type = PTR_TO_RDWR_BUF;
1164 break;
1165 default:
1166 WARN_ONCE(1, "unknown nullable register type");
1167 }
1168}
1169
1170static bool reg_is_pkt_pointer(const struct bpf_reg_state *reg)
1171{
1172 return type_is_pkt_pointer(reg->type);
1173}
1174
1175static bool reg_is_pkt_pointer_any(const struct bpf_reg_state *reg)
1176{
1177 return reg_is_pkt_pointer(reg) ||
1178 reg->type == PTR_TO_PACKET_END;
1179}
1180
1181
1182static bool reg_is_init_pkt_pointer(const struct bpf_reg_state *reg,
1183 enum bpf_reg_type which)
1184{
1185
1186
1187
1188
1189 return reg->type == which &&
1190 reg->id == 0 &&
1191 reg->off == 0 &&
1192 tnum_equals_const(reg->var_off, 0);
1193}
1194
1195
1196static void __mark_reg_unbounded(struct bpf_reg_state *reg)
1197{
1198 reg->smin_value = S64_MIN;
1199 reg->smax_value = S64_MAX;
1200 reg->umin_value = 0;
1201 reg->umax_value = U64_MAX;
1202
1203 reg->s32_min_value = S32_MIN;
1204 reg->s32_max_value = S32_MAX;
1205 reg->u32_min_value = 0;
1206 reg->u32_max_value = U32_MAX;
1207}
1208
1209static void __mark_reg64_unbounded(struct bpf_reg_state *reg)
1210{
1211 reg->smin_value = S64_MIN;
1212 reg->smax_value = S64_MAX;
1213 reg->umin_value = 0;
1214 reg->umax_value = U64_MAX;
1215}
1216
1217static void __mark_reg32_unbounded(struct bpf_reg_state *reg)
1218{
1219 reg->s32_min_value = S32_MIN;
1220 reg->s32_max_value = S32_MAX;
1221 reg->u32_min_value = 0;
1222 reg->u32_max_value = U32_MAX;
1223}
1224
1225static void __update_reg32_bounds(struct bpf_reg_state *reg)
1226{
1227 struct tnum var32_off = tnum_subreg(reg->var_off);
1228
1229
1230 reg->s32_min_value = max_t(s32, reg->s32_min_value,
1231 var32_off.value | (var32_off.mask & S32_MIN));
1232
1233 reg->s32_max_value = min_t(s32, reg->s32_max_value,
1234 var32_off.value | (var32_off.mask & S32_MAX));
1235 reg->u32_min_value = max_t(u32, reg->u32_min_value, (u32)var32_off.value);
1236 reg->u32_max_value = min(reg->u32_max_value,
1237 (u32)(var32_off.value | var32_off.mask));
1238}
1239
1240static void __update_reg64_bounds(struct bpf_reg_state *reg)
1241{
1242
1243 reg->smin_value = max_t(s64, reg->smin_value,
1244 reg->var_off.value | (reg->var_off.mask & S64_MIN));
1245
1246 reg->smax_value = min_t(s64, reg->smax_value,
1247 reg->var_off.value | (reg->var_off.mask & S64_MAX));
1248 reg->umin_value = max(reg->umin_value, reg->var_off.value);
1249 reg->umax_value = min(reg->umax_value,
1250 reg->var_off.value | reg->var_off.mask);
1251}
1252
1253static void __update_reg_bounds(struct bpf_reg_state *reg)
1254{
1255 __update_reg32_bounds(reg);
1256 __update_reg64_bounds(reg);
1257}
1258
1259
1260static void __reg32_deduce_bounds(struct bpf_reg_state *reg)
1261{
1262
1263
1264
1265
1266
1267 if (reg->s32_min_value >= 0 || reg->s32_max_value < 0) {
1268 reg->s32_min_value = reg->u32_min_value =
1269 max_t(u32, reg->s32_min_value, reg->u32_min_value);
1270 reg->s32_max_value = reg->u32_max_value =
1271 min_t(u32, reg->s32_max_value, reg->u32_max_value);
1272 return;
1273 }
1274
1275
1276
1277 if ((s32)reg->u32_max_value >= 0) {
1278
1279
1280
1281 reg->s32_min_value = reg->u32_min_value;
1282 reg->s32_max_value = reg->u32_max_value =
1283 min_t(u32, reg->s32_max_value, reg->u32_max_value);
1284 } else if ((s32)reg->u32_min_value < 0) {
1285
1286
1287
1288 reg->s32_min_value = reg->u32_min_value =
1289 max_t(u32, reg->s32_min_value, reg->u32_min_value);
1290 reg->s32_max_value = reg->u32_max_value;
1291 }
1292}
1293
1294static void __reg64_deduce_bounds(struct bpf_reg_state *reg)
1295{
1296
1297
1298
1299
1300
1301 if (reg->smin_value >= 0 || reg->smax_value < 0) {
1302 reg->smin_value = reg->umin_value = max_t(u64, reg->smin_value,
1303 reg->umin_value);
1304 reg->smax_value = reg->umax_value = min_t(u64, reg->smax_value,
1305 reg->umax_value);
1306 return;
1307 }
1308
1309
1310
1311 if ((s64)reg->umax_value >= 0) {
1312
1313
1314
1315 reg->smin_value = reg->umin_value;
1316 reg->smax_value = reg->umax_value = min_t(u64, reg->smax_value,
1317 reg->umax_value);
1318 } else if ((s64)reg->umin_value < 0) {
1319
1320
1321
1322 reg->smin_value = reg->umin_value = max_t(u64, reg->smin_value,
1323 reg->umin_value);
1324 reg->smax_value = reg->umax_value;
1325 }
1326}
1327
1328static void __reg_deduce_bounds(struct bpf_reg_state *reg)
1329{
1330 __reg32_deduce_bounds(reg);
1331 __reg64_deduce_bounds(reg);
1332}
1333
1334
1335static void __reg_bound_offset(struct bpf_reg_state *reg)
1336{
1337 struct tnum var64_off = tnum_intersect(reg->var_off,
1338 tnum_range(reg->umin_value,
1339 reg->umax_value));
1340 struct tnum var32_off = tnum_intersect(tnum_subreg(reg->var_off),
1341 tnum_range(reg->u32_min_value,
1342 reg->u32_max_value));
1343
1344 reg->var_off = tnum_or(tnum_clear_subreg(var64_off), var32_off);
1345}
1346
1347static void __reg_assign_32_into_64(struct bpf_reg_state *reg)
1348{
1349 reg->umin_value = reg->u32_min_value;
1350 reg->umax_value = reg->u32_max_value;
1351
1352
1353
1354
1355 if (reg->s32_min_value >= 0 && reg->s32_max_value >= 0)
1356 reg->smax_value = reg->s32_max_value;
1357 else
1358 reg->smax_value = U32_MAX;
1359 if (reg->s32_min_value >= 0)
1360 reg->smin_value = reg->s32_min_value;
1361 else
1362 reg->smin_value = 0;
1363}
1364
1365static void __reg_combine_32_into_64(struct bpf_reg_state *reg)
1366{
1367
1368
1369
1370
1371 if (tnum_equals_const(tnum_clear_subreg(reg->var_off), 0)) {
1372 __reg_assign_32_into_64(reg);
1373 } else {
1374
1375
1376
1377
1378
1379
1380
1381 __mark_reg64_unbounded(reg);
1382 __update_reg_bounds(reg);
1383 }
1384
1385
1386
1387
1388
1389 __reg_deduce_bounds(reg);
1390 __reg_bound_offset(reg);
1391 __update_reg_bounds(reg);
1392}
1393
1394static bool __reg64_bound_s32(s64 a)
1395{
1396 return a > S32_MIN && a < S32_MAX;
1397}
1398
1399static bool __reg64_bound_u32(u64 a)
1400{
1401 return a > U32_MIN && a < U32_MAX;
1402}
1403
1404static void __reg_combine_64_into_32(struct bpf_reg_state *reg)
1405{
1406 __mark_reg32_unbounded(reg);
1407
1408 if (__reg64_bound_s32(reg->smin_value) && __reg64_bound_s32(reg->smax_value)) {
1409 reg->s32_min_value = (s32)reg->smin_value;
1410 reg->s32_max_value = (s32)reg->smax_value;
1411 }
1412 if (__reg64_bound_u32(reg->umin_value) && __reg64_bound_u32(reg->umax_value)) {
1413 reg->u32_min_value = (u32)reg->umin_value;
1414 reg->u32_max_value = (u32)reg->umax_value;
1415 }
1416
1417
1418
1419
1420
1421 __reg_deduce_bounds(reg);
1422 __reg_bound_offset(reg);
1423 __update_reg_bounds(reg);
1424}
1425
1426
1427static void __mark_reg_unknown(const struct bpf_verifier_env *env,
1428 struct bpf_reg_state *reg)
1429{
1430
1431
1432
1433
1434 memset(reg, 0, offsetof(struct bpf_reg_state, var_off));
1435 reg->type = SCALAR_VALUE;
1436 reg->var_off = tnum_unknown;
1437 reg->frameno = 0;
1438 reg->precise = env->subprog_cnt > 1 || !env->bpf_capable;
1439 __mark_reg_unbounded(reg);
1440}
1441
1442static void mark_reg_unknown(struct bpf_verifier_env *env,
1443 struct bpf_reg_state *regs, u32 regno)
1444{
1445 if (WARN_ON(regno >= MAX_BPF_REG)) {
1446 verbose(env, "mark_reg_unknown(regs, %u)\n", regno);
1447
1448 for (regno = 0; regno < BPF_REG_FP; regno++)
1449 __mark_reg_not_init(env, regs + regno);
1450 return;
1451 }
1452 __mark_reg_unknown(env, regs + regno);
1453}
1454
1455static void __mark_reg_not_init(const struct bpf_verifier_env *env,
1456 struct bpf_reg_state *reg)
1457{
1458 __mark_reg_unknown(env, reg);
1459 reg->type = NOT_INIT;
1460}
1461
1462static void mark_reg_not_init(struct bpf_verifier_env *env,
1463 struct bpf_reg_state *regs, u32 regno)
1464{
1465 if (WARN_ON(regno >= MAX_BPF_REG)) {
1466 verbose(env, "mark_reg_not_init(regs, %u)\n", regno);
1467
1468 for (regno = 0; regno < BPF_REG_FP; regno++)
1469 __mark_reg_not_init(env, regs + regno);
1470 return;
1471 }
1472 __mark_reg_not_init(env, regs + regno);
1473}
1474
1475static void mark_btf_ld_reg(struct bpf_verifier_env *env,
1476 struct bpf_reg_state *regs, u32 regno,
1477 enum bpf_reg_type reg_type,
1478 struct btf *btf, u32 btf_id)
1479{
1480 if (reg_type == SCALAR_VALUE) {
1481 mark_reg_unknown(env, regs, regno);
1482 return;
1483 }
1484 mark_reg_known_zero(env, regs, regno);
1485 regs[regno].type = PTR_TO_BTF_ID;
1486 regs[regno].btf = btf;
1487 regs[regno].btf_id = btf_id;
1488}
1489
1490#define DEF_NOT_SUBREG (0)
1491static void init_reg_state(struct bpf_verifier_env *env,
1492 struct bpf_func_state *state)
1493{
1494 struct bpf_reg_state *regs = state->regs;
1495 int i;
1496
1497 for (i = 0; i < MAX_BPF_REG; i++) {
1498 mark_reg_not_init(env, regs, i);
1499 regs[i].live = REG_LIVE_NONE;
1500 regs[i].parent = NULL;
1501 regs[i].subreg_def = DEF_NOT_SUBREG;
1502 }
1503
1504
1505 regs[BPF_REG_FP].type = PTR_TO_STACK;
1506 mark_reg_known_zero(env, regs, BPF_REG_FP);
1507 regs[BPF_REG_FP].frameno = state->frameno;
1508}
1509
1510#define BPF_MAIN_FUNC (-1)
1511static void init_func_state(struct bpf_verifier_env *env,
1512 struct bpf_func_state *state,
1513 int callsite, int frameno, int subprogno)
1514{
1515 state->callsite = callsite;
1516 state->frameno = frameno;
1517 state->subprogno = subprogno;
1518 init_reg_state(env, state);
1519}
1520
1521enum reg_arg_type {
1522 SRC_OP,
1523 DST_OP,
1524 DST_OP_NO_MARK
1525};
1526
1527static int cmp_subprogs(const void *a, const void *b)
1528{
1529 return ((struct bpf_subprog_info *)a)->start -
1530 ((struct bpf_subprog_info *)b)->start;
1531}
1532
1533static int find_subprog(struct bpf_verifier_env *env, int off)
1534{
1535 struct bpf_subprog_info *p;
1536
1537 p = bsearch(&off, env->subprog_info, env->subprog_cnt,
1538 sizeof(env->subprog_info[0]), cmp_subprogs);
1539 if (!p)
1540 return -ENOENT;
1541 return p - env->subprog_info;
1542
1543}
1544
1545static int add_subprog(struct bpf_verifier_env *env, int off)
1546{
1547 int insn_cnt = env->prog->len;
1548 int ret;
1549
1550 if (off >= insn_cnt || off < 0) {
1551 verbose(env, "call to invalid destination\n");
1552 return -EINVAL;
1553 }
1554 ret = find_subprog(env, off);
1555 if (ret >= 0)
1556 return ret;
1557 if (env->subprog_cnt >= BPF_MAX_SUBPROGS) {
1558 verbose(env, "too many subprograms\n");
1559 return -E2BIG;
1560 }
1561
1562 env->subprog_info[env->subprog_cnt++].start = off;
1563 sort(env->subprog_info, env->subprog_cnt,
1564 sizeof(env->subprog_info[0]), cmp_subprogs, NULL);
1565 return env->subprog_cnt - 1;
1566}
1567
1568struct bpf_kfunc_desc {
1569 struct btf_func_model func_model;
1570 u32 func_id;
1571 s32 imm;
1572};
1573
1574#define MAX_KFUNC_DESCS 256
1575struct bpf_kfunc_desc_tab {
1576 struct bpf_kfunc_desc descs[MAX_KFUNC_DESCS];
1577 u32 nr_descs;
1578};
1579
1580static int kfunc_desc_cmp_by_id(const void *a, const void *b)
1581{
1582 const struct bpf_kfunc_desc *d0 = a;
1583 const struct bpf_kfunc_desc *d1 = b;
1584
1585
1586 return d0->func_id - d1->func_id;
1587}
1588
1589static const struct bpf_kfunc_desc *
1590find_kfunc_desc(const struct bpf_prog *prog, u32 func_id)
1591{
1592 struct bpf_kfunc_desc desc = {
1593 .func_id = func_id,
1594 };
1595 struct bpf_kfunc_desc_tab *tab;
1596
1597 tab = prog->aux->kfunc_tab;
1598 return bsearch(&desc, tab->descs, tab->nr_descs,
1599 sizeof(tab->descs[0]), kfunc_desc_cmp_by_id);
1600}
1601
1602static int add_kfunc_call(struct bpf_verifier_env *env, u32 func_id)
1603{
1604 const struct btf_type *func, *func_proto;
1605 struct bpf_kfunc_desc_tab *tab;
1606 struct bpf_prog_aux *prog_aux;
1607 struct bpf_kfunc_desc *desc;
1608 const char *func_name;
1609 unsigned long addr;
1610 int err;
1611
1612 prog_aux = env->prog->aux;
1613 tab = prog_aux->kfunc_tab;
1614 if (!tab) {
1615 if (!btf_vmlinux) {
1616 verbose(env, "calling kernel function is not supported without CONFIG_DEBUG_INFO_BTF\n");
1617 return -ENOTSUPP;
1618 }
1619
1620 if (!env->prog->jit_requested) {
1621 verbose(env, "JIT is required for calling kernel function\n");
1622 return -ENOTSUPP;
1623 }
1624
1625 if (!bpf_jit_supports_kfunc_call()) {
1626 verbose(env, "JIT does not support calling kernel function\n");
1627 return -ENOTSUPP;
1628 }
1629
1630 if (!env->prog->gpl_compatible) {
1631 verbose(env, "cannot call kernel function from non-GPL compatible program\n");
1632 return -EINVAL;
1633 }
1634
1635 tab = kzalloc(sizeof(*tab), GFP_KERNEL);
1636 if (!tab)
1637 return -ENOMEM;
1638 prog_aux->kfunc_tab = tab;
1639 }
1640
1641 if (find_kfunc_desc(env->prog, func_id))
1642 return 0;
1643
1644 if (tab->nr_descs == MAX_KFUNC_DESCS) {
1645 verbose(env, "too many different kernel function calls\n");
1646 return -E2BIG;
1647 }
1648
1649 func = btf_type_by_id(btf_vmlinux, func_id);
1650 if (!func || !btf_type_is_func(func)) {
1651 verbose(env, "kernel btf_id %u is not a function\n",
1652 func_id);
1653 return -EINVAL;
1654 }
1655 func_proto = btf_type_by_id(btf_vmlinux, func->type);
1656 if (!func_proto || !btf_type_is_func_proto(func_proto)) {
1657 verbose(env, "kernel function btf_id %u does not have a valid func_proto\n",
1658 func_id);
1659 return -EINVAL;
1660 }
1661
1662 func_name = btf_name_by_offset(btf_vmlinux, func->name_off);
1663 addr = kallsyms_lookup_name(func_name);
1664 if (!addr) {
1665 verbose(env, "cannot find address for kernel function %s\n",
1666 func_name);
1667 return -EINVAL;
1668 }
1669
1670 desc = &tab->descs[tab->nr_descs++];
1671 desc->func_id = func_id;
1672 desc->imm = BPF_CAST_CALL(addr) - __bpf_call_base;
1673 err = btf_distill_func_proto(&env->log, btf_vmlinux,
1674 func_proto, func_name,
1675 &desc->func_model);
1676 if (!err)
1677 sort(tab->descs, tab->nr_descs, sizeof(tab->descs[0]),
1678 kfunc_desc_cmp_by_id, NULL);
1679 return err;
1680}
1681
1682static int kfunc_desc_cmp_by_imm(const void *a, const void *b)
1683{
1684 const struct bpf_kfunc_desc *d0 = a;
1685 const struct bpf_kfunc_desc *d1 = b;
1686
1687 if (d0->imm > d1->imm)
1688 return 1;
1689 else if (d0->imm < d1->imm)
1690 return -1;
1691 return 0;
1692}
1693
1694static void sort_kfunc_descs_by_imm(struct bpf_prog *prog)
1695{
1696 struct bpf_kfunc_desc_tab *tab;
1697
1698 tab = prog->aux->kfunc_tab;
1699 if (!tab)
1700 return;
1701
1702 sort(tab->descs, tab->nr_descs, sizeof(tab->descs[0]),
1703 kfunc_desc_cmp_by_imm, NULL);
1704}
1705
1706bool bpf_prog_has_kfunc_call(const struct bpf_prog *prog)
1707{
1708 return !!prog->aux->kfunc_tab;
1709}
1710
1711const struct btf_func_model *
1712bpf_jit_find_kfunc_model(const struct bpf_prog *prog,
1713 const struct bpf_insn *insn)
1714{
1715 const struct bpf_kfunc_desc desc = {
1716 .imm = insn->imm,
1717 };
1718 const struct bpf_kfunc_desc *res;
1719 struct bpf_kfunc_desc_tab *tab;
1720
1721 tab = prog->aux->kfunc_tab;
1722 res = bsearch(&desc, tab->descs, tab->nr_descs,
1723 sizeof(tab->descs[0]), kfunc_desc_cmp_by_imm);
1724
1725 return res ? &res->func_model : NULL;
1726}
1727
1728static int add_subprog_and_kfunc(struct bpf_verifier_env *env)
1729{
1730 struct bpf_subprog_info *subprog = env->subprog_info;
1731 struct bpf_insn *insn = env->prog->insnsi;
1732 int i, ret, insn_cnt = env->prog->len;
1733
1734
1735 ret = add_subprog(env, 0);
1736 if (ret)
1737 return ret;
1738
1739 for (i = 0; i < insn_cnt; i++, insn++) {
1740 if (!bpf_pseudo_func(insn) && !bpf_pseudo_call(insn) &&
1741 !bpf_pseudo_kfunc_call(insn))
1742 continue;
1743
1744 if (!env->bpf_capable) {
1745 verbose(env, "loading/calling other bpf or kernel functions are allowed for CAP_BPF and CAP_SYS_ADMIN\n");
1746 return -EPERM;
1747 }
1748
1749 if (bpf_pseudo_func(insn)) {
1750 ret = add_subprog(env, i + insn->imm + 1);
1751 if (ret >= 0)
1752
1753 insn[1].imm = ret;
1754 } else if (bpf_pseudo_call(insn)) {
1755 ret = add_subprog(env, i + insn->imm + 1);
1756 } else {
1757 ret = add_kfunc_call(env, insn->imm);
1758 }
1759
1760 if (ret < 0)
1761 return ret;
1762 }
1763
1764
1765
1766
1767 subprog[env->subprog_cnt].start = insn_cnt;
1768
1769 if (env->log.level & BPF_LOG_LEVEL2)
1770 for (i = 0; i < env->subprog_cnt; i++)
1771 verbose(env, "func#%d @%d\n", i, subprog[i].start);
1772
1773 return 0;
1774}
1775
1776static int check_subprogs(struct bpf_verifier_env *env)
1777{
1778 int i, subprog_start, subprog_end, off, cur_subprog = 0;
1779 struct bpf_subprog_info *subprog = env->subprog_info;
1780 struct bpf_insn *insn = env->prog->insnsi;
1781 int insn_cnt = env->prog->len;
1782
1783
1784 subprog_start = subprog[cur_subprog].start;
1785 subprog_end = subprog[cur_subprog + 1].start;
1786 for (i = 0; i < insn_cnt; i++) {
1787 u8 code = insn[i].code;
1788
1789 if (code == (BPF_JMP | BPF_CALL) &&
1790 insn[i].imm == BPF_FUNC_tail_call &&
1791 insn[i].src_reg != BPF_PSEUDO_CALL)
1792 subprog[cur_subprog].has_tail_call = true;
1793 if (BPF_CLASS(code) == BPF_LD &&
1794 (BPF_MODE(code) == BPF_ABS || BPF_MODE(code) == BPF_IND))
1795 subprog[cur_subprog].has_ld_abs = true;
1796 if (BPF_CLASS(code) != BPF_JMP && BPF_CLASS(code) != BPF_JMP32)
1797 goto next;
1798 if (BPF_OP(code) == BPF_EXIT || BPF_OP(code) == BPF_CALL)
1799 goto next;
1800 off = i + insn[i].off + 1;
1801 if (off < subprog_start || off >= subprog_end) {
1802 verbose(env, "jump out of range from insn %d to %d\n", i, off);
1803 return -EINVAL;
1804 }
1805next:
1806 if (i == subprog_end - 1) {
1807
1808
1809
1810
1811 if (code != (BPF_JMP | BPF_EXIT) &&
1812 code != (BPF_JMP | BPF_JA)) {
1813 verbose(env, "last insn is not an exit or jmp\n");
1814 return -EINVAL;
1815 }
1816 subprog_start = subprog_end;
1817 cur_subprog++;
1818 if (cur_subprog < env->subprog_cnt)
1819 subprog_end = subprog[cur_subprog + 1].start;
1820 }
1821 }
1822 return 0;
1823}
1824
1825
1826
1827
1828static int mark_reg_read(struct bpf_verifier_env *env,
1829 const struct bpf_reg_state *state,
1830 struct bpf_reg_state *parent, u8 flag)
1831{
1832 bool writes = parent == state->parent;
1833 int cnt = 0;
1834
1835 while (parent) {
1836
1837 if (writes && state->live & REG_LIVE_WRITTEN)
1838 break;
1839 if (parent->live & REG_LIVE_DONE) {
1840 verbose(env, "verifier BUG type %s var_off %lld off %d\n",
1841 reg_type_str[parent->type],
1842 parent->var_off.value, parent->off);
1843 return -EFAULT;
1844 }
1845
1846
1847
1848 if ((parent->live & REG_LIVE_READ) == flag ||
1849 parent->live & REG_LIVE_READ64)
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859 break;
1860
1861 parent->live |= flag;
1862
1863 if (flag == REG_LIVE_READ64)
1864 parent->live &= ~REG_LIVE_READ32;
1865 state = parent;
1866 parent = state->parent;
1867 writes = true;
1868 cnt++;
1869 }
1870
1871 if (env->longest_mark_read_walk < cnt)
1872 env->longest_mark_read_walk = cnt;
1873 return 0;
1874}
1875
1876
1877
1878
1879
1880static bool is_reg64(struct bpf_verifier_env *env, struct bpf_insn *insn,
1881 u32 regno, struct bpf_reg_state *reg, enum reg_arg_type t)
1882{
1883 u8 code, class, op;
1884
1885 code = insn->code;
1886 class = BPF_CLASS(code);
1887 op = BPF_OP(code);
1888 if (class == BPF_JMP) {
1889
1890
1891
1892 if (op == BPF_EXIT)
1893 return true;
1894 if (op == BPF_CALL) {
1895
1896
1897
1898
1899
1900 if (insn->src_reg == BPF_PSEUDO_CALL)
1901 return false;
1902
1903
1904
1905 if (t == SRC_OP)
1906 return true;
1907
1908 return false;
1909 }
1910 }
1911
1912 if (class == BPF_ALU64 || class == BPF_JMP ||
1913
1914 (class == BPF_ALU && op == BPF_END && insn->imm == 64))
1915 return true;
1916
1917 if (class == BPF_ALU || class == BPF_JMP32)
1918 return false;
1919
1920 if (class == BPF_LDX) {
1921 if (t != SRC_OP)
1922 return BPF_SIZE(code) == BPF_DW;
1923
1924 return true;
1925 }
1926
1927 if (class == BPF_STX) {
1928
1929
1930
1931
1932 if (t == SRC_OP && reg->type != SCALAR_VALUE)
1933 return true;
1934 return BPF_SIZE(code) == BPF_DW;
1935 }
1936
1937 if (class == BPF_LD) {
1938 u8 mode = BPF_MODE(code);
1939
1940
1941 if (mode == BPF_IMM)
1942 return true;
1943
1944
1945 if (t != SRC_OP)
1946 return false;
1947
1948
1949 if (regno == BPF_REG_6)
1950 return true;
1951
1952
1953 return true;
1954 }
1955
1956 if (class == BPF_ST)
1957
1958 return true;
1959
1960
1961 return true;
1962}
1963
1964
1965static int insn_def_regno(const struct bpf_insn *insn)
1966{
1967 switch (BPF_CLASS(insn->code)) {
1968 case BPF_JMP:
1969 case BPF_JMP32:
1970 case BPF_ST:
1971 return -1;
1972 case BPF_STX:
1973 if (BPF_MODE(insn->code) == BPF_ATOMIC &&
1974 (insn->imm & BPF_FETCH)) {
1975 if (insn->imm == BPF_CMPXCHG)
1976 return BPF_REG_0;
1977 else
1978 return insn->src_reg;
1979 } else {
1980 return -1;
1981 }
1982 default:
1983 return insn->dst_reg;
1984 }
1985}
1986
1987
1988static bool insn_has_def32(struct bpf_verifier_env *env, struct bpf_insn *insn)
1989{
1990 int dst_reg = insn_def_regno(insn);
1991
1992 if (dst_reg == -1)
1993 return false;
1994
1995 return !is_reg64(env, insn, dst_reg, NULL, DST_OP);
1996}
1997
1998static void mark_insn_zext(struct bpf_verifier_env *env,
1999 struct bpf_reg_state *reg)
2000{
2001 s32 def_idx = reg->subreg_def;
2002
2003 if (def_idx == DEF_NOT_SUBREG)
2004 return;
2005
2006 env->insn_aux_data[def_idx - 1].zext_dst = true;
2007
2008 reg->subreg_def = DEF_NOT_SUBREG;
2009}
2010
2011static int check_reg_arg(struct bpf_verifier_env *env, u32 regno,
2012 enum reg_arg_type t)
2013{
2014 struct bpf_verifier_state *vstate = env->cur_state;
2015 struct bpf_func_state *state = vstate->frame[vstate->curframe];
2016 struct bpf_insn *insn = env->prog->insnsi + env->insn_idx;
2017 struct bpf_reg_state *reg, *regs = state->regs;
2018 bool rw64;
2019
2020 if (regno >= MAX_BPF_REG) {
2021 verbose(env, "R%d is invalid\n", regno);
2022 return -EINVAL;
2023 }
2024
2025 reg = ®s[regno];
2026 rw64 = is_reg64(env, insn, regno, reg, t);
2027 if (t == SRC_OP) {
2028
2029 if (reg->type == NOT_INIT) {
2030 verbose(env, "R%d !read_ok\n", regno);
2031 return -EACCES;
2032 }
2033
2034 if (regno == BPF_REG_FP)
2035 return 0;
2036
2037 if (rw64)
2038 mark_insn_zext(env, reg);
2039
2040 return mark_reg_read(env, reg, reg->parent,
2041 rw64 ? REG_LIVE_READ64 : REG_LIVE_READ32);
2042 } else {
2043
2044 if (regno == BPF_REG_FP) {
2045 verbose(env, "frame pointer is read only\n");
2046 return -EACCES;
2047 }
2048 reg->live |= REG_LIVE_WRITTEN;
2049 reg->subreg_def = rw64 ? DEF_NOT_SUBREG : env->insn_idx + 1;
2050 if (t == DST_OP)
2051 mark_reg_unknown(env, regs, regno);
2052 }
2053 return 0;
2054}
2055
2056
2057static int push_jmp_history(struct bpf_verifier_env *env,
2058 struct bpf_verifier_state *cur)
2059{
2060 u32 cnt = cur->jmp_history_cnt;
2061 struct bpf_idx_pair *p;
2062
2063 cnt++;
2064 p = krealloc(cur->jmp_history, cnt * sizeof(*p), GFP_USER);
2065 if (!p)
2066 return -ENOMEM;
2067 p[cnt - 1].idx = env->insn_idx;
2068 p[cnt - 1].prev_idx = env->prev_insn_idx;
2069 cur->jmp_history = p;
2070 cur->jmp_history_cnt = cnt;
2071 return 0;
2072}
2073
2074
2075
2076
2077static int get_prev_insn_idx(struct bpf_verifier_state *st, int i,
2078 u32 *history)
2079{
2080 u32 cnt = *history;
2081
2082 if (cnt && st->jmp_history[cnt - 1].idx == i) {
2083 i = st->jmp_history[cnt - 1].prev_idx;
2084 (*history)--;
2085 } else {
2086 i--;
2087 }
2088 return i;
2089}
2090
2091static const char *disasm_kfunc_name(void *data, const struct bpf_insn *insn)
2092{
2093 const struct btf_type *func;
2094
2095 if (insn->src_reg != BPF_PSEUDO_KFUNC_CALL)
2096 return NULL;
2097
2098 func = btf_type_by_id(btf_vmlinux, insn->imm);
2099 return btf_name_by_offset(btf_vmlinux, func->name_off);
2100}
2101
2102
2103
2104
2105
2106static int backtrack_insn(struct bpf_verifier_env *env, int idx,
2107 u32 *reg_mask, u64 *stack_mask)
2108{
2109 const struct bpf_insn_cbs cbs = {
2110 .cb_call = disasm_kfunc_name,
2111 .cb_print = verbose,
2112 .private_data = env,
2113 };
2114 struct bpf_insn *insn = env->prog->insnsi + idx;
2115 u8 class = BPF_CLASS(insn->code);
2116 u8 opcode = BPF_OP(insn->code);
2117 u8 mode = BPF_MODE(insn->code);
2118 u32 dreg = 1u << insn->dst_reg;
2119 u32 sreg = 1u << insn->src_reg;
2120 u32 spi;
2121
2122 if (insn->code == 0)
2123 return 0;
2124 if (env->log.level & BPF_LOG_LEVEL) {
2125 verbose(env, "regs=%x stack=%llx before ", *reg_mask, *stack_mask);
2126 verbose(env, "%d: ", idx);
2127 print_bpf_insn(&cbs, insn, env->allow_ptr_leaks);
2128 }
2129
2130 if (class == BPF_ALU || class == BPF_ALU64) {
2131 if (!(*reg_mask & dreg))
2132 return 0;
2133 if (opcode == BPF_MOV) {
2134 if (BPF_SRC(insn->code) == BPF_X) {
2135
2136
2137
2138
2139 *reg_mask &= ~dreg;
2140 *reg_mask |= sreg;
2141 } else {
2142
2143
2144
2145
2146
2147
2148 *reg_mask &= ~dreg;
2149 }
2150 } else {
2151 if (BPF_SRC(insn->code) == BPF_X) {
2152
2153
2154
2155
2156 *reg_mask |= sreg;
2157 }
2158
2159
2160 }
2161 } else if (class == BPF_LDX) {
2162 if (!(*reg_mask & dreg))
2163 return 0;
2164 *reg_mask &= ~dreg;
2165
2166
2167
2168
2169
2170
2171
2172 if (insn->src_reg != BPF_REG_FP)
2173 return 0;
2174 if (BPF_SIZE(insn->code) != BPF_DW)
2175 return 0;
2176
2177
2178
2179
2180
2181 spi = (-insn->off - 1) / BPF_REG_SIZE;
2182 if (spi >= 64) {
2183 verbose(env, "BUG spi %d\n", spi);
2184 WARN_ONCE(1, "verifier backtracking bug");
2185 return -EFAULT;
2186 }
2187 *stack_mask |= 1ull << spi;
2188 } else if (class == BPF_STX || class == BPF_ST) {
2189 if (*reg_mask & dreg)
2190
2191
2192
2193
2194 return -ENOTSUPP;
2195
2196 if (insn->dst_reg != BPF_REG_FP)
2197 return 0;
2198 if (BPF_SIZE(insn->code) != BPF_DW)
2199 return 0;
2200 spi = (-insn->off - 1) / BPF_REG_SIZE;
2201 if (spi >= 64) {
2202 verbose(env, "BUG spi %d\n", spi);
2203 WARN_ONCE(1, "verifier backtracking bug");
2204 return -EFAULT;
2205 }
2206 if (!(*stack_mask & (1ull << spi)))
2207 return 0;
2208 *stack_mask &= ~(1ull << spi);
2209 if (class == BPF_STX)
2210 *reg_mask |= sreg;
2211 } else if (class == BPF_JMP || class == BPF_JMP32) {
2212 if (opcode == BPF_CALL) {
2213 if (insn->src_reg == BPF_PSEUDO_CALL)
2214 return -ENOTSUPP;
2215
2216 *reg_mask &= ~1;
2217 if (*reg_mask & 0x3f) {
2218
2219
2220
2221 verbose(env, "BUG regs %x\n", *reg_mask);
2222 WARN_ONCE(1, "verifier backtracking bug");
2223 return -EFAULT;
2224 }
2225 } else if (opcode == BPF_EXIT) {
2226 return -ENOTSUPP;
2227 }
2228 } else if (class == BPF_LD) {
2229 if (!(*reg_mask & dreg))
2230 return 0;
2231 *reg_mask &= ~dreg;
2232
2233
2234
2235
2236 if (mode == BPF_IND || mode == BPF_ABS)
2237
2238 return -ENOTSUPP;
2239 }
2240 return 0;
2241}
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295static void mark_all_scalars_precise(struct bpf_verifier_env *env,
2296 struct bpf_verifier_state *st)
2297{
2298 struct bpf_func_state *func;
2299 struct bpf_reg_state *reg;
2300 int i, j;
2301
2302
2303
2304
2305 for (; st; st = st->parent)
2306 for (i = 0; i <= st->curframe; i++) {
2307 func = st->frame[i];
2308 for (j = 0; j < BPF_REG_FP; j++) {
2309 reg = &func->regs[j];
2310 if (reg->type != SCALAR_VALUE)
2311 continue;
2312 reg->precise = true;
2313 }
2314 for (j = 0; j < func->allocated_stack / BPF_REG_SIZE; j++) {
2315 if (func->stack[j].slot_type[0] != STACK_SPILL)
2316 continue;
2317 reg = &func->stack[j].spilled_ptr;
2318 if (reg->type != SCALAR_VALUE)
2319 continue;
2320 reg->precise = true;
2321 }
2322 }
2323}
2324
2325static int __mark_chain_precision(struct bpf_verifier_env *env, int regno,
2326 int spi)
2327{
2328 struct bpf_verifier_state *st = env->cur_state;
2329 int first_idx = st->first_insn_idx;
2330 int last_idx = env->insn_idx;
2331 struct bpf_func_state *func;
2332 struct bpf_reg_state *reg;
2333 u32 reg_mask = regno >= 0 ? 1u << regno : 0;
2334 u64 stack_mask = spi >= 0 ? 1ull << spi : 0;
2335 bool skip_first = true;
2336 bool new_marks = false;
2337 int i, err;
2338
2339 if (!env->bpf_capable)
2340 return 0;
2341
2342 func = st->frame[st->curframe];
2343 if (regno >= 0) {
2344 reg = &func->regs[regno];
2345 if (reg->type != SCALAR_VALUE) {
2346 WARN_ONCE(1, "backtracing misuse");
2347 return -EFAULT;
2348 }
2349 if (!reg->precise)
2350 new_marks = true;
2351 else
2352 reg_mask = 0;
2353 reg->precise = true;
2354 }
2355
2356 while (spi >= 0) {
2357 if (func->stack[spi].slot_type[0] != STACK_SPILL) {
2358 stack_mask = 0;
2359 break;
2360 }
2361 reg = &func->stack[spi].spilled_ptr;
2362 if (reg->type != SCALAR_VALUE) {
2363 stack_mask = 0;
2364 break;
2365 }
2366 if (!reg->precise)
2367 new_marks = true;
2368 else
2369 stack_mask = 0;
2370 reg->precise = true;
2371 break;
2372 }
2373
2374 if (!new_marks)
2375 return 0;
2376 if (!reg_mask && !stack_mask)
2377 return 0;
2378 for (;;) {
2379 DECLARE_BITMAP(mask, 64);
2380 u32 history = st->jmp_history_cnt;
2381
2382 if (env->log.level & BPF_LOG_LEVEL)
2383 verbose(env, "last_idx %d first_idx %d\n", last_idx, first_idx);
2384 for (i = last_idx;;) {
2385 if (skip_first) {
2386 err = 0;
2387 skip_first = false;
2388 } else {
2389 err = backtrack_insn(env, i, ®_mask, &stack_mask);
2390 }
2391 if (err == -ENOTSUPP) {
2392 mark_all_scalars_precise(env, st);
2393 return 0;
2394 } else if (err) {
2395 return err;
2396 }
2397 if (!reg_mask && !stack_mask)
2398
2399
2400
2401
2402 return 0;
2403 if (i == first_idx)
2404 break;
2405 i = get_prev_insn_idx(st, i, &history);
2406 if (i >= env->prog->len) {
2407
2408
2409
2410
2411
2412
2413 verbose(env, "BUG backtracking idx %d\n", i);
2414 WARN_ONCE(1, "verifier backtracking bug");
2415 return -EFAULT;
2416 }
2417 }
2418 st = st->parent;
2419 if (!st)
2420 break;
2421
2422 new_marks = false;
2423 func = st->frame[st->curframe];
2424 bitmap_from_u64(mask, reg_mask);
2425 for_each_set_bit(i, mask, 32) {
2426 reg = &func->regs[i];
2427 if (reg->type != SCALAR_VALUE) {
2428 reg_mask &= ~(1u << i);
2429 continue;
2430 }
2431 if (!reg->precise)
2432 new_marks = true;
2433 reg->precise = true;
2434 }
2435
2436 bitmap_from_u64(mask, stack_mask);
2437 for_each_set_bit(i, mask, 64) {
2438 if (i >= func->allocated_stack / BPF_REG_SIZE) {
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452 mark_all_scalars_precise(env, st);
2453 return 0;
2454 }
2455
2456 if (func->stack[i].slot_type[0] != STACK_SPILL) {
2457 stack_mask &= ~(1ull << i);
2458 continue;
2459 }
2460 reg = &func->stack[i].spilled_ptr;
2461 if (reg->type != SCALAR_VALUE) {
2462 stack_mask &= ~(1ull << i);
2463 continue;
2464 }
2465 if (!reg->precise)
2466 new_marks = true;
2467 reg->precise = true;
2468 }
2469 if (env->log.level & BPF_LOG_LEVEL) {
2470 print_verifier_state(env, func);
2471 verbose(env, "parent %s regs=%x stack=%llx marks\n",
2472 new_marks ? "didn't have" : "already had",
2473 reg_mask, stack_mask);
2474 }
2475
2476 if (!reg_mask && !stack_mask)
2477 break;
2478 if (!new_marks)
2479 break;
2480
2481 last_idx = st->last_insn_idx;
2482 first_idx = st->first_insn_idx;
2483 }
2484 return 0;
2485}
2486
2487static int mark_chain_precision(struct bpf_verifier_env *env, int regno)
2488{
2489 return __mark_chain_precision(env, regno, -1);
2490}
2491
2492static int mark_chain_precision_stack(struct bpf_verifier_env *env, int spi)
2493{
2494 return __mark_chain_precision(env, -1, spi);
2495}
2496
2497static bool is_spillable_regtype(enum bpf_reg_type type)
2498{
2499 switch (type) {
2500 case PTR_TO_MAP_VALUE:
2501 case PTR_TO_MAP_VALUE_OR_NULL:
2502 case PTR_TO_STACK:
2503 case PTR_TO_CTX:
2504 case PTR_TO_PACKET:
2505 case PTR_TO_PACKET_META:
2506 case PTR_TO_PACKET_END:
2507 case PTR_TO_FLOW_KEYS:
2508 case CONST_PTR_TO_MAP:
2509 case PTR_TO_SOCKET:
2510 case PTR_TO_SOCKET_OR_NULL:
2511 case PTR_TO_SOCK_COMMON:
2512 case PTR_TO_SOCK_COMMON_OR_NULL:
2513 case PTR_TO_TCP_SOCK:
2514 case PTR_TO_TCP_SOCK_OR_NULL:
2515 case PTR_TO_XDP_SOCK:
2516 case PTR_TO_BTF_ID:
2517 case PTR_TO_BTF_ID_OR_NULL:
2518 case PTR_TO_RDONLY_BUF:
2519 case PTR_TO_RDONLY_BUF_OR_NULL:
2520 case PTR_TO_RDWR_BUF:
2521 case PTR_TO_RDWR_BUF_OR_NULL:
2522 case PTR_TO_PERCPU_BTF_ID:
2523 case PTR_TO_MEM:
2524 case PTR_TO_MEM_OR_NULL:
2525 case PTR_TO_FUNC:
2526 case PTR_TO_MAP_KEY:
2527 return true;
2528 default:
2529 return false;
2530 }
2531}
2532
2533
2534static bool register_is_null(struct bpf_reg_state *reg)
2535{
2536 return reg->type == SCALAR_VALUE && tnum_equals_const(reg->var_off, 0);
2537}
2538
2539static bool register_is_const(struct bpf_reg_state *reg)
2540{
2541 return reg->type == SCALAR_VALUE && tnum_is_const(reg->var_off);
2542}
2543
2544static bool __is_scalar_unbounded(struct bpf_reg_state *reg)
2545{
2546 return tnum_is_unknown(reg->var_off) &&
2547 reg->smin_value == S64_MIN && reg->smax_value == S64_MAX &&
2548 reg->umin_value == 0 && reg->umax_value == U64_MAX &&
2549 reg->s32_min_value == S32_MIN && reg->s32_max_value == S32_MAX &&
2550 reg->u32_min_value == 0 && reg->u32_max_value == U32_MAX;
2551}
2552
2553static bool register_is_bounded(struct bpf_reg_state *reg)
2554{
2555 return reg->type == SCALAR_VALUE && !__is_scalar_unbounded(reg);
2556}
2557
2558static bool __is_pointer_value(bool allow_ptr_leaks,
2559 const struct bpf_reg_state *reg)
2560{
2561 if (allow_ptr_leaks)
2562 return false;
2563
2564 return reg->type != SCALAR_VALUE;
2565}
2566
2567static void save_register_state(struct bpf_func_state *state,
2568 int spi, struct bpf_reg_state *reg)
2569{
2570 int i;
2571
2572 state->stack[spi].spilled_ptr = *reg;
2573 state->stack[spi].spilled_ptr.live |= REG_LIVE_WRITTEN;
2574
2575 for (i = 0; i < BPF_REG_SIZE; i++)
2576 state->stack[spi].slot_type[i] = STACK_SPILL;
2577}
2578
2579
2580
2581
2582static int check_stack_write_fixed_off(struct bpf_verifier_env *env,
2583
2584 struct bpf_func_state *state,
2585 int off, int size, int value_regno,
2586 int insn_idx)
2587{
2588 struct bpf_func_state *cur;
2589 int i, slot = -off - 1, spi = slot / BPF_REG_SIZE, err;
2590 u32 dst_reg = env->prog->insnsi[insn_idx].dst_reg;
2591 struct bpf_reg_state *reg = NULL;
2592
2593 err = realloc_func_state(state, round_up(slot + 1, BPF_REG_SIZE),
2594 state->acquired_refs, true);
2595 if (err)
2596 return err;
2597
2598
2599
2600 if (!env->allow_ptr_leaks &&
2601 state->stack[spi].slot_type[0] == STACK_SPILL &&
2602 size != BPF_REG_SIZE) {
2603 verbose(env, "attempt to corrupt spilled pointer on stack\n");
2604 return -EACCES;
2605 }
2606
2607 cur = env->cur_state->frame[env->cur_state->curframe];
2608 if (value_regno >= 0)
2609 reg = &cur->regs[value_regno];
2610
2611 if (reg && size == BPF_REG_SIZE && register_is_bounded(reg) &&
2612 !register_is_null(reg) && env->bpf_capable) {
2613 if (dst_reg != BPF_REG_FP) {
2614
2615
2616
2617
2618
2619
2620 err = mark_chain_precision(env, value_regno);
2621 if (err)
2622 return err;
2623 }
2624 save_register_state(state, spi, reg);
2625 } else if (reg && is_spillable_regtype(reg->type)) {
2626
2627 if (size != BPF_REG_SIZE) {
2628 verbose_linfo(env, insn_idx, "; ");
2629 verbose(env, "invalid size of register spill\n");
2630 return -EACCES;
2631 }
2632
2633 if (state != cur && reg->type == PTR_TO_STACK) {
2634 verbose(env, "cannot spill pointers to stack into stack frame of the caller\n");
2635 return -EINVAL;
2636 }
2637
2638 if (!env->bypass_spec_v4) {
2639 bool sanitize = false;
2640
2641 if (state->stack[spi].slot_type[0] == STACK_SPILL &&
2642 register_is_const(&state->stack[spi].spilled_ptr))
2643 sanitize = true;
2644 for (i = 0; i < BPF_REG_SIZE; i++)
2645 if (state->stack[spi].slot_type[i] == STACK_MISC) {
2646 sanitize = true;
2647 break;
2648 }
2649 if (sanitize) {
2650 int *poff = &env->insn_aux_data[insn_idx].sanitize_stack_off;
2651 int soff = (-spi - 1) * BPF_REG_SIZE;
2652
2653
2654
2655
2656
2657
2658
2659
2660 if (*poff && *poff != soff) {
2661
2662
2663
2664
2665 verbose(env,
2666 "insn %d cannot access two stack slots fp%d and fp%d",
2667 insn_idx, *poff, soff);
2668 return -EINVAL;
2669 }
2670 *poff = soff;
2671 }
2672 }
2673 save_register_state(state, spi, reg);
2674 } else {
2675 u8 type = STACK_MISC;
2676
2677
2678 state->stack[spi].spilled_ptr.type = NOT_INIT;
2679
2680 if (state->stack[spi].slot_type[0] == STACK_SPILL)
2681 for (i = 0; i < BPF_REG_SIZE; i++)
2682 state->stack[spi].slot_type[i] = STACK_MISC;
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692 if (size == BPF_REG_SIZE)
2693 state->stack[spi].spilled_ptr.live |= REG_LIVE_WRITTEN;
2694
2695
2696 if (reg && register_is_null(reg)) {
2697
2698 err = mark_chain_precision(env, value_regno);
2699 if (err)
2700 return err;
2701 type = STACK_ZERO;
2702 }
2703
2704
2705 for (i = 0; i < size; i++)
2706 state->stack[spi].slot_type[(slot - i) % BPF_REG_SIZE] =
2707 type;
2708 }
2709 return 0;
2710}
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731static int check_stack_write_var_off(struct bpf_verifier_env *env,
2732
2733 struct bpf_func_state *state,
2734 int ptr_regno, int off, int size,
2735 int value_regno, int insn_idx)
2736{
2737 struct bpf_func_state *cur;
2738 int min_off, max_off;
2739 int i, err;
2740 struct bpf_reg_state *ptr_reg = NULL, *value_reg = NULL;
2741 bool writing_zero = false;
2742
2743
2744
2745 bool zero_used = false;
2746
2747 cur = env->cur_state->frame[env->cur_state->curframe];
2748 ptr_reg = &cur->regs[ptr_regno];
2749 min_off = ptr_reg->smin_value + off;
2750 max_off = ptr_reg->smax_value + off + size;
2751 if (value_regno >= 0)
2752 value_reg = &cur->regs[value_regno];
2753 if (value_reg && register_is_null(value_reg))
2754 writing_zero = true;
2755
2756 err = realloc_func_state(state, round_up(-min_off, BPF_REG_SIZE),
2757 state->acquired_refs, true);
2758 if (err)
2759 return err;
2760
2761
2762
2763 for (i = min_off; i < max_off; i++) {
2764 u8 new_type, *stype;
2765 int slot, spi;
2766
2767 slot = -i - 1;
2768 spi = slot / BPF_REG_SIZE;
2769 stype = &state->stack[spi].slot_type[slot % BPF_REG_SIZE];
2770
2771 if (!env->allow_ptr_leaks
2772 && *stype != NOT_INIT
2773 && *stype != SCALAR_VALUE) {
2774
2775
2776
2777
2778
2779
2780 verbose(env, "spilled ptr in range of var-offset stack write; insn %d, ptr off: %d",
2781 insn_idx, i);
2782 return -EINVAL;
2783 }
2784
2785
2786 state->stack[spi].spilled_ptr.type = NOT_INIT;
2787
2788
2789 new_type = STACK_MISC;
2790 if (writing_zero && *stype == STACK_ZERO) {
2791 new_type = STACK_ZERO;
2792 zero_used = true;
2793 }
2794
2795
2796
2797
2798
2799
2800
2801
2802 if (*stype == STACK_INVALID && !env->allow_uninit_stack) {
2803 verbose(env, "uninit stack in range of var-offset write prohibited for !root; insn %d, off: %d",
2804 insn_idx, i);
2805 return -EINVAL;
2806 }
2807 *stype = new_type;
2808 }
2809 if (zero_used) {
2810
2811 err = mark_chain_precision(env, value_regno);
2812 if (err)
2813 return err;
2814 }
2815 return 0;
2816}
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826static void mark_reg_stack_read(struct bpf_verifier_env *env,
2827
2828 struct bpf_func_state *ptr_state,
2829 int min_off, int max_off, int dst_regno)
2830{
2831 struct bpf_verifier_state *vstate = env->cur_state;
2832 struct bpf_func_state *state = vstate->frame[vstate->curframe];
2833 int i, slot, spi;
2834 u8 *stype;
2835 int zeros = 0;
2836
2837 for (i = min_off; i < max_off; i++) {
2838 slot = -i - 1;
2839 spi = slot / BPF_REG_SIZE;
2840 stype = ptr_state->stack[spi].slot_type;
2841 if (stype[slot % BPF_REG_SIZE] != STACK_ZERO)
2842 break;
2843 zeros++;
2844 }
2845 if (zeros == max_off - min_off) {
2846
2847
2848
2849 __mark_reg_const_zero(&state->regs[dst_regno]);
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860 state->regs[dst_regno].precise = true;
2861 } else {
2862
2863 mark_reg_unknown(env, state->regs, dst_regno);
2864 }
2865 state->regs[dst_regno].live |= REG_LIVE_WRITTEN;
2866}
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877static int check_stack_read_fixed_off(struct bpf_verifier_env *env,
2878
2879 struct bpf_func_state *reg_state,
2880 int off, int size, int dst_regno)
2881{
2882 struct bpf_verifier_state *vstate = env->cur_state;
2883 struct bpf_func_state *state = vstate->frame[vstate->curframe];
2884 int i, slot = -off - 1, spi = slot / BPF_REG_SIZE;
2885 struct bpf_reg_state *reg;
2886 u8 *stype;
2887
2888 stype = reg_state->stack[spi].slot_type;
2889 reg = ®_state->stack[spi].spilled_ptr;
2890
2891 if (stype[0] == STACK_SPILL) {
2892 if (size != BPF_REG_SIZE) {
2893 if (reg->type != SCALAR_VALUE) {
2894 verbose_linfo(env, env->insn_idx, "; ");
2895 verbose(env, "invalid size of register fill\n");
2896 return -EACCES;
2897 }
2898 if (dst_regno >= 0) {
2899 mark_reg_unknown(env, state->regs, dst_regno);
2900 state->regs[dst_regno].live |= REG_LIVE_WRITTEN;
2901 }
2902 mark_reg_read(env, reg, reg->parent, REG_LIVE_READ64);
2903 return 0;
2904 }
2905 for (i = 1; i < BPF_REG_SIZE; i++) {
2906 if (stype[(slot - i) % BPF_REG_SIZE] != STACK_SPILL) {
2907 verbose(env, "corrupted spill memory\n");
2908 return -EACCES;
2909 }
2910 }
2911
2912 if (dst_regno >= 0) {
2913
2914 state->regs[dst_regno] = *reg;
2915
2916
2917
2918
2919 state->regs[dst_regno].live |= REG_LIVE_WRITTEN;
2920 } else if (__is_pointer_value(env->allow_ptr_leaks, reg)) {
2921
2922
2923
2924
2925
2926
2927 verbose(env, "leaking pointer from stack off %d\n",
2928 off);
2929 return -EACCES;
2930 }
2931 mark_reg_read(env, reg, reg->parent, REG_LIVE_READ64);
2932 } else {
2933 u8 type;
2934
2935 for (i = 0; i < size; i++) {
2936 type = stype[(slot - i) % BPF_REG_SIZE];
2937 if (type == STACK_MISC)
2938 continue;
2939 if (type == STACK_ZERO)
2940 continue;
2941 verbose(env, "invalid read from stack off %d+%d size %d\n",
2942 off, i, size);
2943 return -EACCES;
2944 }
2945 mark_reg_read(env, reg, reg->parent, REG_LIVE_READ64);
2946 if (dst_regno >= 0)
2947 mark_reg_stack_read(env, reg_state, off, off + size, dst_regno);
2948 }
2949 return 0;
2950}
2951
2952enum stack_access_src {
2953 ACCESS_DIRECT = 1,
2954 ACCESS_HELPER = 2,
2955};
2956
2957static int check_stack_range_initialized(struct bpf_verifier_env *env,
2958 int regno, int off, int access_size,
2959 bool zero_size_allowed,
2960 enum stack_access_src type,
2961 struct bpf_call_arg_meta *meta);
2962
2963static struct bpf_reg_state *reg_state(struct bpf_verifier_env *env, int regno)
2964{
2965 return cur_regs(env) + regno;
2966}
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981static int check_stack_read_var_off(struct bpf_verifier_env *env,
2982 int ptr_regno, int off, int size, int dst_regno)
2983{
2984
2985 struct bpf_reg_state *reg = reg_state(env, ptr_regno);
2986 struct bpf_func_state *ptr_state = func(env, reg);
2987 int err;
2988 int min_off, max_off;
2989
2990
2991
2992 err = check_stack_range_initialized(env, ptr_regno, off, size,
2993 false, ACCESS_DIRECT, NULL);
2994 if (err)
2995 return err;
2996
2997 min_off = reg->smin_value + off;
2998 max_off = reg->smax_value + off;
2999 mark_reg_stack_read(env, ptr_state, min_off, max_off + size, dst_regno);
3000 return 0;
3001}
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012static int check_stack_read(struct bpf_verifier_env *env,
3013 int ptr_regno, int off, int size,
3014 int dst_regno)
3015{
3016 struct bpf_reg_state *reg = reg_state(env, ptr_regno);
3017 struct bpf_func_state *state = func(env, reg);
3018 int err;
3019
3020 bool var_off = !tnum_is_const(reg->var_off);
3021
3022
3023
3024
3025
3026 if (dst_regno < 0 && var_off) {
3027 char tn_buf[48];
3028
3029 tnum_strn(tn_buf, sizeof(tn_buf), reg->var_off);
3030 verbose(env, "variable offset stack pointer cannot be passed into helper function; var_off=%s off=%d size=%d\n",
3031 tn_buf, off, size);
3032 return -EACCES;
3033 }
3034
3035
3036
3037
3038 if (!env->bypass_spec_v1 && var_off) {
3039 char tn_buf[48];
3040
3041 tnum_strn(tn_buf, sizeof(tn_buf), reg->var_off);
3042 verbose(env, "R%d variable offset stack access prohibited for !root, var_off=%s\n",
3043 ptr_regno, tn_buf);
3044 return -EACCES;
3045 }
3046
3047 if (!var_off) {
3048 off += reg->var_off.value;
3049 err = check_stack_read_fixed_off(env, state, off, size,
3050 dst_regno);
3051 } else {
3052
3053
3054
3055
3056 err = check_stack_read_var_off(env, ptr_regno, off, size,
3057 dst_regno);
3058 }
3059 return err;
3060}
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073static int check_stack_write(struct bpf_verifier_env *env,
3074 int ptr_regno, int off, int size,
3075 int value_regno, int insn_idx)
3076{
3077 struct bpf_reg_state *reg = reg_state(env, ptr_regno);
3078 struct bpf_func_state *state = func(env, reg);
3079 int err;
3080
3081 if (tnum_is_const(reg->var_off)) {
3082 off += reg->var_off.value;
3083 err = check_stack_write_fixed_off(env, state, off, size,
3084 value_regno, insn_idx);
3085 } else {
3086
3087
3088
3089 err = check_stack_write_var_off(env, state,
3090 ptr_regno, off, size,
3091 value_regno, insn_idx);
3092 }
3093 return err;
3094}
3095
3096static int check_map_access_type(struct bpf_verifier_env *env, u32 regno,
3097 int off, int size, enum bpf_access_type type)
3098{
3099 struct bpf_reg_state *regs = cur_regs(env);
3100 struct bpf_map *map = regs[regno].map_ptr;
3101 u32 cap = bpf_map_flags_to_cap(map);
3102
3103 if (type == BPF_WRITE && !(cap & BPF_MAP_CAN_WRITE)) {
3104 verbose(env, "write into map forbidden, value_size=%d off=%d size=%d\n",
3105 map->value_size, off, size);
3106 return -EACCES;
3107 }
3108
3109 if (type == BPF_READ && !(cap & BPF_MAP_CAN_READ)) {
3110 verbose(env, "read from map forbidden, value_size=%d off=%d size=%d\n",
3111 map->value_size, off, size);
3112 return -EACCES;
3113 }
3114
3115 return 0;
3116}
3117
3118
3119static int __check_mem_access(struct bpf_verifier_env *env, int regno,
3120 int off, int size, u32 mem_size,
3121 bool zero_size_allowed)
3122{
3123 bool size_ok = size > 0 || (size == 0 && zero_size_allowed);
3124 struct bpf_reg_state *reg;
3125
3126 if (off >= 0 && size_ok && (u64)off + size <= mem_size)
3127 return 0;
3128
3129 reg = &cur_regs(env)[regno];
3130 switch (reg->type) {
3131 case PTR_TO_MAP_KEY:
3132 verbose(env, "invalid access to map key, key_size=%d off=%d size=%d\n",
3133 mem_size, off, size);
3134 break;
3135 case PTR_TO_MAP_VALUE:
3136 verbose(env, "invalid access to map value, value_size=%d off=%d size=%d\n",
3137 mem_size, off, size);
3138 break;
3139 case PTR_TO_PACKET:
3140 case PTR_TO_PACKET_META:
3141 case PTR_TO_PACKET_END:
3142 verbose(env, "invalid access to packet, off=%d size=%d, R%d(id=%d,off=%d,r=%d)\n",
3143 off, size, regno, reg->id, off, mem_size);
3144 break;
3145 case PTR_TO_MEM:
3146 default:
3147 verbose(env, "invalid access to memory, mem_size=%u off=%d size=%d\n",
3148 mem_size, off, size);
3149 }
3150
3151 return -EACCES;
3152}
3153
3154
3155static int check_mem_region_access(struct bpf_verifier_env *env, u32 regno,
3156 int off, int size, u32 mem_size,
3157 bool zero_size_allowed)
3158{
3159 struct bpf_verifier_state *vstate = env->cur_state;
3160 struct bpf_func_state *state = vstate->frame[vstate->curframe];
3161 struct bpf_reg_state *reg = &state->regs[regno];
3162 int err;
3163
3164
3165
3166
3167
3168 if (env->log.level & BPF_LOG_LEVEL)
3169 print_verifier_state(env, state);
3170
3171
3172
3173
3174
3175
3176
3177 if (reg->smin_value < 0 &&
3178 (reg->smin_value == S64_MIN ||
3179 (off + reg->smin_value != (s64)(s32)(off + reg->smin_value)) ||
3180 reg->smin_value + off < 0)) {
3181 verbose(env, "R%d min value is negative, either use unsigned index or do a if (index >=0) check.\n",
3182 regno);
3183 return -EACCES;
3184 }
3185 err = __check_mem_access(env, regno, reg->smin_value + off, size,
3186 mem_size, zero_size_allowed);
3187 if (err) {
3188 verbose(env, "R%d min value is outside of the allowed memory range\n",
3189 regno);
3190 return err;
3191 }
3192
3193
3194
3195
3196
3197 if (reg->umax_value >= BPF_MAX_VAR_OFF) {
3198 verbose(env, "R%d unbounded memory access, make sure to bounds check any such access\n",
3199 regno);
3200 return -EACCES;
3201 }
3202 err = __check_mem_access(env, regno, reg->umax_value + off, size,
3203 mem_size, zero_size_allowed);
3204 if (err) {
3205 verbose(env, "R%d max value is outside of the allowed memory range\n",
3206 regno);
3207 return err;
3208 }
3209
3210 return 0;
3211}
3212
3213
3214static int check_map_access(struct bpf_verifier_env *env, u32 regno,
3215 int off, int size, bool zero_size_allowed)
3216{
3217 struct bpf_verifier_state *vstate = env->cur_state;
3218 struct bpf_func_state *state = vstate->frame[vstate->curframe];
3219 struct bpf_reg_state *reg = &state->regs[regno];
3220 struct bpf_map *map = reg->map_ptr;
3221 int err;
3222
3223 err = check_mem_region_access(env, regno, off, size, map->value_size,
3224 zero_size_allowed);
3225 if (err)
3226 return err;
3227
3228 if (map_value_has_spin_lock(map)) {
3229 u32 lock = map->spin_lock_off;
3230
3231
3232
3233
3234
3235
3236 if (reg->smin_value + off < lock + sizeof(struct bpf_spin_lock) &&
3237 lock < reg->umax_value + off + size) {
3238 verbose(env, "bpf_spin_lock cannot be accessed directly by load/store\n");
3239 return -EACCES;
3240 }
3241 }
3242 return err;
3243}
3244
3245#define MAX_PACKET_OFF 0xffff
3246
3247static enum bpf_prog_type resolve_prog_type(struct bpf_prog *prog)
3248{
3249 return prog->aux->dst_prog ? prog->aux->dst_prog->type : prog->type;
3250}
3251
3252static bool may_access_direct_pkt_data(struct bpf_verifier_env *env,
3253 const struct bpf_call_arg_meta *meta,
3254 enum bpf_access_type t)
3255{
3256 enum bpf_prog_type prog_type = resolve_prog_type(env->prog);
3257
3258 switch (prog_type) {
3259
3260 case BPF_PROG_TYPE_LWT_IN:
3261 case BPF_PROG_TYPE_LWT_OUT:
3262 case BPF_PROG_TYPE_LWT_SEG6LOCAL:
3263 case BPF_PROG_TYPE_SK_REUSEPORT:
3264 case BPF_PROG_TYPE_FLOW_DISSECTOR:
3265 case BPF_PROG_TYPE_CGROUP_SKB:
3266 if (t == BPF_WRITE)
3267 return false;
3268 fallthrough;
3269
3270
3271 case BPF_PROG_TYPE_SCHED_CLS:
3272 case BPF_PROG_TYPE_SCHED_ACT:
3273 case BPF_PROG_TYPE_XDP:
3274 case BPF_PROG_TYPE_LWT_XMIT:
3275 case BPF_PROG_TYPE_SK_SKB:
3276 case BPF_PROG_TYPE_SK_MSG:
3277 if (meta)
3278 return meta->pkt_access;
3279
3280 env->seen_direct_write = true;
3281 return true;
3282
3283 case BPF_PROG_TYPE_CGROUP_SOCKOPT:
3284 if (t == BPF_WRITE)
3285 env->seen_direct_write = true;
3286
3287 return true;
3288
3289 default:
3290 return false;
3291 }
3292}
3293
3294static int check_packet_access(struct bpf_verifier_env *env, u32 regno, int off,
3295 int size, bool zero_size_allowed)
3296{
3297 struct bpf_reg_state *regs = cur_regs(env);
3298 struct bpf_reg_state *reg = ®s[regno];
3299 int err;
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309 if (reg->smin_value < 0) {
3310 verbose(env, "R%d min value is negative, either use unsigned index or do a if (index >=0) check.\n",
3311 regno);
3312 return -EACCES;
3313 }
3314
3315 err = reg->range < 0 ? -EINVAL :
3316 __check_mem_access(env, regno, off, size, reg->range,
3317 zero_size_allowed);
3318 if (err) {
3319 verbose(env, "R%d offset is outside of the packet\n", regno);
3320 return err;
3321 }
3322
3323
3324
3325
3326
3327
3328
3329 env->prog->aux->max_pkt_offset =
3330 max_t(u32, env->prog->aux->max_pkt_offset,
3331 off + reg->umax_value + size - 1);
3332
3333 return err;
3334}
3335
3336
3337static int check_ctx_access(struct bpf_verifier_env *env, int insn_idx, int off, int size,
3338 enum bpf_access_type t, enum bpf_reg_type *reg_type,
3339 struct btf **btf, u32 *btf_id)
3340{
3341 struct bpf_insn_access_aux info = {
3342 .reg_type = *reg_type,
3343 .log = &env->log,
3344 };
3345
3346 if (env->ops->is_valid_access &&
3347 env->ops->is_valid_access(off, size, t, env->prog, &info)) {
3348
3349
3350
3351
3352
3353
3354
3355 *reg_type = info.reg_type;
3356
3357 if (*reg_type == PTR_TO_BTF_ID || *reg_type == PTR_TO_BTF_ID_OR_NULL) {
3358 *btf = info.btf;
3359 *btf_id = info.btf_id;
3360 } else {
3361 env->insn_aux_data[insn_idx].ctx_field_size = info.ctx_field_size;
3362 }
3363
3364 if (env->prog->aux->max_ctx_offset < off + size)
3365 env->prog->aux->max_ctx_offset = off + size;
3366 return 0;
3367 }
3368
3369 verbose(env, "invalid bpf_context access off=%d size=%d\n", off, size);
3370 return -EACCES;
3371}
3372
3373static int check_flow_keys_access(struct bpf_verifier_env *env, int off,
3374 int size)
3375{
3376 if (size < 0 || off < 0 ||
3377 (u64)off + size > sizeof(struct bpf_flow_keys)) {
3378 verbose(env, "invalid access to flow keys off=%d size=%d\n",
3379 off, size);
3380 return -EACCES;
3381 }
3382 return 0;
3383}
3384
3385static int check_sock_access(struct bpf_verifier_env *env, int insn_idx,
3386 u32 regno, int off, int size,
3387 enum bpf_access_type t)
3388{
3389 struct bpf_reg_state *regs = cur_regs(env);
3390 struct bpf_reg_state *reg = ®s[regno];
3391 struct bpf_insn_access_aux info = {};
3392 bool valid;
3393
3394 if (reg->smin_value < 0) {
3395 verbose(env, "R%d min value is negative, either use unsigned index or do a if (index >=0) check.\n",
3396 regno);
3397 return -EACCES;
3398 }
3399
3400 switch (reg->type) {
3401 case PTR_TO_SOCK_COMMON:
3402 valid = bpf_sock_common_is_valid_access(off, size, t, &info);
3403 break;
3404 case PTR_TO_SOCKET:
3405 valid = bpf_sock_is_valid_access(off, size, t, &info);
3406 break;
3407 case PTR_TO_TCP_SOCK:
3408 valid = bpf_tcp_sock_is_valid_access(off, size, t, &info);
3409 break;
3410 case PTR_TO_XDP_SOCK:
3411 valid = bpf_xdp_sock_is_valid_access(off, size, t, &info);
3412 break;
3413 default:
3414 valid = false;
3415 }
3416
3417
3418 if (valid) {
3419 env->insn_aux_data[insn_idx].ctx_field_size =
3420 info.ctx_field_size;
3421 return 0;
3422 }
3423
3424 verbose(env, "R%d invalid %s access off=%d size=%d\n",
3425 regno, reg_type_str[reg->type], off, size);
3426
3427 return -EACCES;
3428}
3429
3430static bool is_pointer_value(struct bpf_verifier_env *env, int regno)
3431{
3432 return __is_pointer_value(env->allow_ptr_leaks, reg_state(env, regno));
3433}
3434
3435static bool is_ctx_reg(struct bpf_verifier_env *env, int regno)
3436{
3437 const struct bpf_reg_state *reg = reg_state(env, regno);
3438
3439 return reg->type == PTR_TO_CTX;
3440}
3441
3442static bool is_sk_reg(struct bpf_verifier_env *env, int regno)
3443{
3444 const struct bpf_reg_state *reg = reg_state(env, regno);
3445
3446 return type_is_sk_pointer(reg->type);
3447}
3448
3449static bool is_pkt_reg(struct bpf_verifier_env *env, int regno)
3450{
3451 const struct bpf_reg_state *reg = reg_state(env, regno);
3452
3453 return type_is_pkt_pointer(reg->type);
3454}
3455
3456static bool is_flow_key_reg(struct bpf_verifier_env *env, int regno)
3457{
3458 const struct bpf_reg_state *reg = reg_state(env, regno);
3459
3460
3461 return reg->type == PTR_TO_FLOW_KEYS;
3462}
3463
3464static int check_pkt_ptr_alignment(struct bpf_verifier_env *env,
3465 const struct bpf_reg_state *reg,
3466 int off, int size, bool strict)
3467{
3468 struct tnum reg_off;
3469 int ip_align;
3470
3471
3472 if (!strict || size == 1)
3473 return 0;
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483 ip_align = 2;
3484
3485 reg_off = tnum_add(reg->var_off, tnum_const(ip_align + reg->off + off));
3486 if (!tnum_is_aligned(reg_off, size)) {
3487 char tn_buf[48];
3488
3489 tnum_strn(tn_buf, sizeof(tn_buf), reg->var_off);
3490 verbose(env,
3491 "misaligned packet access off %d+%s+%d+%d size %d\n",
3492 ip_align, tn_buf, reg->off, off, size);
3493 return -EACCES;
3494 }
3495
3496 return 0;
3497}
3498
3499static int check_generic_ptr_alignment(struct bpf_verifier_env *env,
3500 const struct bpf_reg_state *reg,
3501 const char *pointer_desc,
3502 int off, int size, bool strict)
3503{
3504 struct tnum reg_off;
3505
3506
3507 if (!strict || size == 1)
3508 return 0;
3509
3510 reg_off = tnum_add(reg->var_off, tnum_const(reg->off + off));
3511 if (!tnum_is_aligned(reg_off, size)) {
3512 char tn_buf[48];
3513
3514 tnum_strn(tn_buf, sizeof(tn_buf), reg->var_off);
3515 verbose(env, "misaligned %saccess off %s+%d+%d size %d\n",
3516 pointer_desc, tn_buf, reg->off, off, size);
3517 return -EACCES;
3518 }
3519
3520 return 0;
3521}
3522
3523static int check_ptr_alignment(struct bpf_verifier_env *env,
3524 const struct bpf_reg_state *reg, int off,
3525 int size, bool strict_alignment_once)
3526{
3527 bool strict = env->strict_alignment || strict_alignment_once;
3528 const char *pointer_desc = "";
3529
3530 switch (reg->type) {
3531 case PTR_TO_PACKET:
3532 case PTR_TO_PACKET_META:
3533
3534
3535
3536 return check_pkt_ptr_alignment(env, reg, off, size, strict);
3537 case PTR_TO_FLOW_KEYS:
3538 pointer_desc = "flow keys ";
3539 break;
3540 case PTR_TO_MAP_KEY:
3541 pointer_desc = "key ";
3542 break;
3543 case PTR_TO_MAP_VALUE:
3544 pointer_desc = "value ";
3545 break;
3546 case PTR_TO_CTX:
3547 pointer_desc = "context ";
3548 break;
3549 case PTR_TO_STACK:
3550 pointer_desc = "stack ";
3551
3552
3553
3554
3555 strict = true;
3556 break;
3557 case PTR_TO_SOCKET:
3558 pointer_desc = "sock ";
3559 break;
3560 case PTR_TO_SOCK_COMMON:
3561 pointer_desc = "sock_common ";
3562 break;
3563 case PTR_TO_TCP_SOCK:
3564 pointer_desc = "tcp_sock ";
3565 break;
3566 case PTR_TO_XDP_SOCK:
3567 pointer_desc = "xdp_sock ";
3568 break;
3569 default:
3570 break;
3571 }
3572 return check_generic_ptr_alignment(env, reg, pointer_desc, off, size,
3573 strict);
3574}
3575
3576static int update_stack_depth(struct bpf_verifier_env *env,
3577 const struct bpf_func_state *func,
3578 int off)
3579{
3580 u16 stack = env->subprog_info[func->subprogno].stack_depth;
3581
3582 if (stack >= -off)
3583 return 0;
3584
3585
3586 env->subprog_info[func->subprogno].stack_depth = -off;
3587 return 0;
3588}
3589
3590
3591
3592
3593
3594
3595
3596static int check_max_stack_depth(struct bpf_verifier_env *env)
3597{
3598 int depth = 0, frame = 0, idx = 0, i = 0, subprog_end;
3599 struct bpf_subprog_info *subprog = env->subprog_info;
3600 struct bpf_insn *insn = env->prog->insnsi;
3601 bool tail_call_reachable = false;
3602 int ret_insn[MAX_CALL_FRAMES];
3603 int ret_prog[MAX_CALL_FRAMES];
3604 int j;
3605
3606process_func:
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626 if (idx && subprog[idx].has_tail_call && depth >= 256) {
3627 verbose(env,
3628 "tail_calls are not allowed when call stack of previous frames is %d bytes. Too large\n",
3629 depth);
3630 return -EACCES;
3631 }
3632
3633
3634
3635 depth += round_up(max_t(u32, subprog[idx].stack_depth, 1), 32);
3636 if (depth > MAX_BPF_STACK) {
3637 verbose(env, "combined stack size of %d calls is %d. Too large\n",
3638 frame + 1, depth);
3639 return -EACCES;
3640 }
3641continue_func:
3642 subprog_end = subprog[idx + 1].start;
3643 for (; i < subprog_end; i++) {
3644 if (!bpf_pseudo_call(insn + i) && !bpf_pseudo_func(insn + i))
3645 continue;
3646
3647 ret_insn[frame] = i + 1;
3648 ret_prog[frame] = idx;
3649
3650
3651 i = i + insn[i].imm + 1;
3652 idx = find_subprog(env, i);
3653 if (idx < 0) {
3654 WARN_ONCE(1, "verifier bug. No program starts at insn %d\n",
3655 i);
3656 return -EFAULT;
3657 }
3658
3659 if (subprog[idx].has_tail_call)
3660 tail_call_reachable = true;
3661
3662 frame++;
3663 if (frame >= MAX_CALL_FRAMES) {
3664 verbose(env, "the call stack of %d frames is too deep !\n",
3665 frame);
3666 return -E2BIG;
3667 }
3668 goto process_func;
3669 }
3670
3671
3672
3673
3674
3675 if (tail_call_reachable)
3676 for (j = 0; j < frame; j++)
3677 subprog[ret_prog[j]].tail_call_reachable = true;
3678
3679
3680
3681
3682 if (frame == 0)
3683 return 0;
3684 depth -= round_up(max_t(u32, subprog[idx].stack_depth, 1), 32);
3685 frame--;
3686 i = ret_insn[frame];
3687 idx = ret_prog[frame];
3688 goto continue_func;
3689}
3690
3691#ifndef CONFIG_BPF_JIT_ALWAYS_ON
3692static int get_callee_stack_depth(struct bpf_verifier_env *env,
3693 const struct bpf_insn *insn, int idx)
3694{
3695 int start = idx + insn->imm + 1, subprog;
3696
3697 subprog = find_subprog(env, start);
3698 if (subprog < 0) {
3699 WARN_ONCE(1, "verifier bug. No program starts at insn %d\n",
3700 start);
3701 return -EFAULT;
3702 }
3703 return env->subprog_info[subprog].stack_depth;
3704}
3705#endif
3706
3707int check_ctx_reg(struct bpf_verifier_env *env,
3708 const struct bpf_reg_state *reg, int regno)
3709{
3710
3711
3712
3713
3714 if (reg->off) {
3715 verbose(env, "dereference of modified ctx ptr R%d off=%d disallowed\n",
3716 regno, reg->off);
3717 return -EACCES;
3718 }
3719
3720 if (!tnum_is_const(reg->var_off) || reg->var_off.value) {
3721 char tn_buf[48];
3722
3723 tnum_strn(tn_buf, sizeof(tn_buf), reg->var_off);
3724 verbose(env, "variable ctx access var_off=%s disallowed\n", tn_buf);
3725 return -EACCES;
3726 }
3727
3728 return 0;
3729}
3730
3731static int __check_buffer_access(struct bpf_verifier_env *env,
3732 const char *buf_info,
3733 const struct bpf_reg_state *reg,
3734 int regno, int off, int size)
3735{
3736 if (off < 0) {
3737 verbose(env,
3738 "R%d invalid %s buffer access: off=%d, size=%d\n",
3739 regno, buf_info, off, size);
3740 return -EACCES;
3741 }
3742 if (!tnum_is_const(reg->var_off) || reg->var_off.value) {
3743 char tn_buf[48];
3744
3745 tnum_strn(tn_buf, sizeof(tn_buf), reg->var_off);
3746 verbose(env,
3747 "R%d invalid variable buffer offset: off=%d, var_off=%s\n",
3748 regno, off, tn_buf);
3749 return -EACCES;
3750 }
3751
3752 return 0;
3753}
3754
3755static int check_tp_buffer_access(struct bpf_verifier_env *env,
3756 const struct bpf_reg_state *reg,
3757 int regno, int off, int size)
3758{
3759 int err;
3760
3761 err = __check_buffer_access(env, "tracepoint", reg, regno, off, size);
3762 if (err)
3763 return err;
3764
3765 if (off + size > env->prog->aux->max_tp_access)
3766 env->prog->aux->max_tp_access = off + size;
3767
3768 return 0;
3769}
3770
3771static int check_buffer_access(struct bpf_verifier_env *env,
3772 const struct bpf_reg_state *reg,
3773 int regno, int off, int size,
3774 bool zero_size_allowed,
3775 const char *buf_info,
3776 u32 *max_access)
3777{
3778 int err;
3779
3780 err = __check_buffer_access(env, buf_info, reg, regno, off, size);
3781 if (err)
3782 return err;
3783
3784 if (off + size > *max_access)
3785 *max_access = off + size;
3786
3787 return 0;
3788}
3789
3790
3791static void zext_32_to_64(struct bpf_reg_state *reg)
3792{
3793 reg->var_off = tnum_subreg(reg->var_off);
3794 __reg_assign_32_into_64(reg);
3795}
3796
3797
3798
3799
3800static void coerce_reg_to_size(struct bpf_reg_state *reg, int size)
3801{
3802 u64 mask;
3803
3804
3805 reg->var_off = tnum_cast(reg->var_off, size);
3806
3807
3808 mask = ((u64)1 << (size * 8)) - 1;
3809 if ((reg->umin_value & ~mask) == (reg->umax_value & ~mask)) {
3810 reg->umin_value &= mask;
3811 reg->umax_value &= mask;
3812 } else {
3813 reg->umin_value = 0;
3814 reg->umax_value = mask;
3815 }
3816 reg->smin_value = reg->umin_value;
3817 reg->smax_value = reg->umax_value;
3818
3819
3820
3821
3822
3823 if (size >= 4)
3824 return;
3825 __reg_combine_64_into_32(reg);
3826}
3827
3828static bool bpf_map_is_rdonly(const struct bpf_map *map)
3829{
3830 return (map->map_flags & BPF_F_RDONLY_PROG) && map->frozen;
3831}
3832
3833static int bpf_map_direct_read(struct bpf_map *map, int off, int size, u64 *val)
3834{
3835 void *ptr;
3836 u64 addr;
3837 int err;
3838
3839 err = map->ops->map_direct_value_addr(map, &addr, off);
3840 if (err)
3841 return err;
3842 ptr = (void *)(long)addr + off;
3843
3844 switch (size) {
3845 case sizeof(u8):
3846 *val = (u64)*(u8 *)ptr;
3847 break;
3848 case sizeof(u16):
3849 *val = (u64)*(u16 *)ptr;
3850 break;
3851 case sizeof(u32):
3852 *val = (u64)*(u32 *)ptr;
3853 break;
3854 case sizeof(u64):
3855 *val = *(u64 *)ptr;
3856 break;
3857 default:
3858 return -EINVAL;
3859 }
3860 return 0;
3861}
3862
3863static int check_ptr_to_btf_access(struct bpf_verifier_env *env,
3864 struct bpf_reg_state *regs,
3865 int regno, int off, int size,
3866 enum bpf_access_type atype,
3867 int value_regno)
3868{
3869 struct bpf_reg_state *reg = regs + regno;
3870 const struct btf_type *t = btf_type_by_id(reg->btf, reg->btf_id);
3871 const char *tname = btf_name_by_offset(reg->btf, t->name_off);
3872 u32 btf_id;
3873 int ret;
3874
3875 if (off < 0) {
3876 verbose(env,
3877 "R%d is ptr_%s invalid negative access: off=%d\n",
3878 regno, tname, off);
3879 return -EACCES;
3880 }
3881 if (!tnum_is_const(reg->var_off) || reg->var_off.value) {
3882 char tn_buf[48];
3883
3884 tnum_strn(tn_buf, sizeof(tn_buf), reg->var_off);
3885 verbose(env,
3886 "R%d is ptr_%s invalid variable offset: off=%d, var_off=%s\n",
3887 regno, tname, off, tn_buf);
3888 return -EACCES;
3889 }
3890
3891 if (env->ops->btf_struct_access) {
3892 ret = env->ops->btf_struct_access(&env->log, reg->btf, t,
3893 off, size, atype, &btf_id);
3894 } else {
3895 if (atype != BPF_READ) {
3896 verbose(env, "only read is supported\n");
3897 return -EACCES;
3898 }
3899
3900 ret = btf_struct_access(&env->log, reg->btf, t, off, size,
3901 atype, &btf_id);
3902 }
3903
3904 if (ret < 0)
3905 return ret;
3906
3907 if (atype == BPF_READ && value_regno >= 0)
3908 mark_btf_ld_reg(env, regs, value_regno, ret, reg->btf, btf_id);
3909
3910 return 0;
3911}
3912
3913static int check_ptr_to_map_access(struct bpf_verifier_env *env,
3914 struct bpf_reg_state *regs,
3915 int regno, int off, int size,
3916 enum bpf_access_type atype,
3917 int value_regno)
3918{
3919 struct bpf_reg_state *reg = regs + regno;
3920 struct bpf_map *map = reg->map_ptr;
3921 const struct btf_type *t;
3922 const char *tname;
3923 u32 btf_id;
3924 int ret;
3925
3926 if (!btf_vmlinux) {
3927 verbose(env, "map_ptr access not supported without CONFIG_DEBUG_INFO_BTF\n");
3928 return -ENOTSUPP;
3929 }
3930
3931 if (!map->ops->map_btf_id || !*map->ops->map_btf_id) {
3932 verbose(env, "map_ptr access not supported for map type %d\n",
3933 map->map_type);
3934 return -ENOTSUPP;
3935 }
3936
3937 t = btf_type_by_id(btf_vmlinux, *map->ops->map_btf_id);
3938 tname = btf_name_by_offset(btf_vmlinux, t->name_off);
3939
3940 if (!env->allow_ptr_to_map_access) {
3941 verbose(env,
3942 "%s access is allowed only to CAP_PERFMON and CAP_SYS_ADMIN\n",
3943 tname);
3944 return -EPERM;
3945 }
3946
3947 if (off < 0) {
3948 verbose(env, "R%d is %s invalid negative access: off=%d\n",
3949 regno, tname, off);
3950 return -EACCES;
3951 }
3952
3953 if (atype != BPF_READ) {
3954 verbose(env, "only read from %s is supported\n", tname);
3955 return -EACCES;
3956 }
3957
3958 ret = btf_struct_access(&env->log, btf_vmlinux, t, off, size, atype, &btf_id);
3959 if (ret < 0)
3960 return ret;
3961
3962 if (value_regno >= 0)
3963 mark_btf_ld_reg(env, regs, value_regno, ret, btf_vmlinux, btf_id);
3964
3965 return 0;
3966}
3967
3968
3969
3970
3971
3972
3973
3974static int check_stack_slot_within_bounds(int off,
3975 struct bpf_func_state *state,
3976 enum bpf_access_type t)
3977{
3978 int min_valid_off;
3979
3980 if (t == BPF_WRITE)
3981 min_valid_off = -MAX_BPF_STACK;
3982 else
3983 min_valid_off = -state->allocated_stack;
3984
3985 if (off < min_valid_off || off > -1)
3986 return -EACCES;
3987 return 0;
3988}
3989
3990
3991
3992
3993
3994
3995static int check_stack_access_within_bounds(
3996 struct bpf_verifier_env *env,
3997 int regno, int off, int access_size,
3998 enum stack_access_src src, enum bpf_access_type type)
3999{
4000 struct bpf_reg_state *regs = cur_regs(env);
4001 struct bpf_reg_state *reg = regs + regno;
4002 struct bpf_func_state *state = func(env, reg);
4003 int min_off, max_off;
4004 int err;
4005 char *err_extra;
4006
4007 if (src == ACCESS_HELPER)
4008
4009 err_extra = " indirect access to";
4010 else if (type == BPF_READ)
4011 err_extra = " read from";
4012 else
4013 err_extra = " write to";
4014
4015 if (tnum_is_const(reg->var_off)) {
4016 min_off = reg->var_off.value + off;
4017 if (access_size > 0)
4018 max_off = min_off + access_size - 1;
4019 else
4020 max_off = min_off;
4021 } else {
4022 if (reg->smax_value >= BPF_MAX_VAR_OFF ||
4023 reg->smin_value <= -BPF_MAX_VAR_OFF) {
4024 verbose(env, "invalid unbounded variable-offset%s stack R%d\n",
4025 err_extra, regno);
4026 return -EACCES;
4027 }
4028 min_off = reg->smin_value + off;
4029 if (access_size > 0)
4030 max_off = reg->smax_value + off + access_size - 1;
4031 else
4032 max_off = min_off;
4033 }
4034
4035 err = check_stack_slot_within_bounds(min_off, state, type);
4036 if (!err)
4037 err = check_stack_slot_within_bounds(max_off, state, type);
4038
4039 if (err) {
4040 if (tnum_is_const(reg->var_off)) {
4041 verbose(env, "invalid%s stack R%d off=%d size=%d\n",
4042 err_extra, regno, off, access_size);
4043 } else {
4044 char tn_buf[48];
4045
4046 tnum_strn(tn_buf, sizeof(tn_buf), reg->var_off);
4047 verbose(env, "invalid variable-offset%s stack R%d var_off=%s size=%d\n",
4048 err_extra, regno, tn_buf, access_size);
4049 }
4050 }
4051 return err;
4052}
4053
4054
4055
4056
4057
4058
4059
4060static int check_mem_access(struct bpf_verifier_env *env, int insn_idx, u32 regno,
4061 int off, int bpf_size, enum bpf_access_type t,
4062 int value_regno, bool strict_alignment_once)
4063{
4064 struct bpf_reg_state *regs = cur_regs(env);
4065 struct bpf_reg_state *reg = regs + regno;
4066 struct bpf_func_state *state;
4067 int size, err = 0;
4068
4069 size = bpf_size_to_bytes(bpf_size);
4070 if (size < 0)
4071 return size;
4072
4073
4074 err = check_ptr_alignment(env, reg, off, size, strict_alignment_once);
4075 if (err)
4076 return err;
4077
4078
4079 off += reg->off;
4080
4081 if (reg->type == PTR_TO_MAP_KEY) {
4082 if (t == BPF_WRITE) {
4083 verbose(env, "write to change key R%d not allowed\n", regno);
4084 return -EACCES;
4085 }
4086
4087 err = check_mem_region_access(env, regno, off, size,
4088 reg->map_ptr->key_size, false);
4089 if (err)
4090 return err;
4091 if (value_regno >= 0)
4092 mark_reg_unknown(env, regs, value_regno);
4093 } else if (reg->type == PTR_TO_MAP_VALUE) {
4094 if (t == BPF_WRITE && value_regno >= 0 &&
4095 is_pointer_value(env, value_regno)) {
4096 verbose(env, "R%d leaks addr into map\n", value_regno);
4097 return -EACCES;
4098 }
4099 err = check_map_access_type(env, regno, off, size, t);
4100 if (err)
4101 return err;
4102 err = check_map_access(env, regno, off, size, false);
4103 if (!err && t == BPF_READ && value_regno >= 0) {
4104 struct bpf_map *map = reg->map_ptr;
4105
4106
4107 if (tnum_is_const(reg->var_off) &&
4108 bpf_map_is_rdonly(map) &&
4109 map->ops->map_direct_value_addr) {
4110 int map_off = off + reg->var_off.value;
4111 u64 val = 0;
4112
4113 err = bpf_map_direct_read(map, map_off, size,
4114 &val);
4115 if (err)
4116 return err;
4117
4118 regs[value_regno].type = SCALAR_VALUE;
4119 __mark_reg_known(®s[value_regno], val);
4120 } else {
4121 mark_reg_unknown(env, regs, value_regno);
4122 }
4123 }
4124 } else if (reg->type == PTR_TO_MEM) {
4125 if (t == BPF_WRITE && value_regno >= 0 &&
4126 is_pointer_value(env, value_regno)) {
4127 verbose(env, "R%d leaks addr into mem\n", value_regno);
4128 return -EACCES;
4129 }
4130 err = check_mem_region_access(env, regno, off, size,
4131 reg->mem_size, false);
4132 if (!err && t == BPF_READ && value_regno >= 0)
4133 mark_reg_unknown(env, regs, value_regno);
4134 } else if (reg->type == PTR_TO_CTX) {
4135 enum bpf_reg_type reg_type = SCALAR_VALUE;
4136 struct btf *btf = NULL;
4137 u32 btf_id = 0;
4138
4139 if (t == BPF_WRITE && value_regno >= 0 &&
4140 is_pointer_value(env, value_regno)) {
4141 verbose(env, "R%d leaks addr into ctx\n", value_regno);
4142 return -EACCES;
4143 }
4144
4145 err = check_ctx_reg(env, reg, regno);
4146 if (err < 0)
4147 return err;
4148
4149 err = check_ctx_access(env, insn_idx, off, size, t, ®_type, &btf, &btf_id);
4150 if (err)
4151 verbose_linfo(env, insn_idx, "; ");
4152 if (!err && t == BPF_READ && value_regno >= 0) {
4153
4154
4155
4156
4157 if (reg_type == SCALAR_VALUE) {
4158 mark_reg_unknown(env, regs, value_regno);
4159 } else {
4160 mark_reg_known_zero(env, regs,
4161 value_regno);
4162 if (reg_type_may_be_null(reg_type))
4163 regs[value_regno].id = ++env->id_gen;
4164
4165
4166
4167
4168
4169 regs[value_regno].subreg_def = DEF_NOT_SUBREG;
4170 if (reg_type == PTR_TO_BTF_ID ||
4171 reg_type == PTR_TO_BTF_ID_OR_NULL) {
4172 regs[value_regno].btf = btf;
4173 regs[value_regno].btf_id = btf_id;
4174 }
4175 }
4176 regs[value_regno].type = reg_type;
4177 }
4178
4179 } else if (reg->type == PTR_TO_STACK) {
4180
4181 err = check_stack_access_within_bounds(env, regno, off, size, ACCESS_DIRECT, t);
4182 if (err)
4183 return err;
4184
4185 state = func(env, reg);
4186 err = update_stack_depth(env, state, off);
4187 if (err)
4188 return err;
4189
4190 if (t == BPF_READ)
4191 err = check_stack_read(env, regno, off, size,
4192 value_regno);
4193 else
4194 err = check_stack_write(env, regno, off, size,
4195 value_regno, insn_idx);
4196 } else if (reg_is_pkt_pointer(reg)) {
4197 if (t == BPF_WRITE && !may_access_direct_pkt_data(env, NULL, t)) {
4198 verbose(env, "cannot write into packet\n");
4199 return -EACCES;
4200 }
4201 if (t == BPF_WRITE && value_regno >= 0 &&
4202 is_pointer_value(env, value_regno)) {
4203 verbose(env, "R%d leaks addr into packet\n",
4204 value_regno);
4205 return -EACCES;
4206 }
4207 err = check_packet_access(env, regno, off, size, false);
4208 if (!err && t == BPF_READ && value_regno >= 0)
4209 mark_reg_unknown(env, regs, value_regno);
4210 } else if (reg->type == PTR_TO_FLOW_KEYS) {
4211 if (t == BPF_WRITE && value_regno >= 0 &&
4212 is_pointer_value(env, value_regno)) {
4213 verbose(env, "R%d leaks addr into flow keys\n",
4214 value_regno);
4215 return -EACCES;
4216 }
4217
4218 err = check_flow_keys_access(env, off, size);
4219 if (!err && t == BPF_READ && value_regno >= 0)
4220 mark_reg_unknown(env, regs, value_regno);
4221 } else if (type_is_sk_pointer(reg->type)) {
4222 if (t == BPF_WRITE) {
4223 verbose(env, "R%d cannot write into %s\n",
4224 regno, reg_type_str[reg->type]);
4225 return -EACCES;
4226 }
4227 err = check_sock_access(env, insn_idx, regno, off, size, t);
4228 if (!err && value_regno >= 0)
4229 mark_reg_unknown(env, regs, value_regno);
4230 } else if (reg->type == PTR_TO_TP_BUFFER) {
4231 err = check_tp_buffer_access(env, reg, regno, off, size);
4232 if (!err && t == BPF_READ && value_regno >= 0)
4233 mark_reg_unknown(env, regs, value_regno);
4234 } else if (reg->type == PTR_TO_BTF_ID) {
4235 err = check_ptr_to_btf_access(env, regs, regno, off, size, t,
4236 value_regno);
4237 } else if (reg->type == CONST_PTR_TO_MAP) {
4238 err = check_ptr_to_map_access(env, regs, regno, off, size, t,
4239 value_regno);
4240 } else if (reg->type == PTR_TO_RDONLY_BUF) {
4241 if (t == BPF_WRITE) {
4242 verbose(env, "R%d cannot write into %s\n",
4243 regno, reg_type_str[reg->type]);
4244 return -EACCES;
4245 }
4246 err = check_buffer_access(env, reg, regno, off, size, false,
4247 "rdonly",
4248 &env->prog->aux->max_rdonly_access);
4249 if (!err && value_regno >= 0)
4250 mark_reg_unknown(env, regs, value_regno);
4251 } else if (reg->type == PTR_TO_RDWR_BUF) {
4252 err = check_buffer_access(env, reg, regno, off, size, false,
4253 "rdwr",
4254 &env->prog->aux->max_rdwr_access);
4255 if (!err && t == BPF_READ && value_regno >= 0)
4256 mark_reg_unknown(env, regs, value_regno);
4257 } else {
4258 verbose(env, "R%d invalid mem access '%s'\n", regno,
4259 reg_type_str[reg->type]);
4260 return -EACCES;
4261 }
4262
4263 if (!err && size < BPF_REG_SIZE && value_regno >= 0 && t == BPF_READ &&
4264 regs[value_regno].type == SCALAR_VALUE) {
4265
4266 coerce_reg_to_size(®s[value_regno], size);
4267 }
4268 return err;
4269}
4270
4271static int check_atomic(struct bpf_verifier_env *env, int insn_idx, struct bpf_insn *insn)
4272{
4273 int load_reg;
4274 int err;
4275
4276 switch (insn->imm) {
4277 case BPF_ADD:
4278 case BPF_ADD | BPF_FETCH:
4279 case BPF_AND:
4280 case BPF_AND | BPF_FETCH:
4281 case BPF_OR:
4282 case BPF_OR | BPF_FETCH:
4283 case BPF_XOR:
4284 case BPF_XOR | BPF_FETCH:
4285 case BPF_XCHG:
4286 case BPF_CMPXCHG:
4287 break;
4288 default:
4289 verbose(env, "BPF_ATOMIC uses invalid atomic opcode %02x\n", insn->imm);
4290 return -EINVAL;
4291 }
4292
4293 if (BPF_SIZE(insn->code) != BPF_W && BPF_SIZE(insn->code) != BPF_DW) {
4294 verbose(env, "invalid atomic operand size\n");
4295 return -EINVAL;
4296 }
4297
4298
4299 err = check_reg_arg(env, insn->src_reg, SRC_OP);
4300 if (err)
4301 return err;
4302
4303
4304 err = check_reg_arg(env, insn->dst_reg, SRC_OP);
4305 if (err)
4306 return err;
4307
4308 if (insn->imm == BPF_CMPXCHG) {
4309
4310 err = check_reg_arg(env, BPF_REG_0, SRC_OP);
4311 if (err)
4312 return err;
4313 }
4314
4315 if (is_pointer_value(env, insn->src_reg)) {
4316 verbose(env, "R%d leaks addr into mem\n", insn->src_reg);
4317 return -EACCES;
4318 }
4319
4320 if (is_ctx_reg(env, insn->dst_reg) ||
4321 is_pkt_reg(env, insn->dst_reg) ||
4322 is_flow_key_reg(env, insn->dst_reg) ||
4323 is_sk_reg(env, insn->dst_reg)) {
4324 verbose(env, "BPF_ATOMIC stores into R%d %s is not allowed\n",
4325 insn->dst_reg,
4326 reg_type_str[reg_state(env, insn->dst_reg)->type]);
4327 return -EACCES;
4328 }
4329
4330 if (insn->imm & BPF_FETCH) {
4331 if (insn->imm == BPF_CMPXCHG)
4332 load_reg = BPF_REG_0;
4333 else
4334 load_reg = insn->src_reg;
4335
4336
4337 err = check_reg_arg(env, load_reg, DST_OP);
4338 if (err)
4339 return err;
4340 } else {
4341
4342
4343
4344 load_reg = -1;
4345 }
4346
4347
4348 err = check_mem_access(env, insn_idx, insn->dst_reg, insn->off,
4349 BPF_SIZE(insn->code), BPF_READ, load_reg, true);
4350 if (err)
4351 return err;
4352
4353
4354 err = check_mem_access(env, insn_idx, insn->dst_reg, insn->off,
4355 BPF_SIZE(insn->code), BPF_WRITE, -1, true);
4356 if (err)
4357 return err;
4358
4359 return 0;
4360}
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371static int check_stack_range_initialized(
4372 struct bpf_verifier_env *env, int regno, int off,
4373 int access_size, bool zero_size_allowed,
4374 enum stack_access_src type, struct bpf_call_arg_meta *meta)
4375{
4376 struct bpf_reg_state *reg = reg_state(env, regno);
4377 struct bpf_func_state *state = func(env, reg);
4378 int err, min_off, max_off, i, j, slot, spi;
4379 char *err_extra = type == ACCESS_HELPER ? " indirect" : "";
4380 enum bpf_access_type bounds_check_type;
4381
4382
4383
4384 bool clobber = false;
4385
4386 if (access_size == 0 && !zero_size_allowed) {
4387 verbose(env, "invalid zero-sized read\n");
4388 return -EACCES;
4389 }
4390
4391 if (type == ACCESS_HELPER) {
4392
4393
4394
4395
4396 bounds_check_type = BPF_WRITE;
4397 clobber = true;
4398 } else {
4399 bounds_check_type = BPF_READ;
4400 }
4401 err = check_stack_access_within_bounds(env, regno, off, access_size,
4402 type, bounds_check_type);
4403 if (err)
4404 return err;
4405
4406
4407 if (tnum_is_const(reg->var_off)) {
4408 min_off = max_off = reg->var_off.value + off;
4409 } else {
4410
4411
4412
4413
4414
4415 if (!env->bypass_spec_v1) {
4416 char tn_buf[48];
4417
4418 tnum_strn(tn_buf, sizeof(tn_buf), reg->var_off);
4419 verbose(env, "R%d%s variable offset stack access prohibited for !root, var_off=%s\n",
4420 regno, err_extra, tn_buf);
4421 return -EACCES;
4422 }
4423
4424
4425
4426
4427
4428
4429 if (meta && meta->raw_mode)
4430 meta = NULL;
4431
4432 min_off = reg->smin_value + off;
4433 max_off = reg->smax_value + off;
4434 }
4435
4436 if (meta && meta->raw_mode) {
4437 meta->access_size = access_size;
4438 meta->regno = regno;
4439 return 0;
4440 }
4441
4442 for (i = min_off; i < max_off + access_size; i++) {
4443 u8 *stype;
4444
4445 slot = -i - 1;
4446 spi = slot / BPF_REG_SIZE;
4447 if (state->allocated_stack <= slot)
4448 goto err;
4449 stype = &state->stack[spi].slot_type[slot % BPF_REG_SIZE];
4450 if (*stype == STACK_MISC)
4451 goto mark;
4452 if (*stype == STACK_ZERO) {
4453 if (clobber) {
4454
4455 *stype = STACK_MISC;
4456 }
4457 goto mark;
4458 }
4459
4460 if (state->stack[spi].slot_type[0] == STACK_SPILL &&
4461 state->stack[spi].spilled_ptr.type == PTR_TO_BTF_ID)
4462 goto mark;
4463
4464 if (state->stack[spi].slot_type[0] == STACK_SPILL &&
4465 (state->stack[spi].spilled_ptr.type == SCALAR_VALUE ||
4466 env->allow_ptr_leaks)) {
4467 if (clobber) {
4468 __mark_reg_unknown(env, &state->stack[spi].spilled_ptr);
4469 for (j = 0; j < BPF_REG_SIZE; j++)
4470 state->stack[spi].slot_type[j] = STACK_MISC;
4471 }
4472 goto mark;
4473 }
4474
4475err:
4476 if (tnum_is_const(reg->var_off)) {
4477 verbose(env, "invalid%s read from stack R%d off %d+%d size %d\n",
4478 err_extra, regno, min_off, i - min_off, access_size);
4479 } else {
4480 char tn_buf[48];
4481
4482 tnum_strn(tn_buf, sizeof(tn_buf), reg->var_off);
4483 verbose(env, "invalid%s read from stack R%d var_off %s+%d size %d\n",
4484 err_extra, regno, tn_buf, i - min_off, access_size);
4485 }
4486 return -EACCES;
4487mark:
4488
4489
4490
4491 mark_reg_read(env, &state->stack[spi].spilled_ptr,
4492 state->stack[spi].spilled_ptr.parent,
4493 REG_LIVE_READ64);
4494 }
4495 return update_stack_depth(env, state, min_off);
4496}
4497
4498static int check_helper_mem_access(struct bpf_verifier_env *env, int regno,
4499 int access_size, bool zero_size_allowed,
4500 struct bpf_call_arg_meta *meta)
4501{
4502 struct bpf_reg_state *regs = cur_regs(env), *reg = ®s[regno];
4503
4504 switch (reg->type) {
4505 case PTR_TO_PACKET:
4506 case PTR_TO_PACKET_META:
4507 return check_packet_access(env, regno, reg->off, access_size,
4508 zero_size_allowed);
4509 case PTR_TO_MAP_KEY:
4510 return check_mem_region_access(env, regno, reg->off, access_size,
4511 reg->map_ptr->key_size, false);
4512 case PTR_TO_MAP_VALUE:
4513 if (check_map_access_type(env, regno, reg->off, access_size,
4514 meta && meta->raw_mode ? BPF_WRITE :
4515 BPF_READ))
4516 return -EACCES;
4517 return check_map_access(env, regno, reg->off, access_size,
4518 zero_size_allowed);
4519 case PTR_TO_MEM:
4520 return check_mem_region_access(env, regno, reg->off,
4521 access_size, reg->mem_size,
4522 zero_size_allowed);
4523 case PTR_TO_RDONLY_BUF:
4524 if (meta && meta->raw_mode)
4525 return -EACCES;
4526 return check_buffer_access(env, reg, regno, reg->off,
4527 access_size, zero_size_allowed,
4528 "rdonly",
4529 &env->prog->aux->max_rdonly_access);
4530 case PTR_TO_RDWR_BUF:
4531 return check_buffer_access(env, reg, regno, reg->off,
4532 access_size, zero_size_allowed,
4533 "rdwr",
4534 &env->prog->aux->max_rdwr_access);
4535 case PTR_TO_STACK:
4536 return check_stack_range_initialized(
4537 env,
4538 regno, reg->off, access_size,
4539 zero_size_allowed, ACCESS_HELPER, meta);
4540 default:
4541
4542 if (zero_size_allowed && access_size == 0 &&
4543 register_is_null(reg))
4544 return 0;
4545
4546 verbose(env, "R%d type=%s expected=%s\n", regno,
4547 reg_type_str[reg->type],
4548 reg_type_str[PTR_TO_STACK]);
4549 return -EACCES;
4550 }
4551}
4552
4553int check_mem_reg(struct bpf_verifier_env *env, struct bpf_reg_state *reg,
4554 u32 regno, u32 mem_size)
4555{
4556 if (register_is_null(reg))
4557 return 0;
4558
4559 if (reg_type_may_be_null(reg->type)) {
4560
4561
4562
4563
4564 const struct bpf_reg_state saved_reg = *reg;
4565 int rv;
4566
4567 mark_ptr_not_null_reg(reg);
4568 rv = check_helper_mem_access(env, regno, mem_size, true, NULL);
4569 *reg = saved_reg;
4570 return rv;
4571 }
4572
4573 return check_helper_mem_access(env, regno, mem_size, true, NULL);
4574}
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595static int process_spin_lock(struct bpf_verifier_env *env, int regno,
4596 bool is_lock)
4597{
4598 struct bpf_reg_state *regs = cur_regs(env), *reg = ®s[regno];
4599 struct bpf_verifier_state *cur = env->cur_state;
4600 bool is_const = tnum_is_const(reg->var_off);
4601 struct bpf_map *map = reg->map_ptr;
4602 u64 val = reg->var_off.value;
4603
4604 if (!is_const) {
4605 verbose(env,
4606 "R%d doesn't have constant offset. bpf_spin_lock has to be at the constant offset\n",
4607 regno);
4608 return -EINVAL;
4609 }
4610 if (!map->btf) {
4611 verbose(env,
4612 "map '%s' has to have BTF in order to use bpf_spin_lock\n",
4613 map->name);
4614 return -EINVAL;
4615 }
4616 if (!map_value_has_spin_lock(map)) {
4617 if (map->spin_lock_off == -E2BIG)
4618 verbose(env,
4619 "map '%s' has more than one 'struct bpf_spin_lock'\n",
4620 map->name);
4621 else if (map->spin_lock_off == -ENOENT)
4622 verbose(env,
4623 "map '%s' doesn't have 'struct bpf_spin_lock'\n",
4624 map->name);
4625 else
4626 verbose(env,
4627 "map '%s' is not a struct type or bpf_spin_lock is mangled\n",
4628 map->name);
4629 return -EINVAL;
4630 }
4631 if (map->spin_lock_off != val + reg->off) {
4632 verbose(env, "off %lld doesn't point to 'struct bpf_spin_lock'\n",
4633 val + reg->off);
4634 return -EINVAL;
4635 }
4636 if (is_lock) {
4637 if (cur->active_spin_lock) {
4638 verbose(env,
4639 "Locking two bpf_spin_locks are not allowed\n");
4640 return -EINVAL;
4641 }
4642 cur->active_spin_lock = reg->id;
4643 } else {
4644 if (!cur->active_spin_lock) {
4645 verbose(env, "bpf_spin_unlock without taking a lock\n");
4646 return -EINVAL;
4647 }
4648 if (cur->active_spin_lock != reg->id) {
4649 verbose(env, "bpf_spin_unlock of different lock\n");
4650 return -EINVAL;
4651 }
4652 cur->active_spin_lock = 0;
4653 }
4654 return 0;
4655}
4656
4657static bool arg_type_is_mem_ptr(enum bpf_arg_type type)
4658{
4659 return type == ARG_PTR_TO_MEM ||
4660 type == ARG_PTR_TO_MEM_OR_NULL ||
4661 type == ARG_PTR_TO_UNINIT_MEM;
4662}
4663
4664static bool arg_type_is_mem_size(enum bpf_arg_type type)
4665{
4666 return type == ARG_CONST_SIZE ||
4667 type == ARG_CONST_SIZE_OR_ZERO;
4668}
4669
4670static bool arg_type_is_alloc_size(enum bpf_arg_type type)
4671{
4672 return type == ARG_CONST_ALLOC_SIZE_OR_ZERO;
4673}
4674
4675static bool arg_type_is_int_ptr(enum bpf_arg_type type)
4676{
4677 return type == ARG_PTR_TO_INT ||
4678 type == ARG_PTR_TO_LONG;
4679}
4680
4681static int int_ptr_type_to_size(enum bpf_arg_type type)
4682{
4683 if (type == ARG_PTR_TO_INT)
4684 return sizeof(u32);
4685 else if (type == ARG_PTR_TO_LONG)
4686 return sizeof(u64);
4687
4688 return -EINVAL;
4689}
4690
4691static int resolve_map_arg_type(struct bpf_verifier_env *env,
4692 const struct bpf_call_arg_meta *meta,
4693 enum bpf_arg_type *arg_type)
4694{
4695 if (!meta->map_ptr) {
4696
4697 verbose(env, "invalid map_ptr to access map->type\n");
4698 return -EACCES;
4699 }
4700
4701 switch (meta->map_ptr->map_type) {
4702 case BPF_MAP_TYPE_SOCKMAP:
4703 case BPF_MAP_TYPE_SOCKHASH:
4704 if (*arg_type == ARG_PTR_TO_MAP_VALUE) {
4705 *arg_type = ARG_PTR_TO_BTF_ID_SOCK_COMMON;
4706 } else {
4707 verbose(env, "invalid arg_type for sockmap/sockhash\n");
4708 return -EINVAL;
4709 }
4710 break;
4711
4712 default:
4713 break;
4714 }
4715 return 0;
4716}
4717
4718struct bpf_reg_types {
4719 const enum bpf_reg_type types[10];
4720 u32 *btf_id;
4721};
4722
4723static const struct bpf_reg_types map_key_value_types = {
4724 .types = {
4725 PTR_TO_STACK,
4726 PTR_TO_PACKET,
4727 PTR_TO_PACKET_META,
4728 PTR_TO_MAP_KEY,
4729 PTR_TO_MAP_VALUE,
4730 },
4731};
4732
4733static const struct bpf_reg_types sock_types = {
4734 .types = {
4735 PTR_TO_SOCK_COMMON,
4736 PTR_TO_SOCKET,
4737 PTR_TO_TCP_SOCK,
4738 PTR_TO_XDP_SOCK,
4739 },
4740};
4741
4742#ifdef CONFIG_NET
4743static const struct bpf_reg_types btf_id_sock_common_types = {
4744 .types = {
4745 PTR_TO_SOCK_COMMON,
4746 PTR_TO_SOCKET,
4747 PTR_TO_TCP_SOCK,
4748 PTR_TO_XDP_SOCK,
4749 PTR_TO_BTF_ID,
4750 },
4751 .btf_id = &btf_sock_ids[BTF_SOCK_TYPE_SOCK_COMMON],
4752};
4753#endif
4754
4755static const struct bpf_reg_types mem_types = {
4756 .types = {
4757 PTR_TO_STACK,
4758 PTR_TO_PACKET,
4759 PTR_TO_PACKET_META,
4760 PTR_TO_MAP_KEY,
4761 PTR_TO_MAP_VALUE,
4762 PTR_TO_MEM,
4763 PTR_TO_RDONLY_BUF,
4764 PTR_TO_RDWR_BUF,
4765 },
4766};
4767
4768static const struct bpf_reg_types int_ptr_types = {
4769 .types = {
4770 PTR_TO_STACK,
4771 PTR_TO_PACKET,
4772 PTR_TO_PACKET_META,
4773 PTR_TO_MAP_KEY,
4774 PTR_TO_MAP_VALUE,
4775 },
4776};
4777
4778static const struct bpf_reg_types fullsock_types = { .types = { PTR_TO_SOCKET } };
4779static const struct bpf_reg_types scalar_types = { .types = { SCALAR_VALUE } };
4780static const struct bpf_reg_types context_types = { .types = { PTR_TO_CTX } };
4781static const struct bpf_reg_types alloc_mem_types = { .types = { PTR_TO_MEM } };
4782static const struct bpf_reg_types const_map_ptr_types = { .types = { CONST_PTR_TO_MAP } };
4783static const struct bpf_reg_types btf_ptr_types = { .types = { PTR_TO_BTF_ID } };
4784static const struct bpf_reg_types spin_lock_types = { .types = { PTR_TO_MAP_VALUE } };
4785static const struct bpf_reg_types percpu_btf_ptr_types = { .types = { PTR_TO_PERCPU_BTF_ID } };
4786static const struct bpf_reg_types func_ptr_types = { .types = { PTR_TO_FUNC } };
4787static const struct bpf_reg_types stack_ptr_types = { .types = { PTR_TO_STACK } };
4788static const struct bpf_reg_types const_str_ptr_types = { .types = { PTR_TO_MAP_VALUE } };
4789
4790static const struct bpf_reg_types *compatible_reg_types[__BPF_ARG_TYPE_MAX] = {
4791 [ARG_PTR_TO_MAP_KEY] = &map_key_value_types,
4792 [ARG_PTR_TO_MAP_VALUE] = &map_key_value_types,
4793 [ARG_PTR_TO_UNINIT_MAP_VALUE] = &map_key_value_types,
4794 [ARG_PTR_TO_MAP_VALUE_OR_NULL] = &map_key_value_types,
4795 [ARG_CONST_SIZE] = &scalar_types,
4796 [ARG_CONST_SIZE_OR_ZERO] = &scalar_types,
4797 [ARG_CONST_ALLOC_SIZE_OR_ZERO] = &scalar_types,
4798 [ARG_CONST_MAP_PTR] = &const_map_ptr_types,
4799 [ARG_PTR_TO_CTX] = &context_types,
4800 [ARG_PTR_TO_CTX_OR_NULL] = &context_types,
4801 [ARG_PTR_TO_SOCK_COMMON] = &sock_types,
4802#ifdef CONFIG_NET
4803 [ARG_PTR_TO_BTF_ID_SOCK_COMMON] = &btf_id_sock_common_types,
4804#endif
4805 [ARG_PTR_TO_SOCKET] = &fullsock_types,
4806 [ARG_PTR_TO_SOCKET_OR_NULL] = &fullsock_types,
4807 [ARG_PTR_TO_BTF_ID] = &btf_ptr_types,
4808 [ARG_PTR_TO_SPIN_LOCK] = &spin_lock_types,
4809 [ARG_PTR_TO_MEM] = &mem_types,
4810 [ARG_PTR_TO_MEM_OR_NULL] = &mem_types,
4811 [ARG_PTR_TO_UNINIT_MEM] = &mem_types,
4812 [ARG_PTR_TO_ALLOC_MEM] = &alloc_mem_types,
4813 [ARG_PTR_TO_ALLOC_MEM_OR_NULL] = &alloc_mem_types,
4814 [ARG_PTR_TO_INT] = &int_ptr_types,
4815 [ARG_PTR_TO_LONG] = &int_ptr_types,
4816 [ARG_PTR_TO_PERCPU_BTF_ID] = &percpu_btf_ptr_types,
4817 [ARG_PTR_TO_FUNC] = &func_ptr_types,
4818 [ARG_PTR_TO_STACK_OR_NULL] = &stack_ptr_types,
4819 [ARG_PTR_TO_CONST_STR] = &const_str_ptr_types,
4820};
4821
4822static int check_reg_type(struct bpf_verifier_env *env, u32 regno,
4823 enum bpf_arg_type arg_type,
4824 const u32 *arg_btf_id)
4825{
4826 struct bpf_reg_state *regs = cur_regs(env), *reg = ®s[regno];
4827 enum bpf_reg_type expected, type = reg->type;
4828 const struct bpf_reg_types *compatible;
4829 int i, j;
4830
4831 compatible = compatible_reg_types[arg_type];
4832 if (!compatible) {
4833 verbose(env, "verifier internal error: unsupported arg type %d\n", arg_type);
4834 return -EFAULT;
4835 }
4836
4837 for (i = 0; i < ARRAY_SIZE(compatible->types); i++) {
4838 expected = compatible->types[i];
4839 if (expected == NOT_INIT)
4840 break;
4841
4842 if (type == expected)
4843 goto found;
4844 }
4845
4846 verbose(env, "R%d type=%s expected=", regno, reg_type_str[type]);
4847 for (j = 0; j + 1 < i; j++)
4848 verbose(env, "%s, ", reg_type_str[compatible->types[j]]);
4849 verbose(env, "%s\n", reg_type_str[compatible->types[j]]);
4850 return -EACCES;
4851
4852found:
4853 if (type == PTR_TO_BTF_ID) {
4854 if (!arg_btf_id) {
4855 if (!compatible->btf_id) {
4856 verbose(env, "verifier internal error: missing arg compatible BTF ID\n");
4857 return -EFAULT;
4858 }
4859 arg_btf_id = compatible->btf_id;
4860 }
4861
4862 if (!btf_struct_ids_match(&env->log, reg->btf, reg->btf_id, reg->off,
4863 btf_vmlinux, *arg_btf_id)) {
4864 verbose(env, "R%d is of type %s but %s is expected\n",
4865 regno, kernel_type_name(reg->btf, reg->btf_id),
4866 kernel_type_name(btf_vmlinux, *arg_btf_id));
4867 return -EACCES;
4868 }
4869
4870 if (!tnum_is_const(reg->var_off) || reg->var_off.value) {
4871 verbose(env, "R%d is a pointer to in-kernel struct with non-zero offset\n",
4872 regno);
4873 return -EACCES;
4874 }
4875 }
4876
4877 return 0;
4878}
4879
4880static int check_func_arg(struct bpf_verifier_env *env, u32 arg,
4881 struct bpf_call_arg_meta *meta,
4882 const struct bpf_func_proto *fn)
4883{
4884 u32 regno = BPF_REG_1 + arg;
4885 struct bpf_reg_state *regs = cur_regs(env), *reg = ®s[regno];
4886 enum bpf_arg_type arg_type = fn->arg_type[arg];
4887 enum bpf_reg_type type = reg->type;
4888 int err = 0;
4889
4890 if (arg_type == ARG_DONTCARE)
4891 return 0;
4892
4893 err = check_reg_arg(env, regno, SRC_OP);
4894 if (err)
4895 return err;
4896
4897 if (arg_type == ARG_ANYTHING) {
4898 if (is_pointer_value(env, regno)) {
4899 verbose(env, "R%d leaks addr into helper function\n",
4900 regno);
4901 return -EACCES;
4902 }
4903 return 0;
4904 }
4905
4906 if (type_is_pkt_pointer(type) &&
4907 !may_access_direct_pkt_data(env, meta, BPF_READ)) {
4908 verbose(env, "helper access to the packet is not allowed\n");
4909 return -EACCES;
4910 }
4911
4912 if (arg_type == ARG_PTR_TO_MAP_VALUE ||
4913 arg_type == ARG_PTR_TO_UNINIT_MAP_VALUE ||
4914 arg_type == ARG_PTR_TO_MAP_VALUE_OR_NULL) {
4915 err = resolve_map_arg_type(env, meta, &arg_type);
4916 if (err)
4917 return err;
4918 }
4919
4920 if (register_is_null(reg) && arg_type_may_be_null(arg_type))
4921
4922
4923
4924 goto skip_type_check;
4925
4926 err = check_reg_type(env, regno, arg_type, fn->arg_btf_id[arg]);
4927 if (err)
4928 return err;
4929
4930 if (type == PTR_TO_CTX) {
4931 err = check_ctx_reg(env, reg, regno);
4932 if (err < 0)
4933 return err;
4934 }
4935
4936skip_type_check:
4937 if (reg->ref_obj_id) {
4938 if (meta->ref_obj_id) {
4939 verbose(env, "verifier internal error: more than one arg with ref_obj_id R%d %u %u\n",
4940 regno, reg->ref_obj_id,
4941 meta->ref_obj_id);
4942 return -EFAULT;
4943 }
4944 meta->ref_obj_id = reg->ref_obj_id;
4945 }
4946
4947 if (arg_type == ARG_CONST_MAP_PTR) {
4948
4949 meta->map_ptr = reg->map_ptr;
4950 } else if (arg_type == ARG_PTR_TO_MAP_KEY) {
4951
4952
4953
4954
4955 if (!meta->map_ptr) {
4956
4957
4958
4959
4960
4961 verbose(env, "invalid map_ptr to access map->key\n");
4962 return -EACCES;
4963 }
4964 err = check_helper_mem_access(env, regno,
4965 meta->map_ptr->key_size, false,
4966 NULL);
4967 } else if (arg_type == ARG_PTR_TO_MAP_VALUE ||
4968 (arg_type == ARG_PTR_TO_MAP_VALUE_OR_NULL &&
4969 !register_is_null(reg)) ||
4970 arg_type == ARG_PTR_TO_UNINIT_MAP_VALUE) {
4971
4972
4973
4974 if (!meta->map_ptr) {
4975
4976 verbose(env, "invalid map_ptr to access map->value\n");
4977 return -EACCES;
4978 }
4979 meta->raw_mode = (arg_type == ARG_PTR_TO_UNINIT_MAP_VALUE);
4980 err = check_helper_mem_access(env, regno,
4981 meta->map_ptr->value_size, false,
4982 meta);
4983 } else if (arg_type == ARG_PTR_TO_PERCPU_BTF_ID) {
4984 if (!reg->btf_id) {
4985 verbose(env, "Helper has invalid btf_id in R%d\n", regno);
4986 return -EACCES;
4987 }
4988 meta->ret_btf = reg->btf;
4989 meta->ret_btf_id = reg->btf_id;
4990 } else if (arg_type == ARG_PTR_TO_SPIN_LOCK) {
4991 if (meta->func_id == BPF_FUNC_spin_lock) {
4992 if (process_spin_lock(env, regno, true))
4993 return -EACCES;
4994 } else if (meta->func_id == BPF_FUNC_spin_unlock) {
4995 if (process_spin_lock(env, regno, false))
4996 return -EACCES;
4997 } else {
4998 verbose(env, "verifier internal error\n");
4999 return -EFAULT;
5000 }
5001 } else if (arg_type == ARG_PTR_TO_FUNC) {
5002 meta->subprogno = reg->subprogno;
5003 } else if (arg_type_is_mem_ptr(arg_type)) {
5004
5005
5006
5007 meta->raw_mode = (arg_type == ARG_PTR_TO_UNINIT_MEM);
5008 } else if (arg_type_is_mem_size(arg_type)) {
5009 bool zero_size_allowed = (arg_type == ARG_CONST_SIZE_OR_ZERO);
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019 meta->msize_max_value = reg->umax_value;
5020
5021
5022
5023
5024 if (!tnum_is_const(reg->var_off))
5025
5026
5027
5028
5029
5030 meta = NULL;
5031
5032 if (reg->smin_value < 0) {
5033 verbose(env, "R%d min value is negative, either use unsigned or 'var &= const'\n",
5034 regno);
5035 return -EACCES;
5036 }
5037
5038 if (reg->umin_value == 0) {
5039 err = check_helper_mem_access(env, regno - 1, 0,
5040 zero_size_allowed,
5041 meta);
5042 if (err)
5043 return err;
5044 }
5045
5046 if (reg->umax_value >= BPF_MAX_VAR_SIZ) {
5047 verbose(env, "R%d unbounded memory access, use 'var &= const' or 'if (var < const)'\n",
5048 regno);
5049 return -EACCES;
5050 }
5051 err = check_helper_mem_access(env, regno - 1,
5052 reg->umax_value,
5053 zero_size_allowed, meta);
5054 if (!err)
5055 err = mark_chain_precision(env, regno);
5056 } else if (arg_type_is_alloc_size(arg_type)) {
5057 if (!tnum_is_const(reg->var_off)) {
5058 verbose(env, "R%d is not a known constant'\n",
5059 regno);
5060 return -EACCES;
5061 }
5062 meta->mem_size = reg->var_off.value;
5063 } else if (arg_type_is_int_ptr(arg_type)) {
5064 int size = int_ptr_type_to_size(arg_type);
5065
5066 err = check_helper_mem_access(env, regno, size, false, meta);
5067 if (err)
5068 return err;
5069 err = check_ptr_alignment(env, reg, 0, size, true);
5070 } else if (arg_type == ARG_PTR_TO_CONST_STR) {
5071 struct bpf_map *map = reg->map_ptr;
5072 int map_off;
5073 u64 map_addr;
5074 char *str_ptr;
5075
5076 if (!bpf_map_is_rdonly(map)) {
5077 verbose(env, "R%d does not point to a readonly map'\n", regno);
5078 return -EACCES;
5079 }
5080
5081 if (!tnum_is_const(reg->var_off)) {
5082 verbose(env, "R%d is not a constant address'\n", regno);
5083 return -EACCES;
5084 }
5085
5086 if (!map->ops->map_direct_value_addr) {
5087 verbose(env, "no direct value access support for this map type\n");
5088 return -EACCES;
5089 }
5090
5091 err = check_map_access(env, regno, reg->off,
5092 map->value_size - reg->off, false);
5093 if (err)
5094 return err;
5095
5096 map_off = reg->off + reg->var_off.value;
5097 err = map->ops->map_direct_value_addr(map, &map_addr, map_off);
5098 if (err) {
5099 verbose(env, "direct value access on string failed\n");
5100 return err;
5101 }
5102
5103 str_ptr = (char *)(long)(map_addr);
5104 if (!strnchr(str_ptr + map_off, map->value_size - map_off, 0)) {
5105 verbose(env, "string is not zero-terminated\n");
5106 return -EINVAL;
5107 }
5108 }
5109
5110 return err;
5111}
5112
5113static bool may_update_sockmap(struct bpf_verifier_env *env, int func_id)
5114{
5115 enum bpf_attach_type eatype = env->prog->expected_attach_type;
5116 enum bpf_prog_type type = resolve_prog_type(env->prog);
5117
5118 if (func_id != BPF_FUNC_map_update_elem)
5119 return false;
5120
5121
5122
5123
5124 switch (type) {
5125 case BPF_PROG_TYPE_TRACING:
5126 if (eatype == BPF_TRACE_ITER)
5127 return true;
5128 break;
5129 case BPF_PROG_TYPE_SOCKET_FILTER:
5130 case BPF_PROG_TYPE_SCHED_CLS:
5131 case BPF_PROG_TYPE_SCHED_ACT:
5132 case BPF_PROG_TYPE_XDP:
5133 case BPF_PROG_TYPE_SK_REUSEPORT:
5134 case BPF_PROG_TYPE_FLOW_DISSECTOR:
5135 case BPF_PROG_TYPE_SK_LOOKUP:
5136 return true;
5137 default:
5138 break;
5139 }
5140
5141 verbose(env, "cannot update sockmap in this context\n");
5142 return false;
5143}
5144
5145static bool allow_tail_call_in_subprogs(struct bpf_verifier_env *env)
5146{
5147 return env->prog->jit_requested && IS_ENABLED(CONFIG_X86_64);
5148}
5149
5150static int check_map_func_compatibility(struct bpf_verifier_env *env,
5151 struct bpf_map *map, int func_id)
5152{
5153 if (!map)
5154 return 0;
5155
5156
5157 switch (map->map_type) {
5158 case BPF_MAP_TYPE_PROG_ARRAY:
5159 if (func_id != BPF_FUNC_tail_call)
5160 goto error;
5161 break;
5162 case BPF_MAP_TYPE_PERF_EVENT_ARRAY:
5163 if (func_id != BPF_FUNC_perf_event_read &&
5164 func_id != BPF_FUNC_perf_event_output &&
5165 func_id != BPF_FUNC_skb_output &&
5166 func_id != BPF_FUNC_perf_event_read_value &&
5167 func_id != BPF_FUNC_xdp_output)
5168 goto error;
5169 break;
5170 case BPF_MAP_TYPE_RINGBUF:
5171 if (func_id != BPF_FUNC_ringbuf_output &&
5172 func_id != BPF_FUNC_ringbuf_reserve &&
5173 func_id != BPF_FUNC_ringbuf_submit &&
5174 func_id != BPF_FUNC_ringbuf_discard &&
5175 func_id != BPF_FUNC_ringbuf_query)
5176 goto error;
5177 break;
5178 case BPF_MAP_TYPE_STACK_TRACE:
5179 if (func_id != BPF_FUNC_get_stackid)
5180 goto error;
5181 break;
5182 case BPF_MAP_TYPE_CGROUP_ARRAY:
5183 if (func_id != BPF_FUNC_skb_under_cgroup &&
5184 func_id != BPF_FUNC_current_task_under_cgroup)
5185 goto error;
5186 break;
5187 case BPF_MAP_TYPE_CGROUP_STORAGE:
5188 case BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE:
5189 if (func_id != BPF_FUNC_get_local_storage)
5190 goto error;
5191 break;
5192 case BPF_MAP_TYPE_DEVMAP:
5193 case BPF_MAP_TYPE_DEVMAP_HASH:
5194 if (func_id != BPF_FUNC_redirect_map &&
5195 func_id != BPF_FUNC_map_lookup_elem)
5196 goto error;
5197 break;
5198
5199
5200
5201 case BPF_MAP_TYPE_CPUMAP:
5202 if (func_id != BPF_FUNC_redirect_map)
5203 goto error;
5204 break;
5205 case BPF_MAP_TYPE_XSKMAP:
5206 if (func_id != BPF_FUNC_redirect_map &&
5207 func_id != BPF_FUNC_map_lookup_elem)
5208 goto error;
5209 break;
5210 case BPF_MAP_TYPE_ARRAY_OF_MAPS:
5211 case BPF_MAP_TYPE_HASH_OF_MAPS:
5212 if (func_id != BPF_FUNC_map_lookup_elem)
5213 goto error;
5214 break;
5215 case BPF_MAP_TYPE_SOCKMAP:
5216 if (func_id != BPF_FUNC_sk_redirect_map &&
5217 func_id != BPF_FUNC_sock_map_update &&
5218 func_id != BPF_FUNC_map_delete_elem &&
5219 func_id != BPF_FUNC_msg_redirect_map &&
5220 func_id != BPF_FUNC_sk_select_reuseport &&
5221 func_id != BPF_FUNC_map_lookup_elem &&
5222 !may_update_sockmap(env, func_id))
5223 goto error;
5224 break;
5225 case BPF_MAP_TYPE_SOCKHASH:
5226 if (func_id != BPF_FUNC_sk_redirect_hash &&
5227 func_id != BPF_FUNC_sock_hash_update &&
5228 func_id != BPF_FUNC_map_delete_elem &&
5229 func_id != BPF_FUNC_msg_redirect_hash &&
5230 func_id != BPF_FUNC_sk_select_reuseport &&
5231 func_id != BPF_FUNC_map_lookup_elem &&
5232 !may_update_sockmap(env, func_id))
5233 goto error;
5234 break;
5235 case BPF_MAP_TYPE_REUSEPORT_SOCKARRAY:
5236 if (func_id != BPF_FUNC_sk_select_reuseport)
5237 goto error;
5238 break;
5239 case BPF_MAP_TYPE_QUEUE:
5240 case BPF_MAP_TYPE_STACK:
5241 if (func_id != BPF_FUNC_map_peek_elem &&
5242 func_id != BPF_FUNC_map_pop_elem &&
5243 func_id != BPF_FUNC_map_push_elem)
5244 goto error;
5245 break;
5246 case BPF_MAP_TYPE_SK_STORAGE:
5247 if (func_id != BPF_FUNC_sk_storage_get &&
5248 func_id != BPF_FUNC_sk_storage_delete)
5249 goto error;
5250 break;
5251 case BPF_MAP_TYPE_INODE_STORAGE:
5252 if (func_id != BPF_FUNC_inode_storage_get &&
5253 func_id != BPF_FUNC_inode_storage_delete)
5254 goto error;
5255 break;
5256 case BPF_MAP_TYPE_TASK_STORAGE:
5257 if (func_id != BPF_FUNC_task_storage_get &&
5258 func_id != BPF_FUNC_task_storage_delete)
5259 goto error;
5260 break;
5261 default:
5262 break;
5263 }
5264
5265
5266 switch (func_id) {
5267 case BPF_FUNC_tail_call:
5268 if (map->map_type != BPF_MAP_TYPE_PROG_ARRAY)
5269 goto error;
5270 if (env->subprog_cnt > 1 && !allow_tail_call_in_subprogs(env)) {
5271 verbose(env, "tail_calls are not allowed in non-JITed programs with bpf-to-bpf calls\n");
5272 return -EINVAL;
5273 }
5274 break;
5275 case BPF_FUNC_perf_event_read:
5276 case BPF_FUNC_perf_event_output:
5277 case BPF_FUNC_perf_event_read_value:
5278 case BPF_FUNC_skb_output:
5279 case BPF_FUNC_xdp_output:
5280 if (map->map_type != BPF_MAP_TYPE_PERF_EVENT_ARRAY)
5281 goto error;
5282 break;
5283 case BPF_FUNC_get_stackid:
5284 if (map->map_type != BPF_MAP_TYPE_STACK_TRACE)
5285 goto error;
5286 break;
5287 case BPF_FUNC_current_task_under_cgroup:
5288 case BPF_FUNC_skb_under_cgroup:
5289 if (map->map_type != BPF_MAP_TYPE_CGROUP_ARRAY)
5290 goto error;
5291 break;
5292 case BPF_FUNC_redirect_map:
5293 if (map->map_type != BPF_MAP_TYPE_DEVMAP &&
5294 map->map_type != BPF_MAP_TYPE_DEVMAP_HASH &&
5295 map->map_type != BPF_MAP_TYPE_CPUMAP &&
5296 map->map_type != BPF_MAP_TYPE_XSKMAP)
5297 goto error;
5298 break;
5299 case BPF_FUNC_sk_redirect_map:
5300 case BPF_FUNC_msg_redirect_map:
5301 case BPF_FUNC_sock_map_update:
5302 if (map->map_type != BPF_MAP_TYPE_SOCKMAP)
5303 goto error;
5304 break;
5305 case BPF_FUNC_sk_redirect_hash:
5306 case BPF_FUNC_msg_redirect_hash:
5307 case BPF_FUNC_sock_hash_update:
5308 if (map->map_type != BPF_MAP_TYPE_SOCKHASH)
5309 goto error;
5310 break;
5311 case BPF_FUNC_get_local_storage:
5312 if (map->map_type != BPF_MAP_TYPE_CGROUP_STORAGE &&
5313 map->map_type != BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE)
5314 goto error;
5315 break;
5316 case BPF_FUNC_sk_select_reuseport:
5317 if (map->map_type != BPF_MAP_TYPE_REUSEPORT_SOCKARRAY &&
5318 map->map_type != BPF_MAP_TYPE_SOCKMAP &&
5319 map->map_type != BPF_MAP_TYPE_SOCKHASH)
5320 goto error;
5321 break;
5322 case BPF_FUNC_map_peek_elem:
5323 case BPF_FUNC_map_pop_elem:
5324 case BPF_FUNC_map_push_elem:
5325 if (map->map_type != BPF_MAP_TYPE_QUEUE &&
5326 map->map_type != BPF_MAP_TYPE_STACK)
5327 goto error;
5328 break;
5329 case BPF_FUNC_sk_storage_get:
5330 case BPF_FUNC_sk_storage_delete:
5331 if (map->map_type != BPF_MAP_TYPE_SK_STORAGE)
5332 goto error;
5333 break;
5334 case BPF_FUNC_inode_storage_get:
5335 case BPF_FUNC_inode_storage_delete:
5336 if (map->map_type != BPF_MAP_TYPE_INODE_STORAGE)
5337 goto error;
5338 break;
5339 case BPF_FUNC_task_storage_get:
5340 case BPF_FUNC_task_storage_delete:
5341 if (map->map_type != BPF_MAP_TYPE_TASK_STORAGE)
5342 goto error;
5343 break;
5344 default:
5345 break;
5346 }
5347
5348 return 0;
5349error:
5350 verbose(env, "cannot pass map_type %d into func %s#%d\n",
5351 map->map_type, func_id_name(func_id), func_id);
5352 return -EINVAL;
5353}
5354
5355static bool check_raw_mode_ok(const struct bpf_func_proto *fn)
5356{
5357 int count = 0;
5358
5359 if (fn->arg1_type == ARG_PTR_TO_UNINIT_MEM)
5360 count++;
5361 if (fn->arg2_type == ARG_PTR_TO_UNINIT_MEM)
5362 count++;
5363 if (fn->arg3_type == ARG_PTR_TO_UNINIT_MEM)
5364 count++;
5365 if (fn->arg4_type == ARG_PTR_TO_UNINIT_MEM)
5366 count++;
5367 if (fn->arg5_type == ARG_PTR_TO_UNINIT_MEM)
5368 count++;
5369
5370
5371
5372
5373
5374 return count <= 1;
5375}
5376
5377static bool check_args_pair_invalid(enum bpf_arg_type arg_curr,
5378 enum bpf_arg_type arg_next)
5379{
5380 return (arg_type_is_mem_ptr(arg_curr) &&
5381 !arg_type_is_mem_size(arg_next)) ||
5382 (!arg_type_is_mem_ptr(arg_curr) &&
5383 arg_type_is_mem_size(arg_next));
5384}
5385
5386static bool check_arg_pair_ok(const struct bpf_func_proto *fn)
5387{
5388
5389
5390
5391
5392
5393 if (arg_type_is_mem_size(fn->arg1_type) ||
5394 arg_type_is_mem_ptr(fn->arg5_type) ||
5395 check_args_pair_invalid(fn->arg1_type, fn->arg2_type) ||
5396 check_args_pair_invalid(fn->arg2_type, fn->arg3_type) ||
5397 check_args_pair_invalid(fn->arg3_type, fn->arg4_type) ||
5398 check_args_pair_invalid(fn->arg4_type, fn->arg5_type))
5399 return false;
5400
5401 return true;
5402}
5403
5404static bool check_refcount_ok(const struct bpf_func_proto *fn, int func_id)
5405{
5406 int count = 0;
5407
5408 if (arg_type_may_be_refcounted(fn->arg1_type))
5409 count++;
5410 if (arg_type_may_be_refcounted(fn->arg2_type))
5411 count++;
5412 if (arg_type_may_be_refcounted(fn->arg3_type))
5413 count++;
5414 if (arg_type_may_be_refcounted(fn->arg4_type))
5415 count++;
5416 if (arg_type_may_be_refcounted(fn->arg5_type))
5417 count++;
5418
5419
5420
5421
5422 if (may_be_acquire_function(func_id) && count)
5423 return false;
5424
5425
5426
5427
5428 return count <= 1;
5429}
5430
5431static bool check_btf_id_ok(const struct bpf_func_proto *fn)
5432{
5433 int i;
5434
5435 for (i = 0; i < ARRAY_SIZE(fn->arg_type); i++) {
5436 if (fn->arg_type[i] == ARG_PTR_TO_BTF_ID && !fn->arg_btf_id[i])
5437 return false;
5438
5439 if (fn->arg_type[i] != ARG_PTR_TO_BTF_ID && fn->arg_btf_id[i])
5440 return false;
5441 }
5442
5443 return true;
5444}
5445
5446static int check_func_proto(const struct bpf_func_proto *fn, int func_id)
5447{
5448 return check_raw_mode_ok(fn) &&
5449 check_arg_pair_ok(fn) &&
5450 check_btf_id_ok(fn) &&
5451 check_refcount_ok(fn, func_id) ? 0 : -EINVAL;
5452}
5453
5454
5455
5456
5457static void __clear_all_pkt_pointers(struct bpf_verifier_env *env,
5458 struct bpf_func_state *state)
5459{
5460 struct bpf_reg_state *regs = state->regs, *reg;
5461 int i;
5462
5463 for (i = 0; i < MAX_BPF_REG; i++)
5464 if (reg_is_pkt_pointer_any(®s[i]))
5465 mark_reg_unknown(env, regs, i);
5466
5467 bpf_for_each_spilled_reg(i, state, reg) {
5468 if (!reg)
5469 continue;
5470 if (reg_is_pkt_pointer_any(reg))
5471 __mark_reg_unknown(env, reg);
5472 }
5473}
5474
5475static void clear_all_pkt_pointers(struct bpf_verifier_env *env)
5476{
5477 struct bpf_verifier_state *vstate = env->cur_state;
5478 int i;
5479
5480 for (i = 0; i <= vstate->curframe; i++)
5481 __clear_all_pkt_pointers(env, vstate->frame[i]);
5482}
5483
5484enum {
5485 AT_PKT_END = -1,
5486 BEYOND_PKT_END = -2,
5487};
5488
5489static void mark_pkt_end(struct bpf_verifier_state *vstate, int regn, bool range_open)
5490{
5491 struct bpf_func_state *state = vstate->frame[vstate->curframe];
5492 struct bpf_reg_state *reg = &state->regs[regn];
5493
5494 if (reg->type != PTR_TO_PACKET)
5495
5496 return;
5497
5498
5499
5500
5501
5502
5503
5504 if (range_open)
5505 reg->range = BEYOND_PKT_END;
5506 else
5507 reg->range = AT_PKT_END;
5508}
5509
5510static void release_reg_references(struct bpf_verifier_env *env,
5511 struct bpf_func_state *state,
5512 int ref_obj_id)
5513{
5514 struct bpf_reg_state *regs = state->regs, *reg;
5515 int i;
5516
5517 for (i = 0; i < MAX_BPF_REG; i++)
5518 if (regs[i].ref_obj_id == ref_obj_id)
5519 mark_reg_unknown(env, regs, i);
5520
5521 bpf_for_each_spilled_reg(i, state, reg) {
5522 if (!reg)
5523 continue;
5524 if (reg->ref_obj_id == ref_obj_id)
5525 __mark_reg_unknown(env, reg);
5526 }
5527}
5528
5529
5530
5531
5532static int release_reference(struct bpf_verifier_env *env,
5533 int ref_obj_id)
5534{
5535 struct bpf_verifier_state *vstate = env->cur_state;
5536 int err;
5537 int i;
5538
5539 err = release_reference_state(cur_func(env), ref_obj_id);
5540 if (err)
5541 return err;
5542
5543 for (i = 0; i <= vstate->curframe; i++)
5544 release_reg_references(env, vstate->frame[i], ref_obj_id);
5545
5546 return 0;
5547}
5548
5549static void clear_caller_saved_regs(struct bpf_verifier_env *env,
5550 struct bpf_reg_state *regs)
5551{
5552 int i;
5553
5554
5555 for (i = 0; i < CALLER_SAVED_REGS; i++) {
5556 mark_reg_not_init(env, regs, caller_saved[i]);
5557 check_reg_arg(env, caller_saved[i], DST_OP_NO_MARK);
5558 }
5559}
5560
5561typedef int (*set_callee_state_fn)(struct bpf_verifier_env *env,
5562 struct bpf_func_state *caller,
5563 struct bpf_func_state *callee,
5564 int insn_idx);
5565
5566static int __check_func_call(struct bpf_verifier_env *env, struct bpf_insn *insn,
5567 int *insn_idx, int subprog,
5568 set_callee_state_fn set_callee_state_cb)
5569{
5570 struct bpf_verifier_state *state = env->cur_state;
5571 struct bpf_func_info_aux *func_info_aux;
5572 struct bpf_func_state *caller, *callee;
5573 int err;
5574 bool is_global = false;
5575
5576 if (state->curframe + 1 >= MAX_CALL_FRAMES) {
5577 verbose(env, "the call stack of %d frames is too deep\n",
5578 state->curframe + 2);
5579 return -E2BIG;
5580 }
5581
5582 caller = state->frame[state->curframe];
5583 if (state->frame[state->curframe + 1]) {
5584 verbose(env, "verifier bug. Frame %d already allocated\n",
5585 state->curframe + 1);
5586 return -EFAULT;
5587 }
5588
5589 func_info_aux = env->prog->aux->func_info_aux;
5590 if (func_info_aux)
5591 is_global = func_info_aux[subprog].linkage == BTF_FUNC_GLOBAL;
5592 err = btf_check_subprog_arg_match(env, subprog, caller->regs);
5593 if (err == -EFAULT)
5594 return err;
5595 if (is_global) {
5596 if (err) {
5597 verbose(env, "Caller passes invalid args into func#%d\n",
5598 subprog);
5599 return err;
5600 } else {
5601 if (env->log.level & BPF_LOG_LEVEL)
5602 verbose(env,
5603 "Func#%d is global and valid. Skipping.\n",
5604 subprog);
5605 clear_caller_saved_regs(env, caller->regs);
5606
5607
5608 mark_reg_unknown(env, caller->regs, BPF_REG_0);
5609 caller->regs[BPF_REG_0].subreg_def = DEF_NOT_SUBREG;
5610
5611
5612 return 0;
5613 }
5614 }
5615
5616 callee = kzalloc(sizeof(*callee), GFP_KERNEL);
5617 if (!callee)
5618 return -ENOMEM;
5619 state->frame[state->curframe + 1] = callee;
5620
5621
5622
5623
5624
5625 init_func_state(env, callee,
5626
5627 *insn_idx ,
5628 state->curframe + 1 ,
5629 subprog );
5630
5631
5632 err = transfer_reference_state(callee, caller);
5633 if (err)
5634 return err;
5635
5636 err = set_callee_state_cb(env, caller, callee, *insn_idx);
5637 if (err)
5638 return err;
5639
5640 clear_caller_saved_regs(env, caller->regs);
5641
5642
5643 state->curframe++;
5644
5645
5646 *insn_idx = env->subprog_info[subprog].start - 1;
5647
5648 if (env->log.level & BPF_LOG_LEVEL) {
5649 verbose(env, "caller:\n");
5650 print_verifier_state(env, caller);
5651 verbose(env, "callee:\n");
5652 print_verifier_state(env, callee);
5653 }
5654 return 0;
5655}
5656
5657int map_set_for_each_callback_args(struct bpf_verifier_env *env,
5658 struct bpf_func_state *caller,
5659 struct bpf_func_state *callee)
5660{
5661
5662
5663
5664
5665
5666 callee->regs[BPF_REG_1] = caller->regs[BPF_REG_1];
5667
5668 callee->regs[BPF_REG_2].type = PTR_TO_MAP_KEY;
5669 __mark_reg_known_zero(&callee->regs[BPF_REG_2]);
5670 callee->regs[BPF_REG_2].map_ptr = caller->regs[BPF_REG_1].map_ptr;
5671
5672 callee->regs[BPF_REG_3].type = PTR_TO_MAP_VALUE;
5673 __mark_reg_known_zero(&callee->regs[BPF_REG_3]);
5674 callee->regs[BPF_REG_3].map_ptr = caller->regs[BPF_REG_1].map_ptr;
5675
5676
5677 callee->regs[BPF_REG_4] = caller->regs[BPF_REG_3];
5678
5679
5680 __mark_reg_not_init(env, &callee->regs[BPF_REG_5]);
5681 return 0;
5682}
5683
5684static int set_callee_state(struct bpf_verifier_env *env,
5685 struct bpf_func_state *caller,
5686 struct bpf_func_state *callee, int insn_idx)
5687{
5688 int i;
5689
5690
5691
5692
5693 for (i = BPF_REG_1; i <= BPF_REG_5; i++)
5694 callee->regs[i] = caller->regs[i];
5695 return 0;
5696}
5697
5698static int check_func_call(struct bpf_verifier_env *env, struct bpf_insn *insn,
5699 int *insn_idx)
5700{
5701 int subprog, target_insn;
5702
5703 target_insn = *insn_idx + insn->imm + 1;
5704 subprog = find_subprog(env, target_insn);
5705 if (subprog < 0) {
5706 verbose(env, "verifier bug. No program starts at insn %d\n",
5707 target_insn);
5708 return -EFAULT;
5709 }
5710
5711 return __check_func_call(env, insn, insn_idx, subprog, set_callee_state);
5712}
5713
5714static int set_map_elem_callback_state(struct bpf_verifier_env *env,
5715 struct bpf_func_state *caller,
5716 struct bpf_func_state *callee,
5717 int insn_idx)
5718{
5719 struct bpf_insn_aux_data *insn_aux = &env->insn_aux_data[insn_idx];
5720 struct bpf_map *map;
5721 int err;
5722
5723 if (bpf_map_ptr_poisoned(insn_aux)) {
5724 verbose(env, "tail_call abusing map_ptr\n");
5725 return -EINVAL;
5726 }
5727
5728 map = BPF_MAP_PTR(insn_aux->map_ptr_state);
5729 if (!map->ops->map_set_for_each_callback_args ||
5730 !map->ops->map_for_each_callback) {
5731 verbose(env, "callback function not allowed for map\n");
5732 return -ENOTSUPP;
5733 }
5734
5735 err = map->ops->map_set_for_each_callback_args(env, caller, callee);
5736 if (err)
5737 return err;
5738
5739 callee->in_callback_fn = true;
5740 return 0;
5741}
5742
5743static int prepare_func_exit(struct bpf_verifier_env *env, int *insn_idx)
5744{
5745 struct bpf_verifier_state *state = env->cur_state;
5746 struct bpf_func_state *caller, *callee;
5747 struct bpf_reg_state *r0;
5748 int err;
5749
5750 callee = state->frame[state->curframe];
5751 r0 = &callee->regs[BPF_REG_0];
5752 if (r0->type == PTR_TO_STACK) {
5753
5754
5755
5756
5757
5758
5759 verbose(env, "cannot return stack pointer to the caller\n");
5760 return -EINVAL;
5761 }
5762
5763 state->curframe--;
5764 caller = state->frame[state->curframe];
5765 if (callee->in_callback_fn) {
5766
5767 struct tnum range = tnum_range(0, 1);
5768
5769 if (r0->type != SCALAR_VALUE) {
5770 verbose(env, "R0 not a scalar value\n");
5771 return -EACCES;
5772 }
5773 if (!tnum_in(range, r0->var_off)) {
5774 verbose_invalid_scalar(env, r0, &range, "callback return", "R0");
5775 return -EINVAL;
5776 }
5777 } else {
5778
5779 caller->regs[BPF_REG_0] = *r0;
5780 }
5781
5782
5783 err = transfer_reference_state(caller, callee);
5784 if (err)
5785 return err;
5786
5787 *insn_idx = callee->callsite + 1;
5788 if (env->log.level & BPF_LOG_LEVEL) {
5789 verbose(env, "returning from callee:\n");
5790 print_verifier_state(env, callee);
5791 verbose(env, "to caller at %d:\n", *insn_idx);
5792 print_verifier_state(env, caller);
5793 }
5794
5795 free_func_state(callee);
5796 state->frame[state->curframe + 1] = NULL;
5797 return 0;
5798}
5799
5800static void do_refine_retval_range(struct bpf_reg_state *regs, int ret_type,
5801 int func_id,
5802 struct bpf_call_arg_meta *meta)
5803{
5804 struct bpf_reg_state *ret_reg = ®s[BPF_REG_0];
5805
5806 if (ret_type != RET_INTEGER ||
5807 (func_id != BPF_FUNC_get_stack &&
5808 func_id != BPF_FUNC_get_task_stack &&
5809 func_id != BPF_FUNC_probe_read_str &&
5810 func_id != BPF_FUNC_probe_read_kernel_str &&
5811 func_id != BPF_FUNC_probe_read_user_str))
5812 return;
5813
5814 ret_reg->smax_value = meta->msize_max_value;
5815 ret_reg->s32_max_value = meta->msize_max_value;
5816 ret_reg->smin_value = -MAX_ERRNO;
5817 ret_reg->s32_min_value = -MAX_ERRNO;
5818 __reg_deduce_bounds(ret_reg);
5819 __reg_bound_offset(ret_reg);
5820 __update_reg_bounds(ret_reg);
5821}
5822
5823static int
5824record_func_map(struct bpf_verifier_env *env, struct bpf_call_arg_meta *meta,
5825 int func_id, int insn_idx)
5826{
5827 struct bpf_insn_aux_data *aux = &env->insn_aux_data[insn_idx];
5828 struct bpf_map *map = meta->map_ptr;
5829
5830 if (func_id != BPF_FUNC_tail_call &&
5831 func_id != BPF_FUNC_map_lookup_elem &&
5832 func_id != BPF_FUNC_map_update_elem &&
5833 func_id != BPF_FUNC_map_delete_elem &&
5834 func_id != BPF_FUNC_map_push_elem &&
5835 func_id != BPF_FUNC_map_pop_elem &&
5836 func_id != BPF_FUNC_map_peek_elem &&
5837 func_id != BPF_FUNC_for_each_map_elem &&
5838 func_id != BPF_FUNC_redirect_map)
5839 return 0;
5840
5841 if (map == NULL) {
5842 verbose(env, "kernel subsystem misconfigured verifier\n");
5843 return -EINVAL;
5844 }
5845
5846
5847
5848
5849
5850 if ((map->map_flags & BPF_F_RDONLY_PROG) &&
5851 (func_id == BPF_FUNC_map_delete_elem ||
5852 func_id == BPF_FUNC_map_update_elem ||
5853 func_id == BPF_FUNC_map_push_elem ||
5854 func_id == BPF_FUNC_map_pop_elem)) {
5855 verbose(env, "write into map forbidden\n");
5856 return -EACCES;
5857 }
5858
5859 if (!BPF_MAP_PTR(aux->map_ptr_state))
5860 bpf_map_ptr_store(aux, meta->map_ptr,
5861 !meta->map_ptr->bypass_spec_v1);
5862 else if (BPF_MAP_PTR(aux->map_ptr_state) != meta->map_ptr)
5863 bpf_map_ptr_store(aux, BPF_MAP_PTR_POISON,
5864 !meta->map_ptr->bypass_spec_v1);
5865 return 0;
5866}
5867
5868static int
5869record_func_key(struct bpf_verifier_env *env, struct bpf_call_arg_meta *meta,
5870 int func_id, int insn_idx)
5871{
5872 struct bpf_insn_aux_data *aux = &env->insn_aux_data[insn_idx];
5873 struct bpf_reg_state *regs = cur_regs(env), *reg;
5874 struct bpf_map *map = meta->map_ptr;
5875 struct tnum range;
5876 u64 val;
5877 int err;
5878
5879 if (func_id != BPF_FUNC_tail_call)
5880 return 0;
5881 if (!map || map->map_type != BPF_MAP_TYPE_PROG_ARRAY) {
5882 verbose(env, "kernel subsystem misconfigured verifier\n");
5883 return -EINVAL;
5884 }
5885
5886 range = tnum_range(0, map->max_entries - 1);
5887 reg = ®s[BPF_REG_3];
5888
5889 if (!register_is_const(reg) || !tnum_in(range, reg->var_off)) {
5890 bpf_map_key_store(aux, BPF_MAP_KEY_POISON);
5891 return 0;
5892 }
5893
5894 err = mark_chain_precision(env, BPF_REG_3);
5895 if (err)
5896 return err;
5897
5898 val = reg->var_off.value;
5899 if (bpf_map_key_unseen(aux))
5900 bpf_map_key_store(aux, val);
5901 else if (!bpf_map_key_poisoned(aux) &&
5902 bpf_map_key_immediate(aux) != val)
5903 bpf_map_key_store(aux, BPF_MAP_KEY_POISON);
5904 return 0;
5905}
5906
5907static int check_reference_leak(struct bpf_verifier_env *env)
5908{
5909 struct bpf_func_state *state = cur_func(env);
5910 int i;
5911
5912 for (i = 0; i < state->acquired_refs; i++) {
5913 verbose(env, "Unreleased reference id=%d alloc_insn=%d\n",
5914 state->refs[i].id, state->refs[i].insn_idx);
5915 }
5916 return state->acquired_refs ? -EINVAL : 0;
5917}
5918
5919static int check_bpf_snprintf_call(struct bpf_verifier_env *env,
5920 struct bpf_reg_state *regs)
5921{
5922 struct bpf_reg_state *fmt_reg = ®s[BPF_REG_3];
5923 struct bpf_reg_state *data_len_reg = ®s[BPF_REG_5];
5924 struct bpf_map *fmt_map = fmt_reg->map_ptr;
5925 int err, fmt_map_off, num_args;
5926 u64 fmt_addr;
5927 char *fmt;
5928
5929
5930 if (data_len_reg->var_off.value % 8)
5931 return -EINVAL;
5932 num_args = data_len_reg->var_off.value / 8;
5933
5934
5935
5936
5937 fmt_map_off = fmt_reg->off + fmt_reg->var_off.value;
5938 err = fmt_map->ops->map_direct_value_addr(fmt_map, &fmt_addr,
5939 fmt_map_off);
5940 if (err) {
5941 verbose(env, "verifier bug\n");
5942 return -EFAULT;
5943 }
5944 fmt = (char *)(long)fmt_addr + fmt_map_off;
5945
5946
5947
5948
5949 err = bpf_bprintf_prepare(fmt, UINT_MAX, NULL, NULL, num_args);
5950 if (err < 0)
5951 verbose(env, "Invalid format string\n");
5952
5953 return err;
5954}
5955
5956static int check_helper_call(struct bpf_verifier_env *env, struct bpf_insn *insn,
5957 int *insn_idx_p)
5958{
5959 const struct bpf_func_proto *fn = NULL;
5960 struct bpf_reg_state *regs;
5961 struct bpf_call_arg_meta meta;
5962 int insn_idx = *insn_idx_p;
5963 bool changes_data;
5964 int i, err, func_id;
5965
5966
5967 func_id = insn->imm;
5968 if (func_id < 0 || func_id >= __BPF_FUNC_MAX_ID) {
5969 verbose(env, "invalid func %s#%d\n", func_id_name(func_id),
5970 func_id);
5971 return -EINVAL;
5972 }
5973
5974 if (env->ops->get_func_proto)
5975 fn = env->ops->get_func_proto(func_id, env->prog);
5976 if (!fn) {
5977 verbose(env, "unknown func %s#%d\n", func_id_name(func_id),
5978 func_id);
5979 return -EINVAL;
5980 }
5981
5982
5983 if (!env->prog->gpl_compatible && fn->gpl_only) {
5984 verbose(env, "cannot call GPL-restricted function from non-GPL compatible program\n");
5985 return -EINVAL;
5986 }
5987
5988 if (fn->allowed && !fn->allowed(env->prog)) {
5989 verbose(env, "helper call is not allowed in probe\n");
5990 return -EINVAL;
5991 }
5992
5993
5994 changes_data = bpf_helper_changes_pkt_data(fn->func);
5995 if (changes_data && fn->arg1_type != ARG_PTR_TO_CTX) {
5996 verbose(env, "kernel subsystem misconfigured func %s#%d: r1 != ctx\n",
5997 func_id_name(func_id), func_id);
5998 return -EINVAL;
5999 }
6000
6001 memset(&meta, 0, sizeof(meta));
6002 meta.pkt_access = fn->pkt_access;
6003
6004 err = check_func_proto(fn, func_id);
6005 if (err) {
6006 verbose(env, "kernel subsystem misconfigured func %s#%d\n",
6007 func_id_name(func_id), func_id);
6008 return err;
6009 }
6010
6011 meta.func_id = func_id;
6012
6013 for (i = 0; i < MAX_BPF_FUNC_REG_ARGS; i++) {
6014 err = check_func_arg(env, i, &meta, fn);
6015 if (err)
6016 return err;
6017 }
6018
6019 err = record_func_map(env, &meta, func_id, insn_idx);
6020 if (err)
6021 return err;
6022
6023 err = record_func_key(env, &meta, func_id, insn_idx);
6024 if (err)
6025 return err;
6026
6027
6028
6029
6030 for (i = 0; i < meta.access_size; i++) {
6031 err = check_mem_access(env, insn_idx, meta.regno, i, BPF_B,
6032 BPF_WRITE, -1, false);
6033 if (err)
6034 return err;
6035 }
6036
6037 if (func_id == BPF_FUNC_tail_call) {
6038 err = check_reference_leak(env);
6039 if (err) {
6040 verbose(env, "tail_call would lead to reference leak\n");
6041 return err;
6042 }
6043 } else if (is_release_function(func_id)) {
6044 err = release_reference(env, meta.ref_obj_id);
6045 if (err) {
6046 verbose(env, "func %s#%d reference has not been acquired before\n",
6047 func_id_name(func_id), func_id);
6048 return err;
6049 }
6050 }
6051
6052 regs = cur_regs(env);
6053
6054
6055
6056
6057 if (func_id == BPF_FUNC_get_local_storage &&
6058 !register_is_null(®s[BPF_REG_2])) {
6059 verbose(env, "get_local_storage() doesn't support non-zero flags\n");
6060 return -EINVAL;
6061 }
6062
6063 if (func_id == BPF_FUNC_for_each_map_elem) {
6064 err = __check_func_call(env, insn, insn_idx_p, meta.subprogno,
6065 set_map_elem_callback_state);
6066 if (err < 0)
6067 return -EINVAL;
6068 }
6069
6070 if (func_id == BPF_FUNC_snprintf) {
6071 err = check_bpf_snprintf_call(env, regs);
6072 if (err < 0)
6073 return err;
6074 }
6075
6076
6077 for (i = 0; i < CALLER_SAVED_REGS; i++) {
6078 mark_reg_not_init(env, regs, caller_saved[i]);
6079 check_reg_arg(env, caller_saved[i], DST_OP_NO_MARK);
6080 }
6081
6082
6083 regs[BPF_REG_0].subreg_def = DEF_NOT_SUBREG;
6084
6085
6086 if (fn->ret_type == RET_INTEGER) {
6087
6088 mark_reg_unknown(env, regs, BPF_REG_0);
6089 } else if (fn->ret_type == RET_VOID) {
6090 regs[BPF_REG_0].type = NOT_INIT;
6091 } else if (fn->ret_type == RET_PTR_TO_MAP_VALUE_OR_NULL ||
6092 fn->ret_type == RET_PTR_TO_MAP_VALUE) {
6093
6094 mark_reg_known_zero(env, regs, BPF_REG_0);
6095
6096
6097
6098
6099 if (meta.map_ptr == NULL) {
6100 verbose(env,
6101 "kernel subsystem misconfigured verifier\n");
6102 return -EINVAL;
6103 }
6104 regs[BPF_REG_0].map_ptr = meta.map_ptr;
6105 if (fn->ret_type == RET_PTR_TO_MAP_VALUE) {
6106 regs[BPF_REG_0].type = PTR_TO_MAP_VALUE;
6107 if (map_value_has_spin_lock(meta.map_ptr))
6108 regs[BPF_REG_0].id = ++env->id_gen;
6109 } else {
6110 regs[BPF_REG_0].type = PTR_TO_MAP_VALUE_OR_NULL;
6111 }
6112 } else if (fn->ret_type == RET_PTR_TO_SOCKET_OR_NULL) {
6113 mark_reg_known_zero(env, regs, BPF_REG_0);
6114 regs[BPF_REG_0].type = PTR_TO_SOCKET_OR_NULL;
6115 } else if (fn->ret_type == RET_PTR_TO_SOCK_COMMON_OR_NULL) {
6116 mark_reg_known_zero(env, regs, BPF_REG_0);
6117 regs[BPF_REG_0].type = PTR_TO_SOCK_COMMON_OR_NULL;
6118 } else if (fn->ret_type == RET_PTR_TO_TCP_SOCK_OR_NULL) {
6119 mark_reg_known_zero(env, regs, BPF_REG_0);
6120 regs[BPF_REG_0].type = PTR_TO_TCP_SOCK_OR_NULL;
6121 } else if (fn->ret_type == RET_PTR_TO_ALLOC_MEM_OR_NULL) {
6122 mark_reg_known_zero(env, regs, BPF_REG_0);
6123 regs[BPF_REG_0].type = PTR_TO_MEM_OR_NULL;
6124 regs[BPF_REG_0].mem_size = meta.mem_size;
6125 } else if (fn->ret_type == RET_PTR_TO_MEM_OR_BTF_ID_OR_NULL ||
6126 fn->ret_type == RET_PTR_TO_MEM_OR_BTF_ID) {
6127 const struct btf_type *t;
6128
6129 mark_reg_known_zero(env, regs, BPF_REG_0);
6130 t = btf_type_skip_modifiers(meta.ret_btf, meta.ret_btf_id, NULL);
6131 if (!btf_type_is_struct(t)) {
6132 u32 tsize;
6133 const struct btf_type *ret;
6134 const char *tname;
6135
6136
6137 ret = btf_resolve_size(meta.ret_btf, t, &tsize);
6138 if (IS_ERR(ret)) {
6139 tname = btf_name_by_offset(meta.ret_btf, t->name_off);
6140 verbose(env, "unable to resolve the size of type '%s': %ld\n",
6141 tname, PTR_ERR(ret));
6142 return -EINVAL;
6143 }
6144 regs[BPF_REG_0].type =
6145 fn->ret_type == RET_PTR_TO_MEM_OR_BTF_ID ?
6146 PTR_TO_MEM : PTR_TO_MEM_OR_NULL;
6147 regs[BPF_REG_0].mem_size = tsize;
6148 } else {
6149 regs[BPF_REG_0].type =
6150 fn->ret_type == RET_PTR_TO_MEM_OR_BTF_ID ?
6151 PTR_TO_BTF_ID : PTR_TO_BTF_ID_OR_NULL;
6152 regs[BPF_REG_0].btf = meta.ret_btf;
6153 regs[BPF_REG_0].btf_id = meta.ret_btf_id;
6154 }
6155 } else if (fn->ret_type == RET_PTR_TO_BTF_ID_OR_NULL ||
6156 fn->ret_type == RET_PTR_TO_BTF_ID) {
6157 int ret_btf_id;
6158
6159 mark_reg_known_zero(env, regs, BPF_REG_0);
6160 regs[BPF_REG_0].type = fn->ret_type == RET_PTR_TO_BTF_ID ?
6161 PTR_TO_BTF_ID :
6162 PTR_TO_BTF_ID_OR_NULL;
6163 ret_btf_id = *fn->ret_btf_id;
6164 if (ret_btf_id == 0) {
6165 verbose(env, "invalid return type %d of func %s#%d\n",
6166 fn->ret_type, func_id_name(func_id), func_id);
6167 return -EINVAL;
6168 }
6169
6170
6171
6172 regs[BPF_REG_0].btf = btf_vmlinux;
6173 regs[BPF_REG_0].btf_id = ret_btf_id;
6174 } else {
6175 verbose(env, "unknown return type %d of func %s#%d\n",
6176 fn->ret_type, func_id_name(func_id), func_id);
6177 return -EINVAL;
6178 }
6179
6180 if (reg_type_may_be_null(regs[BPF_REG_0].type))
6181 regs[BPF_REG_0].id = ++env->id_gen;
6182
6183 if (is_ptr_cast_function(func_id)) {
6184
6185 regs[BPF_REG_0].ref_obj_id = meta.ref_obj_id;
6186 } else if (is_acquire_function(func_id, meta.map_ptr)) {
6187 int id = acquire_reference_state(env, insn_idx);
6188
6189 if (id < 0)
6190 return id;
6191
6192 regs[BPF_REG_0].id = id;
6193
6194 regs[BPF_REG_0].ref_obj_id = id;
6195 }
6196
6197 do_refine_retval_range(regs, fn->ret_type, func_id, &meta);
6198
6199 err = check_map_func_compatibility(env, meta.map_ptr, func_id);
6200 if (err)
6201 return err;
6202
6203 if ((func_id == BPF_FUNC_get_stack ||
6204 func_id == BPF_FUNC_get_task_stack) &&
6205 !env->prog->has_callchain_buf) {
6206 const char *err_str;
6207
6208#ifdef CONFIG_PERF_EVENTS
6209 err = get_callchain_buffers(sysctl_perf_event_max_stack);
6210 err_str = "cannot get callchain buffer for func %s#%d\n";
6211#else
6212 err = -ENOTSUPP;
6213 err_str = "func %s#%d not supported without CONFIG_PERF_EVENTS\n";
6214#endif
6215 if (err) {
6216 verbose(env, err_str, func_id_name(func_id), func_id);
6217 return err;
6218 }
6219
6220 env->prog->has_callchain_buf = true;
6221 }
6222
6223 if (func_id == BPF_FUNC_get_stackid || func_id == BPF_FUNC_get_stack)
6224 env->prog->call_get_stack = true;
6225
6226 if (changes_data)
6227 clear_all_pkt_pointers(env);
6228 return 0;
6229}
6230
6231
6232
6233
6234static void mark_btf_func_reg_size(struct bpf_verifier_env *env, u32 regno,
6235 size_t reg_size)
6236{
6237 struct bpf_reg_state *reg = &cur_regs(env)[regno];
6238
6239 if (regno == BPF_REG_0) {
6240
6241 reg->live |= REG_LIVE_WRITTEN;
6242 reg->subreg_def = reg_size == sizeof(u64) ?
6243 DEF_NOT_SUBREG : env->insn_idx + 1;
6244 } else {
6245
6246 if (reg_size == sizeof(u64)) {
6247 mark_insn_zext(env, reg);
6248 mark_reg_read(env, reg, reg->parent, REG_LIVE_READ64);
6249 } else {
6250 mark_reg_read(env, reg, reg->parent, REG_LIVE_READ32);
6251 }
6252 }
6253}
6254
6255static int check_kfunc_call(struct bpf_verifier_env *env, struct bpf_insn *insn)
6256{
6257 const struct btf_type *t, *func, *func_proto, *ptr_type;
6258 struct bpf_reg_state *regs = cur_regs(env);
6259 const char *func_name, *ptr_type_name;
6260 u32 i, nargs, func_id, ptr_type_id;
6261 const struct btf_param *args;
6262 int err;
6263
6264 func_id = insn->imm;
6265 func = btf_type_by_id(btf_vmlinux, func_id);
6266 func_name = btf_name_by_offset(btf_vmlinux, func->name_off);
6267 func_proto = btf_type_by_id(btf_vmlinux, func->type);
6268
6269 if (!env->ops->check_kfunc_call ||
6270 !env->ops->check_kfunc_call(func_id)) {
6271 verbose(env, "calling kernel function %s is not allowed\n",
6272 func_name);
6273 return -EACCES;
6274 }
6275
6276
6277 err = btf_check_kfunc_arg_match(env, btf_vmlinux, func_id, regs);
6278 if (err)
6279 return err;
6280
6281 for (i = 0; i < CALLER_SAVED_REGS; i++)
6282 mark_reg_not_init(env, regs, caller_saved[i]);
6283
6284
6285 t = btf_type_skip_modifiers(btf_vmlinux, func_proto->type, NULL);
6286 if (btf_type_is_scalar(t)) {
6287 mark_reg_unknown(env, regs, BPF_REG_0);
6288 mark_btf_func_reg_size(env, BPF_REG_0, t->size);
6289 } else if (btf_type_is_ptr(t)) {
6290 ptr_type = btf_type_skip_modifiers(btf_vmlinux, t->type,
6291 &ptr_type_id);
6292 if (!btf_type_is_struct(ptr_type)) {
6293 ptr_type_name = btf_name_by_offset(btf_vmlinux,
6294 ptr_type->name_off);
6295 verbose(env, "kernel function %s returns pointer type %s %s is not supported\n",
6296 func_name, btf_type_str(ptr_type),
6297 ptr_type_name);
6298 return -EINVAL;
6299 }
6300 mark_reg_known_zero(env, regs, BPF_REG_0);
6301 regs[BPF_REG_0].btf = btf_vmlinux;
6302 regs[BPF_REG_0].type = PTR_TO_BTF_ID;
6303 regs[BPF_REG_0].btf_id = ptr_type_id;
6304 mark_btf_func_reg_size(env, BPF_REG_0, sizeof(void *));
6305 }
6306
6307 nargs = btf_type_vlen(func_proto);
6308 args = (const struct btf_param *)(func_proto + 1);
6309 for (i = 0; i < nargs; i++) {
6310 u32 regno = i + 1;
6311
6312 t = btf_type_skip_modifiers(btf_vmlinux, args[i].type, NULL);
6313 if (btf_type_is_ptr(t))
6314 mark_btf_func_reg_size(env, regno, sizeof(void *));
6315 else
6316
6317 mark_btf_func_reg_size(env, regno, t->size);
6318 }
6319
6320 return 0;
6321}
6322
6323static bool signed_add_overflows(s64 a, s64 b)
6324{
6325
6326 s64 res = (s64)((u64)a + (u64)b);
6327
6328 if (b < 0)
6329 return res > a;
6330 return res < a;
6331}
6332
6333static bool signed_add32_overflows(s32 a, s32 b)
6334{
6335
6336 s32 res = (s32)((u32)a + (u32)b);
6337
6338 if (b < 0)
6339 return res > a;
6340 return res < a;
6341}
6342
6343static bool signed_sub_overflows(s64 a, s64 b)
6344{
6345
6346 s64 res = (s64)((u64)a - (u64)b);
6347
6348 if (b < 0)
6349 return res < a;
6350 return res > a;
6351}
6352
6353static bool signed_sub32_overflows(s32 a, s32 b)
6354{
6355
6356 s32 res = (s32)((u32)a - (u32)b);
6357
6358 if (b < 0)
6359 return res < a;
6360 return res > a;
6361}
6362
6363static bool check_reg_sane_offset(struct bpf_verifier_env *env,
6364 const struct bpf_reg_state *reg,
6365 enum bpf_reg_type type)
6366{
6367 bool known = tnum_is_const(reg->var_off);
6368 s64 val = reg->var_off.value;
6369 s64 smin = reg->smin_value;
6370
6371 if (known && (val >= BPF_MAX_VAR_OFF || val <= -BPF_MAX_VAR_OFF)) {
6372 verbose(env, "math between %s pointer and %lld is not allowed\n",
6373 reg_type_str[type], val);
6374 return false;
6375 }
6376
6377 if (reg->off >= BPF_MAX_VAR_OFF || reg->off <= -BPF_MAX_VAR_OFF) {
6378 verbose(env, "%s pointer offset %d is not allowed\n",
6379 reg_type_str[type], reg->off);
6380 return false;
6381 }
6382
6383 if (smin == S64_MIN) {
6384 verbose(env, "math between %s pointer and register with unbounded min value is not allowed\n",
6385 reg_type_str[type]);
6386 return false;
6387 }
6388
6389 if (smin >= BPF_MAX_VAR_OFF || smin <= -BPF_MAX_VAR_OFF) {
6390 verbose(env, "value %lld makes %s pointer be out of bounds\n",
6391 smin, reg_type_str[type]);
6392 return false;
6393 }
6394
6395 return true;
6396}
6397
6398static struct bpf_insn_aux_data *cur_aux(struct bpf_verifier_env *env)
6399{
6400 return &env->insn_aux_data[env->insn_idx];
6401}
6402
6403enum {
6404 REASON_BOUNDS = -1,
6405 REASON_TYPE = -2,
6406 REASON_PATHS = -3,
6407 REASON_LIMIT = -4,
6408 REASON_STACK = -5,
6409};
6410
6411static int retrieve_ptr_limit(const struct bpf_reg_state *ptr_reg,
6412 u32 *alu_limit, bool mask_to_left)
6413{
6414 u32 max = 0, ptr_limit = 0;
6415
6416 switch (ptr_reg->type) {
6417 case PTR_TO_STACK:
6418
6419
6420
6421
6422
6423 max = MAX_BPF_STACK + mask_to_left;
6424 ptr_limit = -(ptr_reg->var_off.value + ptr_reg->off);
6425 break;
6426 case PTR_TO_MAP_VALUE:
6427 max = ptr_reg->map_ptr->value_size;
6428 ptr_limit = (mask_to_left ?
6429 ptr_reg->smin_value :
6430 ptr_reg->umax_value) + ptr_reg->off;
6431 break;
6432 default:
6433 return REASON_TYPE;
6434 }
6435
6436 if (ptr_limit >= max)
6437 return REASON_LIMIT;
6438 *alu_limit = ptr_limit;
6439 return 0;
6440}
6441
6442static bool can_skip_alu_sanitation(const struct bpf_verifier_env *env,
6443 const struct bpf_insn *insn)
6444{
6445 return env->bypass_spec_v1 || BPF_SRC(insn->code) == BPF_K;
6446}
6447
6448static int update_alu_sanitation_state(struct bpf_insn_aux_data *aux,
6449 u32 alu_state, u32 alu_limit)
6450{
6451
6452
6453
6454 if (aux->alu_state &&
6455 (aux->alu_state != alu_state ||
6456 aux->alu_limit != alu_limit))
6457 return REASON_PATHS;
6458
6459
6460 aux->alu_state = alu_state;
6461 aux->alu_limit = alu_limit;
6462 return 0;
6463}
6464
6465static int sanitize_val_alu(struct bpf_verifier_env *env,
6466 struct bpf_insn *insn)
6467{
6468 struct bpf_insn_aux_data *aux = cur_aux(env);
6469
6470 if (can_skip_alu_sanitation(env, insn))
6471 return 0;
6472
6473 return update_alu_sanitation_state(aux, BPF_ALU_NON_POINTER, 0);
6474}
6475
6476static bool sanitize_needed(u8 opcode)
6477{
6478 return opcode == BPF_ADD || opcode == BPF_SUB;
6479}
6480
6481struct bpf_sanitize_info {
6482 struct bpf_insn_aux_data aux;
6483 bool mask_to_left;
6484};
6485
6486static struct bpf_verifier_state *
6487sanitize_speculative_path(struct bpf_verifier_env *env,
6488 const struct bpf_insn *insn,
6489 u32 next_idx, u32 curr_idx)
6490{
6491 struct bpf_verifier_state *branch;
6492 struct bpf_reg_state *regs;
6493
6494 branch = push_stack(env, next_idx, curr_idx, true);
6495 if (branch && insn) {
6496 regs = branch->frame[branch->curframe]->regs;
6497 if (BPF_SRC(insn->code) == BPF_K) {
6498 mark_reg_unknown(env, regs, insn->dst_reg);
6499 } else if (BPF_SRC(insn->code) == BPF_X) {
6500 mark_reg_unknown(env, regs, insn->dst_reg);
6501 mark_reg_unknown(env, regs, insn->src_reg);
6502 }
6503 }
6504 return branch;
6505}
6506
6507static int sanitize_ptr_alu(struct bpf_verifier_env *env,
6508 struct bpf_insn *insn,
6509 const struct bpf_reg_state *ptr_reg,
6510 const struct bpf_reg_state *off_reg,
6511 struct bpf_reg_state *dst_reg,
6512 struct bpf_sanitize_info *info,
6513 const bool commit_window)
6514{
6515 struct bpf_insn_aux_data *aux = commit_window ? cur_aux(env) : &info->aux;
6516 struct bpf_verifier_state *vstate = env->cur_state;
6517 bool off_is_imm = tnum_is_const(off_reg->var_off);
6518 bool off_is_neg = off_reg->smin_value < 0;
6519 bool ptr_is_dst_reg = ptr_reg == dst_reg;
6520 u8 opcode = BPF_OP(insn->code);
6521 u32 alu_state, alu_limit;
6522 struct bpf_reg_state tmp;
6523 bool ret;
6524 int err;
6525
6526 if (can_skip_alu_sanitation(env, insn))
6527 return 0;
6528
6529
6530
6531
6532
6533 if (vstate->speculative)
6534 goto do_sim;
6535
6536 if (!commit_window) {
6537 if (!tnum_is_const(off_reg->var_off) &&
6538 (off_reg->smin_value < 0) != (off_reg->smax_value < 0))
6539 return REASON_BOUNDS;
6540
6541 info->mask_to_left = (opcode == BPF_ADD && off_is_neg) ||
6542 (opcode == BPF_SUB && !off_is_neg);
6543 }
6544
6545 err = retrieve_ptr_limit(ptr_reg, &alu_limit, info->mask_to_left);
6546 if (err < 0)
6547 return err;
6548
6549 if (commit_window) {
6550
6551
6552
6553 alu_state = info->aux.alu_state;
6554 alu_limit = abs(info->aux.alu_limit - alu_limit);
6555 } else {
6556 alu_state = off_is_neg ? BPF_ALU_NEG_VALUE : 0;
6557 alu_state |= off_is_imm ? BPF_ALU_IMMEDIATE : 0;
6558 alu_state |= ptr_is_dst_reg ?
6559 BPF_ALU_SANITIZE_SRC : BPF_ALU_SANITIZE_DST;
6560 }
6561
6562 err = update_alu_sanitation_state(aux, alu_state, alu_limit);
6563 if (err < 0)
6564 return err;
6565do_sim:
6566
6567
6568
6569
6570
6571
6572
6573
6574 if (commit_window || off_is_imm)
6575 return 0;
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586 if (!ptr_is_dst_reg) {
6587 tmp = *dst_reg;
6588 *dst_reg = *ptr_reg;
6589 }
6590 ret = sanitize_speculative_path(env, NULL, env->insn_idx + 1,
6591 env->insn_idx);
6592 if (!ptr_is_dst_reg && ret)
6593 *dst_reg = tmp;
6594 return !ret ? REASON_STACK : 0;
6595}
6596
6597static void sanitize_mark_insn_seen(struct bpf_verifier_env *env)
6598{
6599 struct bpf_verifier_state *vstate = env->cur_state;
6600
6601
6602
6603
6604
6605
6606 if (!vstate->speculative)
6607 env->insn_aux_data[env->insn_idx].seen = env->pass_cnt;
6608}
6609
6610static int sanitize_err(struct bpf_verifier_env *env,
6611 const struct bpf_insn *insn, int reason,
6612 const struct bpf_reg_state *off_reg,
6613 const struct bpf_reg_state *dst_reg)
6614{
6615 static const char *err = "pointer arithmetic with it prohibited for !root";
6616 const char *op = BPF_OP(insn->code) == BPF_ADD ? "add" : "sub";
6617 u32 dst = insn->dst_reg, src = insn->src_reg;
6618
6619 switch (reason) {
6620 case REASON_BOUNDS:
6621 verbose(env, "R%d has unknown scalar with mixed signed bounds, %s\n",
6622 off_reg == dst_reg ? dst : src, err);
6623 break;
6624 case REASON_TYPE:
6625 verbose(env, "R%d has pointer with unsupported alu operation, %s\n",
6626 off_reg == dst_reg ? src : dst, err);
6627 break;
6628 case REASON_PATHS:
6629 verbose(env, "R%d tried to %s from different maps, paths or scalars, %s\n",
6630 dst, op, err);
6631 break;
6632 case REASON_LIMIT:
6633 verbose(env, "R%d tried to %s beyond pointer bounds, %s\n",
6634 dst, op, err);
6635 break;
6636 case REASON_STACK:
6637 verbose(env, "R%d could not be pushed for speculative verification, %s\n",
6638 dst, err);
6639 break;
6640 default:
6641 verbose(env, "verifier internal error: unknown reason (%d)\n",
6642 reason);
6643 break;
6644 }
6645
6646 return -EACCES;
6647}
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659static int check_stack_access_for_ptr_arithmetic(
6660 struct bpf_verifier_env *env,
6661 int regno,
6662 const struct bpf_reg_state *reg,
6663 int off)
6664{
6665 if (!tnum_is_const(reg->var_off)) {
6666 char tn_buf[48];
6667
6668 tnum_strn(tn_buf, sizeof(tn_buf), reg->var_off);
6669 verbose(env, "R%d variable stack access prohibited for !root, var_off=%s off=%d\n",
6670 regno, tn_buf, off);
6671 return -EACCES;
6672 }
6673
6674 if (off >= 0 || off < -MAX_BPF_STACK) {
6675 verbose(env, "R%d stack pointer arithmetic goes out of range, "
6676 "prohibited for !root; off=%d\n", regno, off);
6677 return -EACCES;
6678 }
6679
6680 return 0;
6681}
6682
6683static int sanitize_check_bounds(struct bpf_verifier_env *env,
6684 const struct bpf_insn *insn,
6685 const struct bpf_reg_state *dst_reg)
6686{
6687 u32 dst = insn->dst_reg;
6688
6689
6690
6691
6692 if (env->bypass_spec_v1)
6693 return 0;
6694
6695 switch (dst_reg->type) {
6696 case PTR_TO_STACK:
6697 if (check_stack_access_for_ptr_arithmetic(env, dst, dst_reg,
6698 dst_reg->off + dst_reg->var_off.value))
6699 return -EACCES;
6700 break;
6701 case PTR_TO_MAP_VALUE:
6702 if (check_map_access(env, dst, dst_reg->off, 1, false)) {
6703 verbose(env, "R%d pointer arithmetic of map value goes out of range, "
6704 "prohibited for !root\n", dst);
6705 return -EACCES;
6706 }
6707 break;
6708 default:
6709 break;
6710 }
6711
6712 return 0;
6713}
6714
6715
6716
6717
6718
6719
6720static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
6721 struct bpf_insn *insn,
6722 const struct bpf_reg_state *ptr_reg,
6723 const struct bpf_reg_state *off_reg)
6724{
6725 struct bpf_verifier_state *vstate = env->cur_state;
6726 struct bpf_func_state *state = vstate->frame[vstate->curframe];
6727 struct bpf_reg_state *regs = state->regs, *dst_reg;
6728 bool known = tnum_is_const(off_reg->var_off);
6729 s64 smin_val = off_reg->smin_value, smax_val = off_reg->smax_value,
6730 smin_ptr = ptr_reg->smin_value, smax_ptr = ptr_reg->smax_value;
6731 u64 umin_val = off_reg->umin_value, umax_val = off_reg->umax_value,
6732 umin_ptr = ptr_reg->umin_value, umax_ptr = ptr_reg->umax_value;
6733 struct bpf_sanitize_info info = {};
6734 u8 opcode = BPF_OP(insn->code);
6735 u32 dst = insn->dst_reg;
6736 int ret;
6737
6738 dst_reg = ®s[dst];
6739
6740 if ((known && (smin_val != smax_val || umin_val != umax_val)) ||
6741 smin_val > smax_val || umin_val > umax_val) {
6742
6743
6744
6745 __mark_reg_unknown(env, dst_reg);
6746 return 0;
6747 }
6748
6749 if (BPF_CLASS(insn->code) != BPF_ALU64) {
6750
6751 if (opcode == BPF_SUB && env->allow_ptr_leaks) {
6752 __mark_reg_unknown(env, dst_reg);
6753 return 0;
6754 }
6755
6756 verbose(env,
6757 "R%d 32-bit pointer arithmetic prohibited\n",
6758 dst);
6759 return -EACCES;
6760 }
6761
6762 switch (ptr_reg->type) {
6763 case PTR_TO_MAP_VALUE_OR_NULL:
6764 verbose(env, "R%d pointer arithmetic on %s prohibited, null-check it first\n",
6765 dst, reg_type_str[ptr_reg->type]);
6766 return -EACCES;
6767 case CONST_PTR_TO_MAP:
6768
6769 if (known && smin_val == 0 && opcode == BPF_ADD)
6770 break;
6771 fallthrough;
6772 case PTR_TO_PACKET_END:
6773 case PTR_TO_SOCKET:
6774 case PTR_TO_SOCKET_OR_NULL:
6775 case PTR_TO_SOCK_COMMON:
6776 case PTR_TO_SOCK_COMMON_OR_NULL:
6777 case PTR_TO_TCP_SOCK:
6778 case PTR_TO_TCP_SOCK_OR_NULL:
6779 case PTR_TO_XDP_SOCK:
6780 verbose(env, "R%d pointer arithmetic on %s prohibited\n",
6781 dst, reg_type_str[ptr_reg->type]);
6782 return -EACCES;
6783 default:
6784 break;
6785 }
6786
6787
6788
6789
6790 dst_reg->type = ptr_reg->type;
6791 dst_reg->id = ptr_reg->id;
6792
6793 if (!check_reg_sane_offset(env, off_reg, ptr_reg->type) ||
6794 !check_reg_sane_offset(env, ptr_reg, ptr_reg->type))
6795 return -EINVAL;
6796
6797
6798 __mark_reg32_unbounded(dst_reg);
6799
6800 if (sanitize_needed(opcode)) {
6801 ret = sanitize_ptr_alu(env, insn, ptr_reg, off_reg, dst_reg,
6802 &info, false);
6803 if (ret < 0)
6804 return sanitize_err(env, insn, ret, off_reg, dst_reg);
6805 }
6806
6807 switch (opcode) {
6808 case BPF_ADD:
6809
6810
6811
6812 if (known && (ptr_reg->off + smin_val ==
6813 (s64)(s32)(ptr_reg->off + smin_val))) {
6814
6815 dst_reg->smin_value = smin_ptr;
6816 dst_reg->smax_value = smax_ptr;
6817 dst_reg->umin_value = umin_ptr;
6818 dst_reg->umax_value = umax_ptr;
6819 dst_reg->var_off = ptr_reg->var_off;
6820 dst_reg->off = ptr_reg->off + smin_val;
6821 dst_reg->raw = ptr_reg->raw;
6822 break;
6823 }
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833 if (signed_add_overflows(smin_ptr, smin_val) ||
6834 signed_add_overflows(smax_ptr, smax_val)) {
6835 dst_reg->smin_value = S64_MIN;
6836 dst_reg->smax_value = S64_MAX;
6837 } else {
6838 dst_reg->smin_value = smin_ptr + smin_val;
6839 dst_reg->smax_value = smax_ptr + smax_val;
6840 }
6841 if (umin_ptr + umin_val < umin_ptr ||
6842 umax_ptr + umax_val < umax_ptr) {
6843 dst_reg->umin_value = 0;
6844 dst_reg->umax_value = U64_MAX;
6845 } else {
6846 dst_reg->umin_value = umin_ptr + umin_val;
6847 dst_reg->umax_value = umax_ptr + umax_val;
6848 }
6849 dst_reg->var_off = tnum_add(ptr_reg->var_off, off_reg->var_off);
6850 dst_reg->off = ptr_reg->off;
6851 dst_reg->raw = ptr_reg->raw;
6852 if (reg_is_pkt_pointer(ptr_reg)) {
6853 dst_reg->id = ++env->id_gen;
6854
6855 memset(&dst_reg->raw, 0, sizeof(dst_reg->raw));
6856 }
6857 break;
6858 case BPF_SUB:
6859 if (dst_reg == off_reg) {
6860
6861 verbose(env, "R%d tried to subtract pointer from scalar\n",
6862 dst);
6863 return -EACCES;
6864 }
6865
6866
6867
6868
6869 if (ptr_reg->type == PTR_TO_STACK) {
6870 verbose(env, "R%d subtraction from stack pointer prohibited\n",
6871 dst);
6872 return -EACCES;
6873 }
6874 if (known && (ptr_reg->off - smin_val ==
6875 (s64)(s32)(ptr_reg->off - smin_val))) {
6876
6877 dst_reg->smin_value = smin_ptr;
6878 dst_reg->smax_value = smax_ptr;
6879 dst_reg->umin_value = umin_ptr;
6880 dst_reg->umax_value = umax_ptr;
6881 dst_reg->var_off = ptr_reg->var_off;
6882 dst_reg->id = ptr_reg->id;
6883 dst_reg->off = ptr_reg->off - smin_val;
6884 dst_reg->raw = ptr_reg->raw;
6885 break;
6886 }
6887
6888
6889
6890 if (signed_sub_overflows(smin_ptr, smax_val) ||
6891 signed_sub_overflows(smax_ptr, smin_val)) {
6892
6893 dst_reg->smin_value = S64_MIN;
6894 dst_reg->smax_value = S64_MAX;
6895 } else {
6896 dst_reg->smin_value = smin_ptr - smax_val;
6897 dst_reg->smax_value = smax_ptr - smin_val;
6898 }
6899 if (umin_ptr < umax_val) {
6900
6901 dst_reg->umin_value = 0;
6902 dst_reg->umax_value = U64_MAX;
6903 } else {
6904
6905 dst_reg->umin_value = umin_ptr - umax_val;
6906 dst_reg->umax_value = umax_ptr - umin_val;
6907 }
6908 dst_reg->var_off = tnum_sub(ptr_reg->var_off, off_reg->var_off);
6909 dst_reg->off = ptr_reg->off;
6910 dst_reg->raw = ptr_reg->raw;
6911 if (reg_is_pkt_pointer(ptr_reg)) {
6912 dst_reg->id = ++env->id_gen;
6913
6914 if (smin_val < 0)
6915 memset(&dst_reg->raw, 0, sizeof(dst_reg->raw));
6916 }
6917 break;
6918 case BPF_AND:
6919 case BPF_OR:
6920 case BPF_XOR:
6921
6922 verbose(env, "R%d bitwise operator %s on pointer prohibited\n",
6923 dst, bpf_alu_string[opcode >> 4]);
6924 return -EACCES;
6925 default:
6926
6927 verbose(env, "R%d pointer arithmetic with %s operator prohibited\n",
6928 dst, bpf_alu_string[opcode >> 4]);
6929 return -EACCES;
6930 }
6931
6932 if (!check_reg_sane_offset(env, dst_reg, ptr_reg->type))
6933 return -EINVAL;
6934
6935 __update_reg_bounds(dst_reg);
6936 __reg_deduce_bounds(dst_reg);
6937 __reg_bound_offset(dst_reg);
6938
6939 if (sanitize_check_bounds(env, insn, dst_reg) < 0)
6940 return -EACCES;
6941 if (sanitize_needed(opcode)) {
6942 ret = sanitize_ptr_alu(env, insn, dst_reg, off_reg, dst_reg,
6943 &info, true);
6944 if (ret < 0)
6945 return sanitize_err(env, insn, ret, off_reg, dst_reg);
6946 }
6947
6948 return 0;
6949}
6950
6951static void scalar32_min_max_add(struct bpf_reg_state *dst_reg,
6952 struct bpf_reg_state *src_reg)
6953{
6954 s32 smin_val = src_reg->s32_min_value;
6955 s32 smax_val = src_reg->s32_max_value;
6956 u32 umin_val = src_reg->u32_min_value;
6957 u32 umax_val = src_reg->u32_max_value;
6958
6959 if (signed_add32_overflows(dst_reg->s32_min_value, smin_val) ||
6960 signed_add32_overflows(dst_reg->s32_max_value, smax_val)) {
6961 dst_reg->s32_min_value = S32_MIN;
6962 dst_reg->s32_max_value = S32_MAX;
6963 } else {
6964 dst_reg->s32_min_value += smin_val;
6965 dst_reg->s32_max_value += smax_val;
6966 }
6967 if (dst_reg->u32_min_value + umin_val < umin_val ||
6968 dst_reg->u32_max_value + umax_val < umax_val) {
6969 dst_reg->u32_min_value = 0;
6970 dst_reg->u32_max_value = U32_MAX;
6971 } else {
6972 dst_reg->u32_min_value += umin_val;
6973 dst_reg->u32_max_value += umax_val;
6974 }
6975}
6976
6977static void scalar_min_max_add(struct bpf_reg_state *dst_reg,
6978 struct bpf_reg_state *src_reg)
6979{
6980 s64 smin_val = src_reg->smin_value;
6981 s64 smax_val = src_reg->smax_value;
6982 u64 umin_val = src_reg->umin_value;
6983 u64 umax_val = src_reg->umax_value;
6984
6985 if (signed_add_overflows(dst_reg->smin_value, smin_val) ||
6986 signed_add_overflows(dst_reg->smax_value, smax_val)) {
6987 dst_reg->smin_value = S64_MIN;
6988 dst_reg->smax_value = S64_MAX;
6989 } else {
6990 dst_reg->smin_value += smin_val;
6991 dst_reg->smax_value += smax_val;
6992 }
6993 if (dst_reg->umin_value + umin_val < umin_val ||
6994 dst_reg->umax_value + umax_val < umax_val) {
6995 dst_reg->umin_value = 0;
6996 dst_reg->umax_value = U64_MAX;
6997 } else {
6998 dst_reg->umin_value += umin_val;
6999 dst_reg->umax_value += umax_val;
7000 }
7001}
7002
7003static void scalar32_min_max_sub(struct bpf_reg_state *dst_reg,
7004 struct bpf_reg_state *src_reg)
7005{
7006 s32 smin_val = src_reg->s32_min_value;
7007 s32 smax_val = src_reg->s32_max_value;
7008 u32 umin_val = src_reg->u32_min_value;
7009 u32 umax_val = src_reg->u32_max_value;
7010
7011 if (signed_sub32_overflows(dst_reg->s32_min_value, smax_val) ||
7012 signed_sub32_overflows(dst_reg->s32_max_value, smin_val)) {
7013
7014 dst_reg->s32_min_value = S32_MIN;
7015 dst_reg->s32_max_value = S32_MAX;
7016 } else {
7017 dst_reg->s32_min_value -= smax_val;
7018 dst_reg->s32_max_value -= smin_val;
7019 }
7020 if (dst_reg->u32_min_value < umax_val) {
7021
7022 dst_reg->u32_min_value = 0;
7023 dst_reg->u32_max_value = U32_MAX;
7024 } else {
7025
7026 dst_reg->u32_min_value -= umax_val;
7027 dst_reg->u32_max_value -= umin_val;
7028 }
7029}
7030
7031static void scalar_min_max_sub(struct bpf_reg_state *dst_reg,
7032 struct bpf_reg_state *src_reg)
7033{
7034 s64 smin_val = src_reg->smin_value;
7035 s64 smax_val = src_reg->smax_value;
7036 u64 umin_val = src_reg->umin_value;
7037 u64 umax_val = src_reg->umax_value;
7038
7039 if (signed_sub_overflows(dst_reg->smin_value, smax_val) ||
7040 signed_sub_overflows(dst_reg->smax_value, smin_val)) {
7041
7042 dst_reg->smin_value = S64_MIN;
7043 dst_reg->smax_value = S64_MAX;
7044 } else {
7045 dst_reg->smin_value -= smax_val;
7046 dst_reg->smax_value -= smin_val;
7047 }
7048 if (dst_reg->umin_value < umax_val) {
7049
7050 dst_reg->umin_value = 0;
7051 dst_reg->umax_value = U64_MAX;
7052 } else {
7053
7054 dst_reg->umin_value -= umax_val;
7055 dst_reg->umax_value -= umin_val;
7056 }
7057}
7058
7059static void scalar32_min_max_mul(struct bpf_reg_state *dst_reg,
7060 struct bpf_reg_state *src_reg)
7061{
7062 s32 smin_val = src_reg->s32_min_value;
7063 u32 umin_val = src_reg->u32_min_value;
7064 u32 umax_val = src_reg->u32_max_value;
7065
7066 if (smin_val < 0 || dst_reg->s32_min_value < 0) {
7067
7068 __mark_reg32_unbounded(dst_reg);
7069 return;
7070 }
7071
7072
7073
7074 if (umax_val > U16_MAX || dst_reg->u32_max_value > U16_MAX) {
7075
7076 __mark_reg32_unbounded(dst_reg);
7077 return;
7078 }
7079 dst_reg->u32_min_value *= umin_val;
7080 dst_reg->u32_max_value *= umax_val;
7081 if (dst_reg->u32_max_value > S32_MAX) {
7082
7083 dst_reg->s32_min_value = S32_MIN;
7084 dst_reg->s32_max_value = S32_MAX;
7085 } else {
7086 dst_reg->s32_min_value = dst_reg->u32_min_value;
7087 dst_reg->s32_max_value = dst_reg->u32_max_value;
7088 }
7089}
7090
7091static void scalar_min_max_mul(struct bpf_reg_state *dst_reg,
7092 struct bpf_reg_state *src_reg)
7093{
7094 s64 smin_val = src_reg->smin_value;
7095 u64 umin_val = src_reg->umin_value;
7096 u64 umax_val = src_reg->umax_value;
7097
7098 if (smin_val < 0 || dst_reg->smin_value < 0) {
7099
7100 __mark_reg64_unbounded(dst_reg);
7101 return;
7102 }
7103
7104
7105
7106 if (umax_val > U32_MAX || dst_reg->umax_value > U32_MAX) {
7107
7108 __mark_reg64_unbounded(dst_reg);
7109 return;
7110 }
7111 dst_reg->umin_value *= umin_val;
7112 dst_reg->umax_value *= umax_val;
7113 if (dst_reg->umax_value > S64_MAX) {
7114
7115 dst_reg->smin_value = S64_MIN;
7116 dst_reg->smax_value = S64_MAX;
7117 } else {
7118 dst_reg->smin_value = dst_reg->umin_value;
7119 dst_reg->smax_value = dst_reg->umax_value;
7120 }
7121}
7122
7123static void scalar32_min_max_and(struct bpf_reg_state *dst_reg,
7124 struct bpf_reg_state *src_reg)
7125{
7126 bool src_known = tnum_subreg_is_const(src_reg->var_off);
7127 bool dst_known = tnum_subreg_is_const(dst_reg->var_off);
7128 struct tnum var32_off = tnum_subreg(dst_reg->var_off);
7129 s32 smin_val = src_reg->s32_min_value;
7130 u32 umax_val = src_reg->u32_max_value;
7131
7132 if (src_known && dst_known) {
7133 __mark_reg32_known(dst_reg, var32_off.value);
7134 return;
7135 }
7136
7137
7138
7139
7140 dst_reg->u32_min_value = var32_off.value;
7141 dst_reg->u32_max_value = min(dst_reg->u32_max_value, umax_val);
7142 if (dst_reg->s32_min_value < 0 || smin_val < 0) {
7143
7144
7145
7146 dst_reg->s32_min_value = S32_MIN;
7147 dst_reg->s32_max_value = S32_MAX;
7148 } else {
7149
7150
7151
7152 dst_reg->s32_min_value = dst_reg->u32_min_value;
7153 dst_reg->s32_max_value = dst_reg->u32_max_value;
7154 }
7155}
7156
7157static void scalar_min_max_and(struct bpf_reg_state *dst_reg,
7158 struct bpf_reg_state *src_reg)
7159{
7160 bool src_known = tnum_is_const(src_reg->var_off);
7161 bool dst_known = tnum_is_const(dst_reg->var_off);
7162 s64 smin_val = src_reg->smin_value;
7163 u64 umax_val = src_reg->umax_value;
7164
7165 if (src_known && dst_known) {
7166 __mark_reg_known(dst_reg, dst_reg->var_off.value);
7167 return;
7168 }
7169
7170
7171
7172
7173 dst_reg->umin_value = dst_reg->var_off.value;
7174 dst_reg->umax_value = min(dst_reg->umax_value, umax_val);
7175 if (dst_reg->smin_value < 0 || smin_val < 0) {
7176
7177
7178
7179 dst_reg->smin_value = S64_MIN;
7180 dst_reg->smax_value = S64_MAX;
7181 } else {
7182
7183
7184
7185 dst_reg->smin_value = dst_reg->umin_value;
7186 dst_reg->smax_value = dst_reg->umax_value;
7187 }
7188
7189 __update_reg_bounds(dst_reg);
7190}
7191
7192static void scalar32_min_max_or(struct bpf_reg_state *dst_reg,
7193 struct bpf_reg_state *src_reg)
7194{
7195 bool src_known = tnum_subreg_is_const(src_reg->var_off);
7196 bool dst_known = tnum_subreg_is_const(dst_reg->var_off);
7197 struct tnum var32_off = tnum_subreg(dst_reg->var_off);
7198 s32 smin_val = src_reg->s32_min_value;
7199 u32 umin_val = src_reg->u32_min_value;
7200
7201 if (src_known && dst_known) {
7202 __mark_reg32_known(dst_reg, var32_off.value);
7203 return;
7204 }
7205
7206
7207
7208
7209 dst_reg->u32_min_value = max(dst_reg->u32_min_value, umin_val);
7210 dst_reg->u32_max_value = var32_off.value | var32_off.mask;
7211 if (dst_reg->s32_min_value < 0 || smin_val < 0) {
7212
7213
7214
7215 dst_reg->s32_min_value = S32_MIN;
7216 dst_reg->s32_max_value = S32_MAX;
7217 } else {
7218
7219
7220
7221 dst_reg->s32_min_value = dst_reg->u32_min_value;
7222 dst_reg->s32_max_value = dst_reg->u32_max_value;
7223 }
7224}
7225
7226static void scalar_min_max_or(struct bpf_reg_state *dst_reg,
7227 struct bpf_reg_state *src_reg)
7228{
7229 bool src_known = tnum_is_const(src_reg->var_off);
7230 bool dst_known = tnum_is_const(dst_reg->var_off);
7231 s64 smin_val = src_reg->smin_value;
7232 u64 umin_val = src_reg->umin_value;
7233
7234 if (src_known && dst_known) {
7235 __mark_reg_known(dst_reg, dst_reg->var_off.value);
7236 return;
7237 }
7238
7239
7240
7241
7242 dst_reg->umin_value = max(dst_reg->umin_value, umin_val);
7243 dst_reg->umax_value = dst_reg->var_off.value | dst_reg->var_off.mask;
7244 if (dst_reg->smin_value < 0 || smin_val < 0) {
7245
7246
7247
7248 dst_reg->smin_value = S64_MIN;
7249 dst_reg->smax_value = S64_MAX;
7250 } else {
7251
7252
7253
7254 dst_reg->smin_value = dst_reg->umin_value;
7255 dst_reg->smax_value = dst_reg->umax_value;
7256 }
7257
7258 __update_reg_bounds(dst_reg);
7259}
7260
7261static void scalar32_min_max_xor(struct bpf_reg_state *dst_reg,
7262 struct bpf_reg_state *src_reg)
7263{
7264 bool src_known = tnum_subreg_is_const(src_reg->var_off);
7265 bool dst_known = tnum_subreg_is_const(dst_reg->var_off);
7266 struct tnum var32_off = tnum_subreg(dst_reg->var_off);
7267 s32 smin_val = src_reg->s32_min_value;
7268
7269 if (src_known && dst_known) {
7270 __mark_reg32_known(dst_reg, var32_off.value);
7271 return;
7272 }
7273
7274
7275 dst_reg->u32_min_value = var32_off.value;
7276 dst_reg->u32_max_value = var32_off.value | var32_off.mask;
7277
7278 if (dst_reg->s32_min_value >= 0 && smin_val >= 0) {
7279
7280
7281
7282 dst_reg->s32_min_value = dst_reg->u32_min_value;
7283 dst_reg->s32_max_value = dst_reg->u32_max_value;
7284 } else {
7285 dst_reg->s32_min_value = S32_MIN;
7286 dst_reg->s32_max_value = S32_MAX;
7287 }
7288}
7289
7290static void scalar_min_max_xor(struct bpf_reg_state *dst_reg,
7291 struct bpf_reg_state *src_reg)
7292{
7293 bool src_known = tnum_is_const(src_reg->var_off);
7294 bool dst_known = tnum_is_const(dst_reg->var_off);
7295 s64 smin_val = src_reg->smin_value;
7296
7297 if (src_known && dst_known) {
7298
7299 __mark_reg_known(dst_reg, dst_reg->var_off.value);
7300 return;
7301 }
7302
7303
7304 dst_reg->umin_value = dst_reg->var_off.value;
7305 dst_reg->umax_value = dst_reg->var_off.value | dst_reg->var_off.mask;
7306
7307 if (dst_reg->smin_value >= 0 && smin_val >= 0) {
7308
7309
7310
7311 dst_reg->smin_value = dst_reg->umin_value;
7312 dst_reg->smax_value = dst_reg->umax_value;
7313 } else {
7314 dst_reg->smin_value = S64_MIN;
7315 dst_reg->smax_value = S64_MAX;
7316 }
7317
7318 __update_reg_bounds(dst_reg);
7319}
7320
7321static void __scalar32_min_max_lsh(struct bpf_reg_state *dst_reg,
7322 u64 umin_val, u64 umax_val)
7323{
7324
7325
7326
7327 dst_reg->s32_min_value = S32_MIN;
7328 dst_reg->s32_max_value = S32_MAX;
7329
7330 if (umax_val > 31 || dst_reg->u32_max_value > 1ULL << (31 - umax_val)) {
7331 dst_reg->u32_min_value = 0;
7332 dst_reg->u32_max_value = U32_MAX;
7333 } else {
7334 dst_reg->u32_min_value <<= umin_val;
7335 dst_reg->u32_max_value <<= umax_val;
7336 }
7337}
7338
7339static void scalar32_min_max_lsh(struct bpf_reg_state *dst_reg,
7340 struct bpf_reg_state *src_reg)
7341{
7342 u32 umax_val = src_reg->u32_max_value;
7343 u32 umin_val = src_reg->u32_min_value;
7344
7345 struct tnum subreg = tnum_subreg(dst_reg->var_off);
7346
7347 __scalar32_min_max_lsh(dst_reg, umin_val, umax_val);
7348 dst_reg->var_off = tnum_subreg(tnum_lshift(subreg, umin_val));
7349
7350
7351
7352
7353 __mark_reg64_unbounded(dst_reg);
7354 __update_reg32_bounds(dst_reg);
7355}
7356
7357static void __scalar64_min_max_lsh(struct bpf_reg_state *dst_reg,
7358 u64 umin_val, u64 umax_val)
7359{
7360
7361
7362
7363
7364
7365
7366
7367 if (umin_val == 32 && umax_val == 32 && dst_reg->s32_max_value >= 0)
7368 dst_reg->smax_value = (s64)dst_reg->s32_max_value << 32;
7369 else
7370 dst_reg->smax_value = S64_MAX;
7371
7372 if (umin_val == 32 && umax_val == 32 && dst_reg->s32_min_value >= 0)
7373 dst_reg->smin_value = (s64)dst_reg->s32_min_value << 32;
7374 else
7375 dst_reg->smin_value = S64_MIN;
7376
7377
7378 if (dst_reg->umax_value > 1ULL << (63 - umax_val)) {
7379 dst_reg->umin_value = 0;
7380 dst_reg->umax_value = U64_MAX;
7381 } else {
7382 dst_reg->umin_value <<= umin_val;
7383 dst_reg->umax_value <<= umax_val;
7384 }
7385}
7386
7387static void scalar_min_max_lsh(struct bpf_reg_state *dst_reg,
7388 struct bpf_reg_state *src_reg)
7389{
7390 u64 umax_val = src_reg->umax_value;
7391 u64 umin_val = src_reg->umin_value;
7392
7393
7394 __scalar64_min_max_lsh(dst_reg, umin_val, umax_val);
7395 __scalar32_min_max_lsh(dst_reg, umin_val, umax_val);
7396
7397 dst_reg->var_off = tnum_lshift(dst_reg->var_off, umin_val);
7398
7399 __update_reg_bounds(dst_reg);
7400}
7401
7402static void scalar32_min_max_rsh(struct bpf_reg_state *dst_reg,
7403 struct bpf_reg_state *src_reg)
7404{
7405 struct tnum subreg = tnum_subreg(dst_reg->var_off);
7406 u32 umax_val = src_reg->u32_max_value;
7407 u32 umin_val = src_reg->u32_min_value;
7408
7409
7410
7411
7412
7413
7414
7415
7416
7417
7418
7419
7420
7421
7422
7423 dst_reg->s32_min_value = S32_MIN;
7424 dst_reg->s32_max_value = S32_MAX;
7425
7426 dst_reg->var_off = tnum_rshift(subreg, umin_val);
7427 dst_reg->u32_min_value >>= umax_val;
7428 dst_reg->u32_max_value >>= umin_val;
7429
7430 __mark_reg64_unbounded(dst_reg);
7431 __update_reg32_bounds(dst_reg);
7432}
7433
7434static void scalar_min_max_rsh(struct bpf_reg_state *dst_reg,
7435 struct bpf_reg_state *src_reg)
7436{
7437 u64 umax_val = src_reg->umax_value;
7438 u64 umin_val = src_reg->umin_value;
7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454 dst_reg->smin_value = S64_MIN;
7455 dst_reg->smax_value = S64_MAX;
7456 dst_reg->var_off = tnum_rshift(dst_reg->var_off, umin_val);
7457 dst_reg->umin_value >>= umax_val;
7458 dst_reg->umax_value >>= umin_val;
7459
7460
7461
7462
7463
7464 __mark_reg32_unbounded(dst_reg);
7465 __update_reg_bounds(dst_reg);
7466}
7467
7468static void scalar32_min_max_arsh(struct bpf_reg_state *dst_reg,
7469 struct bpf_reg_state *src_reg)
7470{
7471 u64 umin_val = src_reg->u32_min_value;
7472
7473
7474
7475
7476 dst_reg->s32_min_value = (u32)(((s32)dst_reg->s32_min_value) >> umin_val);
7477 dst_reg->s32_max_value = (u32)(((s32)dst_reg->s32_max_value) >> umin_val);
7478
7479 dst_reg->var_off = tnum_arshift(tnum_subreg(dst_reg->var_off), umin_val, 32);
7480
7481
7482
7483
7484 dst_reg->u32_min_value = 0;
7485 dst_reg->u32_max_value = U32_MAX;
7486
7487 __mark_reg64_unbounded(dst_reg);
7488 __update_reg32_bounds(dst_reg);
7489}
7490
7491static void scalar_min_max_arsh(struct bpf_reg_state *dst_reg,
7492 struct bpf_reg_state *src_reg)
7493{
7494 u64 umin_val = src_reg->umin_value;
7495
7496
7497
7498
7499 dst_reg->smin_value >>= umin_val;
7500 dst_reg->smax_value >>= umin_val;
7501
7502 dst_reg->var_off = tnum_arshift(dst_reg->var_off, umin_val, 64);
7503
7504
7505
7506
7507 dst_reg->umin_value = 0;
7508 dst_reg->umax_value = U64_MAX;
7509
7510
7511
7512
7513
7514 __mark_reg32_unbounded(dst_reg);
7515 __update_reg_bounds(dst_reg);
7516}
7517
7518
7519
7520
7521
7522static int adjust_scalar_min_max_vals(struct bpf_verifier_env *env,
7523 struct bpf_insn *insn,
7524 struct bpf_reg_state *dst_reg,
7525 struct bpf_reg_state src_reg)
7526{
7527 struct bpf_reg_state *regs = cur_regs(env);
7528 u8 opcode = BPF_OP(insn->code);
7529 bool src_known;
7530 s64 smin_val, smax_val;
7531 u64 umin_val, umax_val;
7532 s32 s32_min_val, s32_max_val;
7533 u32 u32_min_val, u32_max_val;
7534 u64 insn_bitness = (BPF_CLASS(insn->code) == BPF_ALU64) ? 64 : 32;
7535 bool alu32 = (BPF_CLASS(insn->code) != BPF_ALU64);
7536 int ret;
7537
7538 smin_val = src_reg.smin_value;
7539 smax_val = src_reg.smax_value;
7540 umin_val = src_reg.umin_value;
7541 umax_val = src_reg.umax_value;
7542
7543 s32_min_val = src_reg.s32_min_value;
7544 s32_max_val = src_reg.s32_max_value;
7545 u32_min_val = src_reg.u32_min_value;
7546 u32_max_val = src_reg.u32_max_value;
7547
7548 if (alu32) {
7549 src_known = tnum_subreg_is_const(src_reg.var_off);
7550 if ((src_known &&
7551 (s32_min_val != s32_max_val || u32_min_val != u32_max_val)) ||
7552 s32_min_val > s32_max_val || u32_min_val > u32_max_val) {
7553
7554
7555
7556 __mark_reg_unknown(env, dst_reg);
7557 return 0;
7558 }
7559 } else {
7560 src_known = tnum_is_const(src_reg.var_off);
7561 if ((src_known &&
7562 (smin_val != smax_val || umin_val != umax_val)) ||
7563 smin_val > smax_val || umin_val > umax_val) {
7564
7565
7566
7567 __mark_reg_unknown(env, dst_reg);
7568 return 0;
7569 }
7570 }
7571
7572 if (!src_known &&
7573 opcode != BPF_ADD && opcode != BPF_SUB && opcode != BPF_AND) {
7574 __mark_reg_unknown(env, dst_reg);
7575 return 0;
7576 }
7577
7578 if (sanitize_needed(opcode)) {
7579 ret = sanitize_val_alu(env, insn);
7580 if (ret < 0)
7581 return sanitize_err(env, insn, ret, NULL, NULL);
7582 }
7583
7584
7585
7586
7587
7588
7589
7590
7591
7592
7593
7594
7595
7596
7597
7598 switch (opcode) {
7599 case BPF_ADD:
7600 scalar32_min_max_add(dst_reg, &src_reg);
7601 scalar_min_max_add(dst_reg, &src_reg);
7602 dst_reg->var_off = tnum_add(dst_reg->var_off, src_reg.var_off);
7603 break;
7604 case BPF_SUB:
7605 scalar32_min_max_sub(dst_reg, &src_reg);
7606 scalar_min_max_sub(dst_reg, &src_reg);
7607 dst_reg->var_off = tnum_sub(dst_reg->var_off, src_reg.var_off);
7608 break;
7609 case BPF_MUL:
7610 dst_reg->var_off = tnum_mul(dst_reg->var_off, src_reg.var_off);
7611 scalar32_min_max_mul(dst_reg, &src_reg);
7612 scalar_min_max_mul(dst_reg, &src_reg);
7613 break;
7614 case BPF_AND:
7615 dst_reg->var_off = tnum_and(dst_reg->var_off, src_reg.var_off);
7616 scalar32_min_max_and(dst_reg, &src_reg);
7617 scalar_min_max_and(dst_reg, &src_reg);
7618 break;
7619 case BPF_OR:
7620 dst_reg->var_off = tnum_or(dst_reg->var_off, src_reg.var_off);
7621 scalar32_min_max_or(dst_reg, &src_reg);
7622 scalar_min_max_or(dst_reg, &src_reg);
7623 break;
7624 case BPF_XOR:
7625 dst_reg->var_off = tnum_xor(dst_reg->var_off, src_reg.var_off);
7626 scalar32_min_max_xor(dst_reg, &src_reg);
7627 scalar_min_max_xor(dst_reg, &src_reg);
7628 break;
7629 case BPF_LSH:
7630 if (umax_val >= insn_bitness) {
7631
7632
7633
7634 mark_reg_unknown(env, regs, insn->dst_reg);
7635 break;
7636 }
7637 if (alu32)
7638 scalar32_min_max_lsh(dst_reg, &src_reg);
7639 else
7640 scalar_min_max_lsh(dst_reg, &src_reg);
7641 break;
7642 case BPF_RSH:
7643 if (umax_val >= insn_bitness) {
7644
7645
7646
7647 mark_reg_unknown(env, regs, insn->dst_reg);
7648 break;
7649 }
7650 if (alu32)
7651 scalar32_min_max_rsh(dst_reg, &src_reg);
7652 else
7653 scalar_min_max_rsh(dst_reg, &src_reg);
7654 break;
7655 case BPF_ARSH:
7656 if (umax_val >= insn_bitness) {
7657
7658
7659
7660 mark_reg_unknown(env, regs, insn->dst_reg);
7661 break;
7662 }
7663 if (alu32)
7664 scalar32_min_max_arsh(dst_reg, &src_reg);
7665 else
7666 scalar_min_max_arsh(dst_reg, &src_reg);
7667 break;
7668 default:
7669 mark_reg_unknown(env, regs, insn->dst_reg);
7670 break;
7671 }
7672
7673
7674 if (alu32)
7675 zext_32_to_64(dst_reg);
7676
7677 __update_reg_bounds(dst_reg);
7678 __reg_deduce_bounds(dst_reg);
7679 __reg_bound_offset(dst_reg);
7680 return 0;
7681}
7682
7683
7684
7685
7686static int adjust_reg_min_max_vals(struct bpf_verifier_env *env,
7687 struct bpf_insn *insn)
7688{
7689 struct bpf_verifier_state *vstate = env->cur_state;
7690 struct bpf_func_state *state = vstate->frame[vstate->curframe];
7691 struct bpf_reg_state *regs = state->regs, *dst_reg, *src_reg;
7692 struct bpf_reg_state *ptr_reg = NULL, off_reg = {0};
7693 u8 opcode = BPF_OP(insn->code);
7694 int err;
7695
7696 dst_reg = ®s[insn->dst_reg];
7697 src_reg = NULL;
7698 if (dst_reg->type != SCALAR_VALUE)
7699 ptr_reg = dst_reg;
7700 else
7701
7702
7703
7704 dst_reg->id = 0;
7705 if (BPF_SRC(insn->code) == BPF_X) {
7706 src_reg = ®s[insn->src_reg];
7707 if (src_reg->type != SCALAR_VALUE) {
7708 if (dst_reg->type != SCALAR_VALUE) {
7709
7710
7711
7712
7713 if (opcode == BPF_SUB && env->allow_ptr_leaks) {
7714 mark_reg_unknown(env, regs, insn->dst_reg);
7715 return 0;
7716 }
7717 verbose(env, "R%d pointer %s pointer prohibited\n",
7718 insn->dst_reg,
7719 bpf_alu_string[opcode >> 4]);
7720 return -EACCES;
7721 } else {
7722
7723
7724
7725
7726 err = mark_chain_precision(env, insn->dst_reg);
7727 if (err)
7728 return err;
7729 return adjust_ptr_min_max_vals(env, insn,
7730 src_reg, dst_reg);
7731 }
7732 } else if (ptr_reg) {
7733
7734 err = mark_chain_precision(env, insn->src_reg);
7735 if (err)
7736 return err;
7737 return adjust_ptr_min_max_vals(env, insn,
7738 dst_reg, src_reg);
7739 }
7740 } else {
7741
7742
7743
7744 off_reg.type = SCALAR_VALUE;
7745 __mark_reg_known(&off_reg, insn->imm);
7746 src_reg = &off_reg;
7747 if (ptr_reg)
7748 return adjust_ptr_min_max_vals(env, insn,
7749 ptr_reg, src_reg);
7750 }
7751
7752
7753 if (WARN_ON_ONCE(ptr_reg)) {
7754 print_verifier_state(env, state);
7755 verbose(env, "verifier internal error: unexpected ptr_reg\n");
7756 return -EINVAL;
7757 }
7758 if (WARN_ON(!src_reg)) {
7759 print_verifier_state(env, state);
7760 verbose(env, "verifier internal error: no src_reg\n");
7761 return -EINVAL;
7762 }
7763 return adjust_scalar_min_max_vals(env, insn, dst_reg, *src_reg);
7764}
7765
7766
7767static int check_alu_op(struct bpf_verifier_env *env, struct bpf_insn *insn)
7768{
7769 struct bpf_reg_state *regs = cur_regs(env);
7770 u8 opcode = BPF_OP(insn->code);
7771 int err;
7772
7773 if (opcode == BPF_END || opcode == BPF_NEG) {
7774 if (opcode == BPF_NEG) {
7775 if (BPF_SRC(insn->code) != 0 ||
7776 insn->src_reg != BPF_REG_0 ||
7777 insn->off != 0 || insn->imm != 0) {
7778 verbose(env, "BPF_NEG uses reserved fields\n");
7779 return -EINVAL;
7780 }
7781 } else {
7782 if (insn->src_reg != BPF_REG_0 || insn->off != 0 ||
7783 (insn->imm != 16 && insn->imm != 32 && insn->imm != 64) ||
7784 BPF_CLASS(insn->code) == BPF_ALU64) {
7785 verbose(env, "BPF_END uses reserved fields\n");
7786 return -EINVAL;
7787 }
7788 }
7789
7790
7791 err = check_reg_arg(env, insn->dst_reg, SRC_OP);
7792 if (err)
7793 return err;
7794
7795 if (is_pointer_value(env, insn->dst_reg)) {
7796 verbose(env, "R%d pointer arithmetic prohibited\n",
7797 insn->dst_reg);
7798 return -EACCES;
7799 }
7800
7801
7802 err = check_reg_arg(env, insn->dst_reg, DST_OP);
7803 if (err)
7804 return err;
7805
7806 } else if (opcode == BPF_MOV) {
7807
7808 if (BPF_SRC(insn->code) == BPF_X) {
7809 if (insn->imm != 0 || insn->off != 0) {
7810 verbose(env, "BPF_MOV uses reserved fields\n");
7811 return -EINVAL;
7812 }
7813
7814
7815 err = check_reg_arg(env, insn->src_reg, SRC_OP);
7816 if (err)
7817 return err;
7818 } else {
7819 if (insn->src_reg != BPF_REG_0 || insn->off != 0) {
7820 verbose(env, "BPF_MOV uses reserved fields\n");
7821 return -EINVAL;
7822 }
7823 }
7824
7825
7826 err = check_reg_arg(env, insn->dst_reg, DST_OP_NO_MARK);
7827 if (err)
7828 return err;
7829
7830 if (BPF_SRC(insn->code) == BPF_X) {
7831 struct bpf_reg_state *src_reg = regs + insn->src_reg;
7832 struct bpf_reg_state *dst_reg = regs + insn->dst_reg;
7833
7834 if (BPF_CLASS(insn->code) == BPF_ALU64) {
7835
7836
7837
7838 if (src_reg->type == SCALAR_VALUE && !src_reg->id)
7839
7840
7841
7842
7843 src_reg->id = ++env->id_gen;
7844 *dst_reg = *src_reg;
7845 dst_reg->live |= REG_LIVE_WRITTEN;
7846 dst_reg->subreg_def = DEF_NOT_SUBREG;
7847 } else {
7848
7849 if (is_pointer_value(env, insn->src_reg)) {
7850 verbose(env,
7851 "R%d partial copy of pointer\n",
7852 insn->src_reg);
7853 return -EACCES;
7854 } else if (src_reg->type == SCALAR_VALUE) {
7855 *dst_reg = *src_reg;
7856
7857
7858
7859
7860 dst_reg->id = 0;
7861 dst_reg->live |= REG_LIVE_WRITTEN;
7862 dst_reg->subreg_def = env->insn_idx + 1;
7863 } else {
7864 mark_reg_unknown(env, regs,
7865 insn->dst_reg);
7866 }
7867 zext_32_to_64(dst_reg);
7868 }
7869 } else {
7870
7871
7872
7873
7874 mark_reg_unknown(env, regs, insn->dst_reg);
7875 regs[insn->dst_reg].type = SCALAR_VALUE;
7876 if (BPF_CLASS(insn->code) == BPF_ALU64) {
7877 __mark_reg_known(regs + insn->dst_reg,
7878 insn->imm);
7879 } else {
7880 __mark_reg_known(regs + insn->dst_reg,
7881 (u32)insn->imm);
7882 }
7883 }
7884
7885 } else if (opcode > BPF_END) {
7886 verbose(env, "invalid BPF_ALU opcode %x\n", opcode);
7887 return -EINVAL;
7888
7889 } else {
7890
7891 if (BPF_SRC(insn->code) == BPF_X) {
7892 if (insn->imm != 0 || insn->off != 0) {
7893 verbose(env, "BPF_ALU uses reserved fields\n");
7894 return -EINVAL;
7895 }
7896
7897 err = check_reg_arg(env, insn->src_reg, SRC_OP);
7898 if (err)
7899 return err;
7900 } else {
7901 if (insn->src_reg != BPF_REG_0 || insn->off != 0) {
7902 verbose(env, "BPF_ALU uses reserved fields\n");
7903 return -EINVAL;
7904 }
7905 }
7906
7907
7908 err = check_reg_arg(env, insn->dst_reg, SRC_OP);
7909 if (err)
7910 return err;
7911
7912 if ((opcode == BPF_MOD || opcode == BPF_DIV) &&
7913 BPF_SRC(insn->code) == BPF_K && insn->imm == 0) {
7914 verbose(env, "div by zero\n");
7915 return -EINVAL;
7916 }
7917
7918 if ((opcode == BPF_LSH || opcode == BPF_RSH ||
7919 opcode == BPF_ARSH) && BPF_SRC(insn->code) == BPF_K) {
7920 int size = BPF_CLASS(insn->code) == BPF_ALU64 ? 64 : 32;
7921
7922 if (insn->imm < 0 || insn->imm >= size) {
7923 verbose(env, "invalid shift %d\n", insn->imm);
7924 return -EINVAL;
7925 }
7926 }
7927
7928
7929 err = check_reg_arg(env, insn->dst_reg, DST_OP_NO_MARK);
7930 if (err)
7931 return err;
7932
7933 return adjust_reg_min_max_vals(env, insn);
7934 }
7935
7936 return 0;
7937}
7938
7939static void __find_good_pkt_pointers(struct bpf_func_state *state,
7940 struct bpf_reg_state *dst_reg,
7941 enum bpf_reg_type type, int new_range)
7942{
7943 struct bpf_reg_state *reg;
7944 int i;
7945
7946 for (i = 0; i < MAX_BPF_REG; i++) {
7947 reg = &state->regs[i];
7948 if (reg->type == type && reg->id == dst_reg->id)
7949
7950 reg->range = max(reg->range, new_range);
7951 }
7952
7953 bpf_for_each_spilled_reg(i, state, reg) {
7954 if (!reg)
7955 continue;
7956 if (reg->type == type && reg->id == dst_reg->id)
7957 reg->range = max(reg->range, new_range);
7958 }
7959}
7960
7961static void find_good_pkt_pointers(struct bpf_verifier_state *vstate,
7962 struct bpf_reg_state *dst_reg,
7963 enum bpf_reg_type type,
7964 bool range_right_open)
7965{
7966 int new_range, i;
7967
7968 if (dst_reg->off < 0 ||
7969 (dst_reg->off == 0 && range_right_open))
7970
7971 return;
7972
7973 if (dst_reg->umax_value > MAX_PACKET_OFF ||
7974 dst_reg->umax_value + dst_reg->off > MAX_PACKET_OFF)
7975
7976
7977
7978 return;
7979
7980 new_range = dst_reg->off;
7981 if (range_right_open)
7982 new_range--;
7983
7984
7985
7986
7987
7988
7989
7990
7991
7992
7993
7994
7995
7996
7997
7998
7999
8000
8001
8002
8003
8004
8005
8006
8007
8008
8009
8010
8011
8012
8013
8014
8015
8016
8017
8018
8019
8020
8021
8022
8023
8024
8025
8026
8027
8028
8029
8030
8031 for (i = 0; i <= vstate->curframe; i++)
8032 __find_good_pkt_pointers(vstate->frame[i], dst_reg, type,
8033 new_range);
8034}
8035
8036static int is_branch32_taken(struct bpf_reg_state *reg, u32 val, u8 opcode)
8037{
8038 struct tnum subreg = tnum_subreg(reg->var_off);
8039 s32 sval = (s32)val;
8040
8041 switch (opcode) {
8042 case BPF_JEQ:
8043 if (tnum_is_const(subreg))
8044 return !!tnum_equals_const(subreg, val);
8045 break;
8046 case BPF_JNE:
8047 if (tnum_is_const(subreg))
8048 return !tnum_equals_const(subreg, val);
8049 break;
8050 case BPF_JSET:
8051 if ((~subreg.mask & subreg.value) & val)
8052 return 1;
8053 if (!((subreg.mask | subreg.value) & val))
8054 return 0;
8055 break;
8056 case BPF_JGT:
8057 if (reg->u32_min_value > val)
8058 return 1;
8059 else if (reg->u32_max_value <= val)
8060 return 0;
8061 break;
8062 case BPF_JSGT:
8063 if (reg->s32_min_value > sval)
8064 return 1;
8065 else if (reg->s32_max_value <= sval)
8066 return 0;
8067 break;
8068 case BPF_JLT:
8069 if (reg->u32_max_value < val)
8070 return 1;
8071 else if (reg->u32_min_value >= val)
8072 return 0;
8073 break;
8074 case BPF_JSLT:
8075 if (reg->s32_max_value < sval)
8076 return 1;
8077 else if (reg->s32_min_value >= sval)
8078 return 0;
8079 break;
8080 case BPF_JGE:
8081 if (reg->u32_min_value >= val)
8082 return 1;
8083 else if (reg->u32_max_value < val)
8084 return 0;
8085 break;
8086 case BPF_JSGE:
8087 if (reg->s32_min_value >= sval)
8088 return 1;
8089 else if (reg->s32_max_value < sval)
8090 return 0;
8091 break;
8092 case BPF_JLE:
8093 if (reg->u32_max_value <= val)
8094 return 1;
8095 else if (reg->u32_min_value > val)
8096 return 0;
8097 break;
8098 case BPF_JSLE:
8099 if (reg->s32_max_value <= sval)
8100 return 1;
8101 else if (reg->s32_min_value > sval)
8102 return 0;
8103 break;
8104 }
8105
8106 return -1;
8107}
8108
8109
8110static int is_branch64_taken(struct bpf_reg_state *reg, u64 val, u8 opcode)
8111{
8112 s64 sval = (s64)val;
8113
8114 switch (opcode) {
8115 case BPF_JEQ:
8116 if (tnum_is_const(reg->var_off))
8117 return !!tnum_equals_const(reg->var_off, val);
8118 break;
8119 case BPF_JNE:
8120 if (tnum_is_const(reg->var_off))
8121 return !tnum_equals_const(reg->var_off, val);
8122 break;
8123 case BPF_JSET:
8124 if ((~reg->var_off.mask & reg->var_off.value) & val)
8125 return 1;
8126 if (!((reg->var_off.mask | reg->var_off.value) & val))
8127 return 0;
8128 break;
8129 case BPF_JGT:
8130 if (reg->umin_value > val)
8131 return 1;
8132 else if (reg->umax_value <= val)
8133 return 0;
8134 break;
8135 case BPF_JSGT:
8136 if (reg->smin_value > sval)
8137 return 1;
8138 else if (reg->smax_value <= sval)
8139 return 0;
8140 break;
8141 case BPF_JLT:
8142 if (reg->umax_value < val)
8143 return 1;
8144 else if (reg->umin_value >= val)
8145 return 0;
8146 break;
8147 case BPF_JSLT:
8148 if (reg->smax_value < sval)
8149 return 1;
8150 else if (reg->smin_value >= sval)
8151 return 0;
8152 break;
8153 case BPF_JGE:
8154 if (reg->umin_value >= val)
8155 return 1;
8156 else if (reg->umax_value < val)
8157 return 0;
8158 break;
8159 case BPF_JSGE:
8160 if (reg->smin_value >= sval)
8161 return 1;
8162 else if (reg->smax_value < sval)
8163 return 0;
8164 break;
8165 case BPF_JLE:
8166 if (reg->umax_value <= val)
8167 return 1;
8168 else if (reg->umin_value > val)
8169 return 0;
8170 break;
8171 case BPF_JSLE:
8172 if (reg->smax_value <= sval)
8173 return 1;
8174 else if (reg->smin_value > sval)
8175 return 0;
8176 break;
8177 }
8178
8179 return -1;
8180}
8181
8182
8183
8184
8185
8186
8187
8188
8189static int is_branch_taken(struct bpf_reg_state *reg, u64 val, u8 opcode,
8190 bool is_jmp32)
8191{
8192 if (__is_pointer_value(false, reg)) {
8193 if (!reg_type_not_null(reg->type))
8194 return -1;
8195
8196
8197
8198
8199 if (val != 0)
8200 return -1;
8201
8202 switch (opcode) {
8203 case BPF_JEQ:
8204 return 0;
8205 case BPF_JNE:
8206 return 1;
8207 default:
8208 return -1;
8209 }
8210 }
8211
8212 if (is_jmp32)
8213 return is_branch32_taken(reg, val, opcode);
8214 return is_branch64_taken(reg, val, opcode);
8215}
8216
8217static int flip_opcode(u32 opcode)
8218{
8219
8220 static const u8 opcode_flip[16] = {
8221
8222 [BPF_JEQ >> 4] = BPF_JEQ,
8223 [BPF_JNE >> 4] = BPF_JNE,
8224 [BPF_JSET >> 4] = BPF_JSET,
8225
8226 [BPF_JGE >> 4] = BPF_JLE,
8227 [BPF_JGT >> 4] = BPF_JLT,
8228 [BPF_JLE >> 4] = BPF_JGE,
8229 [BPF_JLT >> 4] = BPF_JGT,
8230 [BPF_JSGE >> 4] = BPF_JSLE,
8231 [BPF_JSGT >> 4] = BPF_JSLT,
8232 [BPF_JSLE >> 4] = BPF_JSGE,
8233 [BPF_JSLT >> 4] = BPF_JSGT
8234 };
8235 return opcode_flip[opcode >> 4];
8236}
8237
8238static int is_pkt_ptr_branch_taken(struct bpf_reg_state *dst_reg,
8239 struct bpf_reg_state *src_reg,
8240 u8 opcode)
8241{
8242 struct bpf_reg_state *pkt;
8243
8244 if (src_reg->type == PTR_TO_PACKET_END) {
8245 pkt = dst_reg;
8246 } else if (dst_reg->type == PTR_TO_PACKET_END) {
8247 pkt = src_reg;
8248 opcode = flip_opcode(opcode);
8249 } else {
8250 return -1;
8251 }
8252
8253 if (pkt->range >= 0)
8254 return -1;
8255
8256 switch (opcode) {
8257 case BPF_JLE:
8258
8259 fallthrough;
8260 case BPF_JGT:
8261
8262 if (pkt->range == BEYOND_PKT_END)
8263
8264 return opcode == BPF_JGT;
8265 break;
8266 case BPF_JLT:
8267
8268 fallthrough;
8269 case BPF_JGE:
8270
8271 if (pkt->range == BEYOND_PKT_END || pkt->range == AT_PKT_END)
8272 return opcode == BPF_JGE;
8273 break;
8274 }
8275 return -1;
8276}
8277
8278
8279
8280
8281
8282
8283static void reg_set_min_max(struct bpf_reg_state *true_reg,
8284 struct bpf_reg_state *false_reg,
8285 u64 val, u32 val32,
8286 u8 opcode, bool is_jmp32)
8287{
8288 struct tnum false_32off = tnum_subreg(false_reg->var_off);
8289 struct tnum false_64off = false_reg->var_off;
8290 struct tnum true_32off = tnum_subreg(true_reg->var_off);
8291 struct tnum true_64off = true_reg->var_off;
8292 s64 sval = (s64)val;
8293 s32 sval32 = (s32)val32;
8294
8295
8296
8297
8298
8299
8300
8301 if (__is_pointer_value(false, false_reg))
8302 return;
8303
8304 switch (opcode) {
8305 case BPF_JEQ:
8306 case BPF_JNE:
8307 {
8308 struct bpf_reg_state *reg =
8309 opcode == BPF_JEQ ? true_reg : false_reg;
8310
8311
8312
8313
8314
8315
8316
8317
8318
8319 if (is_jmp32)
8320 __mark_reg32_known(reg, val32);
8321 else
8322 ___mark_reg_known(reg, val);
8323 break;
8324 }
8325 case BPF_JSET:
8326 if (is_jmp32) {
8327 false_32off = tnum_and(false_32off, tnum_const(~val32));
8328 if (is_power_of_2(val32))
8329 true_32off = tnum_or(true_32off,
8330 tnum_const(val32));
8331 } else {
8332 false_64off = tnum_and(false_64off, tnum_const(~val));
8333 if (is_power_of_2(val))
8334 true_64off = tnum_or(true_64off,
8335 tnum_const(val));
8336 }
8337 break;
8338 case BPF_JGE:
8339 case BPF_JGT:
8340 {
8341 if (is_jmp32) {
8342 u32 false_umax = opcode == BPF_JGT ? val32 : val32 - 1;
8343 u32 true_umin = opcode == BPF_JGT ? val32 + 1 : val32;
8344
8345 false_reg->u32_max_value = min(false_reg->u32_max_value,
8346 false_umax);
8347 true_reg->u32_min_value = max(true_reg->u32_min_value,
8348 true_umin);
8349 } else {
8350 u64 false_umax = opcode == BPF_JGT ? val : val - 1;
8351 u64 true_umin = opcode == BPF_JGT ? val + 1 : val;
8352
8353 false_reg->umax_value = min(false_reg->umax_value, false_umax);
8354 true_reg->umin_value = max(true_reg->umin_value, true_umin);
8355 }
8356 break;
8357 }
8358 case BPF_JSGE:
8359 case BPF_JSGT:
8360 {
8361 if (is_jmp32) {
8362 s32 false_smax = opcode == BPF_JSGT ? sval32 : sval32 - 1;
8363 s32 true_smin = opcode == BPF_JSGT ? sval32 + 1 : sval32;
8364
8365 false_reg->s32_max_value = min(false_reg->s32_max_value, false_smax);
8366 true_reg->s32_min_value = max(true_reg->s32_min_value, true_smin);
8367 } else {
8368 s64 false_smax = opcode == BPF_JSGT ? sval : sval - 1;
8369 s64 true_smin = opcode == BPF_JSGT ? sval + 1 : sval;
8370
8371 false_reg->smax_value = min(false_reg->smax_value, false_smax);
8372 true_reg->smin_value = max(true_reg->smin_value, true_smin);
8373 }
8374 break;
8375 }
8376 case BPF_JLE:
8377 case BPF_JLT:
8378 {
8379 if (is_jmp32) {
8380 u32 false_umin = opcode == BPF_JLT ? val32 : val32 + 1;
8381 u32 true_umax = opcode == BPF_JLT ? val32 - 1 : val32;
8382
8383 false_reg->u32_min_value = max(false_reg->u32_min_value,
8384 false_umin);
8385 true_reg->u32_max_value = min(true_reg->u32_max_value,
8386 true_umax);
8387 } else {
8388 u64 false_umin = opcode == BPF_JLT ? val : val + 1;
8389 u64 true_umax = opcode == BPF_JLT ? val - 1 : val;
8390
8391 false_reg->umin_value = max(false_reg->umin_value, false_umin);
8392 true_reg->umax_value = min(true_reg->umax_value, true_umax);
8393 }
8394 break;
8395 }
8396 case BPF_JSLE:
8397 case BPF_JSLT:
8398 {
8399 if (is_jmp32) {
8400 s32 false_smin = opcode == BPF_JSLT ? sval32 : sval32 + 1;
8401 s32 true_smax = opcode == BPF_JSLT ? sval32 - 1 : sval32;
8402
8403 false_reg->s32_min_value = max(false_reg->s32_min_value, false_smin);
8404 true_reg->s32_max_value = min(true_reg->s32_max_value, true_smax);
8405 } else {
8406 s64 false_smin = opcode == BPF_JSLT ? sval : sval + 1;
8407 s64 true_smax = opcode == BPF_JSLT ? sval - 1 : sval;
8408
8409 false_reg->smin_value = max(false_reg->smin_value, false_smin);
8410 true_reg->smax_value = min(true_reg->smax_value, true_smax);
8411 }
8412 break;
8413 }
8414 default:
8415 return;
8416 }
8417
8418 if (is_jmp32) {
8419 false_reg->var_off = tnum_or(tnum_clear_subreg(false_64off),
8420 tnum_subreg(false_32off));
8421 true_reg->var_off = tnum_or(tnum_clear_subreg(true_64off),
8422 tnum_subreg(true_32off));
8423 __reg_combine_32_into_64(false_reg);
8424 __reg_combine_32_into_64(true_reg);
8425 } else {
8426 false_reg->var_off = false_64off;
8427 true_reg->var_off = true_64off;
8428 __reg_combine_64_into_32(false_reg);
8429 __reg_combine_64_into_32(true_reg);
8430 }
8431}
8432
8433
8434
8435
8436static void reg_set_min_max_inv(struct bpf_reg_state *true_reg,
8437 struct bpf_reg_state *false_reg,
8438 u64 val, u32 val32,
8439 u8 opcode, bool is_jmp32)
8440{
8441 opcode = flip_opcode(opcode);
8442
8443
8444
8445 if (opcode)
8446 reg_set_min_max(true_reg, false_reg, val, val32, opcode, is_jmp32);
8447}
8448
8449
8450static void __reg_combine_min_max(struct bpf_reg_state *src_reg,
8451 struct bpf_reg_state *dst_reg)
8452{
8453 src_reg->umin_value = dst_reg->umin_value = max(src_reg->umin_value,
8454 dst_reg->umin_value);
8455 src_reg->umax_value = dst_reg->umax_value = min(src_reg->umax_value,
8456 dst_reg->umax_value);
8457 src_reg->smin_value = dst_reg->smin_value = max(src_reg->smin_value,
8458 dst_reg->smin_value);
8459 src_reg->smax_value = dst_reg->smax_value = min(src_reg->smax_value,
8460 dst_reg->smax_value);
8461 src_reg->var_off = dst_reg->var_off = tnum_intersect(src_reg->var_off,
8462 dst_reg->var_off);
8463
8464 __update_reg_bounds(src_reg);
8465 __update_reg_bounds(dst_reg);
8466
8467 __reg_deduce_bounds(src_reg);
8468 __reg_deduce_bounds(dst_reg);
8469
8470 __reg_bound_offset(src_reg);
8471 __reg_bound_offset(dst_reg);
8472
8473
8474
8475
8476 __update_reg_bounds(src_reg);
8477 __update_reg_bounds(dst_reg);
8478}
8479
8480static void reg_combine_min_max(struct bpf_reg_state *true_src,
8481 struct bpf_reg_state *true_dst,
8482 struct bpf_reg_state *false_src,
8483 struct bpf_reg_state *false_dst,
8484 u8 opcode)
8485{
8486 switch (opcode) {
8487 case BPF_JEQ:
8488 __reg_combine_min_max(true_src, true_dst);
8489 break;
8490 case BPF_JNE:
8491 __reg_combine_min_max(false_src, false_dst);
8492 break;
8493 }
8494}
8495
8496static void mark_ptr_or_null_reg(struct bpf_func_state *state,
8497 struct bpf_reg_state *reg, u32 id,
8498 bool is_null)
8499{
8500 if (reg_type_may_be_null(reg->type) && reg->id == id &&
8501 !WARN_ON_ONCE(!reg->id)) {
8502
8503
8504
8505
8506 if (WARN_ON_ONCE(reg->smin_value || reg->smax_value ||
8507 !tnum_equals_const(reg->var_off, 0) ||
8508 reg->off)) {
8509 __mark_reg_known_zero(reg);
8510 reg->off = 0;
8511 }
8512 if (is_null) {
8513 reg->type = SCALAR_VALUE;
8514
8515
8516
8517
8518 reg->id = 0;
8519 reg->ref_obj_id = 0;
8520
8521 return;
8522 }
8523
8524 mark_ptr_not_null_reg(reg);
8525
8526 if (!reg_may_point_to_spin_lock(reg)) {
8527
8528
8529
8530
8531
8532
8533 reg->id = 0;
8534 }
8535 }
8536}
8537
8538static void __mark_ptr_or_null_regs(struct bpf_func_state *state, u32 id,
8539 bool is_null)
8540{
8541 struct bpf_reg_state *reg;
8542 int i;
8543
8544 for (i = 0; i < MAX_BPF_REG; i++)
8545 mark_ptr_or_null_reg(state, &state->regs[i], id, is_null);
8546
8547 bpf_for_each_spilled_reg(i, state, reg) {
8548 if (!reg)
8549 continue;
8550 mark_ptr_or_null_reg(state, reg, id, is_null);
8551 }
8552}
8553
8554
8555
8556
8557static void mark_ptr_or_null_regs(struct bpf_verifier_state *vstate, u32 regno,
8558 bool is_null)
8559{
8560 struct bpf_func_state *state = vstate->frame[vstate->curframe];
8561 struct bpf_reg_state *regs = state->regs;
8562 u32 ref_obj_id = regs[regno].ref_obj_id;
8563 u32 id = regs[regno].id;
8564 int i;
8565
8566 if (ref_obj_id && ref_obj_id == id && is_null)
8567
8568
8569
8570
8571 WARN_ON_ONCE(release_reference_state(state, id));
8572
8573 for (i = 0; i <= vstate->curframe; i++)
8574 __mark_ptr_or_null_regs(vstate->frame[i], id, is_null);
8575}
8576
8577static bool try_match_pkt_pointers(const struct bpf_insn *insn,
8578 struct bpf_reg_state *dst_reg,
8579 struct bpf_reg_state *src_reg,
8580 struct bpf_verifier_state *this_branch,
8581 struct bpf_verifier_state *other_branch)
8582{
8583 if (BPF_SRC(insn->code) != BPF_X)
8584 return false;
8585
8586
8587 if (BPF_CLASS(insn->code) == BPF_JMP32)
8588 return false;
8589
8590 switch (BPF_OP(insn->code)) {
8591 case BPF_JGT:
8592 if ((dst_reg->type == PTR_TO_PACKET &&
8593 src_reg->type == PTR_TO_PACKET_END) ||
8594 (dst_reg->type == PTR_TO_PACKET_META &&
8595 reg_is_init_pkt_pointer(src_reg, PTR_TO_PACKET))) {
8596
8597 find_good_pkt_pointers(this_branch, dst_reg,
8598 dst_reg->type, false);
8599 mark_pkt_end(other_branch, insn->dst_reg, true);
8600 } else if ((dst_reg->type == PTR_TO_PACKET_END &&
8601 src_reg->type == PTR_TO_PACKET) ||
8602 (reg_is_init_pkt_pointer(dst_reg, PTR_TO_PACKET) &&
8603 src_reg->type == PTR_TO_PACKET_META)) {
8604
8605 find_good_pkt_pointers(other_branch, src_reg,
8606 src_reg->type, true);
8607 mark_pkt_end(this_branch, insn->src_reg, false);
8608 } else {
8609 return false;
8610 }
8611 break;
8612 case BPF_JLT:
8613 if ((dst_reg->type == PTR_TO_PACKET &&
8614 src_reg->type == PTR_TO_PACKET_END) ||
8615 (dst_reg->type == PTR_TO_PACKET_META &&
8616 reg_is_init_pkt_pointer(src_reg, PTR_TO_PACKET))) {
8617
8618 find_good_pkt_pointers(other_branch, dst_reg,
8619 dst_reg->type, true);
8620 mark_pkt_end(this_branch, insn->dst_reg, false);
8621 } else if ((dst_reg->type == PTR_TO_PACKET_END &&
8622 src_reg->type == PTR_TO_PACKET) ||
8623 (reg_is_init_pkt_pointer(dst_reg, PTR_TO_PACKET) &&
8624 src_reg->type == PTR_TO_PACKET_META)) {
8625
8626 find_good_pkt_pointers(this_branch, src_reg,
8627 src_reg->type, false);
8628 mark_pkt_end(other_branch, insn->src_reg, true);
8629 } else {
8630 return false;
8631 }
8632 break;
8633 case BPF_JGE:
8634 if ((dst_reg->type == PTR_TO_PACKET &&
8635 src_reg->type == PTR_TO_PACKET_END) ||
8636 (dst_reg->type == PTR_TO_PACKET_META &&
8637 reg_is_init_pkt_pointer(src_reg, PTR_TO_PACKET))) {
8638
8639 find_good_pkt_pointers(this_branch, dst_reg,
8640 dst_reg->type, true);
8641 mark_pkt_end(other_branch, insn->dst_reg, false);
8642 } else if ((dst_reg->type == PTR_TO_PACKET_END &&
8643 src_reg->type == PTR_TO_PACKET) ||
8644 (reg_is_init_pkt_pointer(dst_reg, PTR_TO_PACKET) &&
8645 src_reg->type == PTR_TO_PACKET_META)) {
8646
8647 find_good_pkt_pointers(other_branch, src_reg,
8648 src_reg->type, false);
8649 mark_pkt_end(this_branch, insn->src_reg, true);
8650 } else {
8651 return false;
8652 }
8653 break;
8654 case BPF_JLE:
8655 if ((dst_reg->type == PTR_TO_PACKET &&
8656 src_reg->type == PTR_TO_PACKET_END) ||
8657 (dst_reg->type == PTR_TO_PACKET_META &&
8658 reg_is_init_pkt_pointer(src_reg, PTR_TO_PACKET))) {
8659
8660 find_good_pkt_pointers(other_branch, dst_reg,
8661 dst_reg->type, false);
8662 mark_pkt_end(this_branch, insn->dst_reg, true);
8663 } else if ((dst_reg->type == PTR_TO_PACKET_END &&
8664 src_reg->type == PTR_TO_PACKET) ||
8665 (reg_is_init_pkt_pointer(dst_reg, PTR_TO_PACKET) &&
8666 src_reg->type == PTR_TO_PACKET_META)) {
8667
8668 find_good_pkt_pointers(this_branch, src_reg,
8669 src_reg->type, true);
8670 mark_pkt_end(other_branch, insn->src_reg, false);
8671 } else {
8672 return false;
8673 }
8674 break;
8675 default:
8676 return false;
8677 }
8678
8679 return true;
8680}
8681
8682static void find_equal_scalars(struct bpf_verifier_state *vstate,
8683 struct bpf_reg_state *known_reg)
8684{
8685 struct bpf_func_state *state;
8686 struct bpf_reg_state *reg;
8687 int i, j;
8688
8689 for (i = 0; i <= vstate->curframe; i++) {
8690 state = vstate->frame[i];
8691 for (j = 0; j < MAX_BPF_REG; j++) {
8692 reg = &state->regs[j];
8693 if (reg->type == SCALAR_VALUE && reg->id == known_reg->id)
8694 *reg = *known_reg;
8695 }
8696
8697 bpf_for_each_spilled_reg(j, state, reg) {
8698 if (!reg)
8699 continue;
8700 if (reg->type == SCALAR_VALUE && reg->id == known_reg->id)
8701 *reg = *known_reg;
8702 }
8703 }
8704}
8705
8706static int check_cond_jmp_op(struct bpf_verifier_env *env,
8707 struct bpf_insn *insn, int *insn_idx)
8708{
8709 struct bpf_verifier_state *this_branch = env->cur_state;
8710 struct bpf_verifier_state *other_branch;
8711 struct bpf_reg_state *regs = this_branch->frame[this_branch->curframe]->regs;
8712 struct bpf_reg_state *dst_reg, *other_branch_regs, *src_reg = NULL;
8713 u8 opcode = BPF_OP(insn->code);
8714 bool is_jmp32;
8715 int pred = -1;
8716 int err;
8717
8718
8719 if (opcode == BPF_JA || opcode > BPF_JSLE) {
8720 verbose(env, "invalid BPF_JMP/JMP32 opcode %x\n", opcode);
8721 return -EINVAL;
8722 }
8723
8724 if (BPF_SRC(insn->code) == BPF_X) {
8725 if (insn->imm != 0) {
8726 verbose(env, "BPF_JMP/JMP32 uses reserved fields\n");
8727 return -EINVAL;
8728 }
8729
8730
8731 err = check_reg_arg(env, insn->src_reg, SRC_OP);
8732 if (err)
8733 return err;
8734
8735 if (is_pointer_value(env, insn->src_reg)) {
8736 verbose(env, "R%d pointer comparison prohibited\n",
8737 insn->src_reg);
8738 return -EACCES;
8739 }
8740 src_reg = ®s[insn->src_reg];
8741 } else {
8742 if (insn->src_reg != BPF_REG_0) {
8743 verbose(env, "BPF_JMP/JMP32 uses reserved fields\n");
8744 return -EINVAL;
8745 }
8746 }
8747
8748
8749 err = check_reg_arg(env, insn->dst_reg, SRC_OP);
8750 if (err)
8751 return err;
8752
8753 dst_reg = ®s[insn->dst_reg];
8754 is_jmp32 = BPF_CLASS(insn->code) == BPF_JMP32;
8755
8756 if (BPF_SRC(insn->code) == BPF_K) {
8757 pred = is_branch_taken(dst_reg, insn->imm, opcode, is_jmp32);
8758 } else if (src_reg->type == SCALAR_VALUE &&
8759 is_jmp32 && tnum_is_const(tnum_subreg(src_reg->var_off))) {
8760 pred = is_branch_taken(dst_reg,
8761 tnum_subreg(src_reg->var_off).value,
8762 opcode,
8763 is_jmp32);
8764 } else if (src_reg->type == SCALAR_VALUE &&
8765 !is_jmp32 && tnum_is_const(src_reg->var_off)) {
8766 pred = is_branch_taken(dst_reg,
8767 src_reg->var_off.value,
8768 opcode,
8769 is_jmp32);
8770 } else if (reg_is_pkt_pointer_any(dst_reg) &&
8771 reg_is_pkt_pointer_any(src_reg) &&
8772 !is_jmp32) {
8773 pred = is_pkt_ptr_branch_taken(dst_reg, src_reg, opcode);
8774 }
8775
8776 if (pred >= 0) {
8777
8778
8779
8780 if (!__is_pointer_value(false, dst_reg))
8781 err = mark_chain_precision(env, insn->dst_reg);
8782 if (BPF_SRC(insn->code) == BPF_X && !err &&
8783 !__is_pointer_value(false, src_reg))
8784 err = mark_chain_precision(env, insn->src_reg);
8785 if (err)
8786 return err;
8787 }
8788
8789 if (pred == 1) {
8790
8791
8792
8793
8794 if (!env->bypass_spec_v1 &&
8795 !sanitize_speculative_path(env, insn, *insn_idx + 1,
8796 *insn_idx))
8797 return -EFAULT;
8798 *insn_idx += insn->off;
8799 return 0;
8800 } else if (pred == 0) {
8801
8802
8803
8804
8805 if (!env->bypass_spec_v1 &&
8806 !sanitize_speculative_path(env, insn,
8807 *insn_idx + insn->off + 1,
8808 *insn_idx))
8809 return -EFAULT;
8810 return 0;
8811 }
8812
8813 other_branch = push_stack(env, *insn_idx + insn->off + 1, *insn_idx,
8814 false);
8815 if (!other_branch)
8816 return -EFAULT;
8817 other_branch_regs = other_branch->frame[other_branch->curframe]->regs;
8818
8819
8820
8821
8822
8823
8824
8825
8826 if (BPF_SRC(insn->code) == BPF_X) {
8827 struct bpf_reg_state *src_reg = ®s[insn->src_reg];
8828
8829 if (dst_reg->type == SCALAR_VALUE &&
8830 src_reg->type == SCALAR_VALUE) {
8831 if (tnum_is_const(src_reg->var_off) ||
8832 (is_jmp32 &&
8833 tnum_is_const(tnum_subreg(src_reg->var_off))))
8834 reg_set_min_max(&other_branch_regs[insn->dst_reg],
8835 dst_reg,
8836 src_reg->var_off.value,
8837 tnum_subreg(src_reg->var_off).value,
8838 opcode, is_jmp32);
8839 else if (tnum_is_const(dst_reg->var_off) ||
8840 (is_jmp32 &&
8841 tnum_is_const(tnum_subreg(dst_reg->var_off))))
8842 reg_set_min_max_inv(&other_branch_regs[insn->src_reg],
8843 src_reg,
8844 dst_reg->var_off.value,
8845 tnum_subreg(dst_reg->var_off).value,
8846 opcode, is_jmp32);
8847 else if (!is_jmp32 &&
8848 (opcode == BPF_JEQ || opcode == BPF_JNE))
8849
8850 reg_combine_min_max(&other_branch_regs[insn->src_reg],
8851 &other_branch_regs[insn->dst_reg],
8852 src_reg, dst_reg, opcode);
8853 if (src_reg->id &&
8854 !WARN_ON_ONCE(src_reg->id != other_branch_regs[insn->src_reg].id)) {
8855 find_equal_scalars(this_branch, src_reg);
8856 find_equal_scalars(other_branch, &other_branch_regs[insn->src_reg]);
8857 }
8858
8859 }
8860 } else if (dst_reg->type == SCALAR_VALUE) {
8861 reg_set_min_max(&other_branch_regs[insn->dst_reg],
8862 dst_reg, insn->imm, (u32)insn->imm,
8863 opcode, is_jmp32);
8864 }
8865
8866 if (dst_reg->type == SCALAR_VALUE && dst_reg->id &&
8867 !WARN_ON_ONCE(dst_reg->id != other_branch_regs[insn->dst_reg].id)) {
8868 find_equal_scalars(this_branch, dst_reg);
8869 find_equal_scalars(other_branch, &other_branch_regs[insn->dst_reg]);
8870 }
8871
8872
8873
8874
8875
8876 if (!is_jmp32 && BPF_SRC(insn->code) == BPF_K &&
8877 insn->imm == 0 && (opcode == BPF_JEQ || opcode == BPF_JNE) &&
8878 reg_type_may_be_null(dst_reg->type)) {
8879
8880
8881
8882 mark_ptr_or_null_regs(this_branch, insn->dst_reg,
8883 opcode == BPF_JNE);
8884 mark_ptr_or_null_regs(other_branch, insn->dst_reg,
8885 opcode == BPF_JEQ);
8886 } else if (!try_match_pkt_pointers(insn, dst_reg, ®s[insn->src_reg],
8887 this_branch, other_branch) &&
8888 is_pointer_value(env, insn->dst_reg)) {
8889 verbose(env, "R%d pointer comparison prohibited\n",
8890 insn->dst_reg);
8891 return -EACCES;
8892 }
8893 if (env->log.level & BPF_LOG_LEVEL)
8894 print_verifier_state(env, this_branch->frame[this_branch->curframe]);
8895 return 0;
8896}
8897
8898
8899static int check_ld_imm(struct bpf_verifier_env *env, struct bpf_insn *insn)
8900{
8901 struct bpf_insn_aux_data *aux = cur_aux(env);
8902 struct bpf_reg_state *regs = cur_regs(env);
8903 struct bpf_reg_state *dst_reg;
8904 struct bpf_map *map;
8905 int err;
8906
8907 if (BPF_SIZE(insn->code) != BPF_DW) {
8908 verbose(env, "invalid BPF_LD_IMM insn\n");
8909 return -EINVAL;
8910 }
8911 if (insn->off != 0) {
8912 verbose(env, "BPF_LD_IMM64 uses reserved fields\n");
8913 return -EINVAL;
8914 }
8915
8916 err = check_reg_arg(env, insn->dst_reg, DST_OP);
8917 if (err)
8918 return err;
8919
8920 dst_reg = ®s[insn->dst_reg];
8921 if (insn->src_reg == 0) {
8922 u64 imm = ((u64)(insn + 1)->imm << 32) | (u32)insn->imm;
8923
8924 dst_reg->type = SCALAR_VALUE;
8925 __mark_reg_known(®s[insn->dst_reg], imm);
8926 return 0;
8927 }
8928
8929 if (insn->src_reg == BPF_PSEUDO_BTF_ID) {
8930 mark_reg_known_zero(env, regs, insn->dst_reg);
8931
8932 dst_reg->type = aux->btf_var.reg_type;
8933 switch (dst_reg->type) {
8934 case PTR_TO_MEM:
8935 dst_reg->mem_size = aux->btf_var.mem_size;
8936 break;
8937 case PTR_TO_BTF_ID:
8938 case PTR_TO_PERCPU_BTF_ID:
8939 dst_reg->btf = aux->btf_var.btf;
8940 dst_reg->btf_id = aux->btf_var.btf_id;
8941 break;
8942 default:
8943 verbose(env, "bpf verifier is misconfigured\n");
8944 return -EFAULT;
8945 }
8946 return 0;
8947 }
8948
8949 if (insn->src_reg == BPF_PSEUDO_FUNC) {
8950 struct bpf_prog_aux *aux = env->prog->aux;
8951 u32 subprogno = insn[1].imm;
8952
8953 if (!aux->func_info) {
8954 verbose(env, "missing btf func_info\n");
8955 return -EINVAL;
8956 }
8957 if (aux->func_info_aux[subprogno].linkage != BTF_FUNC_STATIC) {
8958 verbose(env, "callback function not static\n");
8959 return -EINVAL;
8960 }
8961
8962 dst_reg->type = PTR_TO_FUNC;
8963 dst_reg->subprogno = subprogno;
8964 return 0;
8965 }
8966
8967 map = env->used_maps[aux->map_index];
8968 mark_reg_known_zero(env, regs, insn->dst_reg);
8969 dst_reg->map_ptr = map;
8970
8971 if (insn->src_reg == BPF_PSEUDO_MAP_VALUE) {
8972 dst_reg->type = PTR_TO_MAP_VALUE;
8973 dst_reg->off = aux->map_off;
8974 if (map_value_has_spin_lock(map))
8975 dst_reg->id = ++env->id_gen;
8976 } else if (insn->src_reg == BPF_PSEUDO_MAP_FD) {
8977 dst_reg->type = CONST_PTR_TO_MAP;
8978 } else {
8979 verbose(env, "bpf verifier is misconfigured\n");
8980 return -EINVAL;
8981 }
8982
8983 return 0;
8984}
8985
8986static bool may_access_skb(enum bpf_prog_type type)
8987{
8988 switch (type) {
8989 case BPF_PROG_TYPE_SOCKET_FILTER:
8990 case BPF_PROG_TYPE_SCHED_CLS:
8991 case BPF_PROG_TYPE_SCHED_ACT:
8992 return true;
8993 default:
8994 return false;
8995 }
8996}
8997
8998
8999
9000
9001
9002
9003
9004
9005
9006
9007
9008
9009
9010
9011
9012
9013static int check_ld_abs(struct bpf_verifier_env *env, struct bpf_insn *insn)
9014{
9015 struct bpf_reg_state *regs = cur_regs(env);
9016 static const int ctx_reg = BPF_REG_6;
9017 u8 mode = BPF_MODE(insn->code);
9018 int i, err;
9019
9020 if (!may_access_skb(resolve_prog_type(env->prog))) {
9021 verbose(env, "BPF_LD_[ABS|IND] instructions not allowed for this program type\n");
9022 return -EINVAL;
9023 }
9024
9025 if (!env->ops->gen_ld_abs) {
9026 verbose(env, "bpf verifier is misconfigured\n");
9027 return -EINVAL;
9028 }
9029
9030 if (insn->dst_reg != BPF_REG_0 || insn->off != 0 ||
9031 BPF_SIZE(insn->code) == BPF_DW ||
9032 (mode == BPF_ABS && insn->src_reg != BPF_REG_0)) {
9033 verbose(env, "BPF_LD_[ABS|IND] uses reserved fields\n");
9034 return -EINVAL;
9035 }
9036
9037
9038 err = check_reg_arg(env, ctx_reg, SRC_OP);
9039 if (err)
9040 return err;
9041
9042
9043
9044
9045
9046 err = check_reference_leak(env);
9047 if (err) {
9048 verbose(env, "BPF_LD_[ABS|IND] cannot be mixed with socket references\n");
9049 return err;
9050 }
9051
9052 if (env->cur_state->active_spin_lock) {
9053 verbose(env, "BPF_LD_[ABS|IND] cannot be used inside bpf_spin_lock-ed region\n");
9054 return -EINVAL;
9055 }
9056
9057 if (regs[ctx_reg].type != PTR_TO_CTX) {
9058 verbose(env,
9059 "at the time of BPF_LD_ABS|IND R6 != pointer to skb\n");
9060 return -EINVAL;
9061 }
9062
9063 if (mode == BPF_IND) {
9064
9065 err = check_reg_arg(env, insn->src_reg, SRC_OP);
9066 if (err)
9067 return err;
9068 }
9069
9070 err = check_ctx_reg(env, ®s[ctx_reg], ctx_reg);
9071 if (err < 0)
9072 return err;
9073
9074
9075 for (i = 0; i < CALLER_SAVED_REGS; i++) {
9076 mark_reg_not_init(env, regs, caller_saved[i]);
9077 check_reg_arg(env, caller_saved[i], DST_OP_NO_MARK);
9078 }
9079
9080
9081
9082
9083
9084 mark_reg_unknown(env, regs, BPF_REG_0);
9085
9086 regs[BPF_REG_0].subreg_def = env->insn_idx + 1;
9087 return 0;
9088}
9089
9090static int check_return_code(struct bpf_verifier_env *env)
9091{
9092 struct tnum enforce_attach_type_range = tnum_unknown;
9093 const struct bpf_prog *prog = env->prog;
9094 struct bpf_reg_state *reg;
9095 struct tnum range = tnum_range(0, 1);
9096 enum bpf_prog_type prog_type = resolve_prog_type(env->prog);
9097 int err;
9098 const bool is_subprog = env->cur_state->frame[0]->subprogno;
9099
9100
9101 if (!is_subprog &&
9102 (prog_type == BPF_PROG_TYPE_STRUCT_OPS ||
9103 prog_type == BPF_PROG_TYPE_LSM) &&
9104 !prog->aux->attach_func_proto->type)
9105 return 0;
9106
9107
9108
9109
9110
9111
9112
9113 err = check_reg_arg(env, BPF_REG_0, SRC_OP);
9114 if (err)
9115 return err;
9116
9117 if (is_pointer_value(env, BPF_REG_0)) {
9118 verbose(env, "R0 leaks addr as return value\n");
9119 return -EACCES;
9120 }
9121
9122 reg = cur_regs(env) + BPF_REG_0;
9123 if (is_subprog) {
9124 if (reg->type != SCALAR_VALUE) {
9125 verbose(env, "At subprogram exit the register R0 is not a scalar value (%s)\n",
9126 reg_type_str[reg->type]);
9127 return -EINVAL;
9128 }
9129 return 0;
9130 }
9131
9132 switch (prog_type) {
9133 case BPF_PROG_TYPE_CGROUP_SOCK_ADDR:
9134 if (env->prog->expected_attach_type == BPF_CGROUP_UDP4_RECVMSG ||
9135 env->prog->expected_attach_type == BPF_CGROUP_UDP6_RECVMSG ||
9136 env->prog->expected_attach_type == BPF_CGROUP_INET4_GETPEERNAME ||
9137 env->prog->expected_attach_type == BPF_CGROUP_INET6_GETPEERNAME ||
9138 env->prog->expected_attach_type == BPF_CGROUP_INET4_GETSOCKNAME ||
9139 env->prog->expected_attach_type == BPF_CGROUP_INET6_GETSOCKNAME)
9140 range = tnum_range(1, 1);
9141 if (env->prog->expected_attach_type == BPF_CGROUP_INET4_BIND ||
9142 env->prog->expected_attach_type == BPF_CGROUP_INET6_BIND)
9143 range = tnum_range(0, 3);
9144 break;
9145 case BPF_PROG_TYPE_CGROUP_SKB:
9146 if (env->prog->expected_attach_type == BPF_CGROUP_INET_EGRESS) {
9147 range = tnum_range(0, 3);
9148 enforce_attach_type_range = tnum_range(2, 3);
9149 }
9150 break;
9151 case BPF_PROG_TYPE_CGROUP_SOCK:
9152 case BPF_PROG_TYPE_SOCK_OPS:
9153 case BPF_PROG_TYPE_CGROUP_DEVICE:
9154 case BPF_PROG_TYPE_CGROUP_SYSCTL:
9155 case BPF_PROG_TYPE_CGROUP_SOCKOPT:
9156 break;
9157 case BPF_PROG_TYPE_RAW_TRACEPOINT:
9158 if (!env->prog->aux->attach_btf_id)
9159 return 0;
9160 range = tnum_const(0);
9161 break;
9162 case BPF_PROG_TYPE_TRACING:
9163 switch (env->prog->expected_attach_type) {
9164 case BPF_TRACE_FENTRY:
9165 case BPF_TRACE_FEXIT:
9166 range = tnum_const(0);
9167 break;
9168 case BPF_TRACE_RAW_TP:
9169 case BPF_MODIFY_RETURN:
9170 return 0;
9171 case BPF_TRACE_ITER:
9172 break;
9173 default:
9174 return -ENOTSUPP;
9175 }
9176 break;
9177 case BPF_PROG_TYPE_SK_LOOKUP:
9178 range = tnum_range(SK_DROP, SK_PASS);
9179 break;
9180 case BPF_PROG_TYPE_EXT:
9181
9182
9183
9184 default:
9185 return 0;
9186 }
9187
9188 if (reg->type != SCALAR_VALUE) {
9189 verbose(env, "At program exit the register R0 is not a known value (%s)\n",
9190 reg_type_str[reg->type]);
9191 return -EINVAL;
9192 }
9193
9194 if (!tnum_in(range, reg->var_off)) {
9195 verbose_invalid_scalar(env, reg, &range, "program exit", "R0");
9196 return -EINVAL;
9197 }
9198
9199 if (!tnum_is_unknown(enforce_attach_type_range) &&
9200 tnum_in(enforce_attach_type_range, reg->var_off))
9201 env->prog->enforce_expected_attach_type = 1;
9202 return 0;
9203}
9204
9205
9206
9207
9208
9209
9210
9211
9212
9213
9214
9215
9216
9217
9218
9219
9220
9221
9222
9223
9224
9225
9226
9227
9228
9229
9230
9231
9232
9233
9234
9235
9236
9237
9238enum {
9239 DISCOVERED = 0x10,
9240 EXPLORED = 0x20,
9241 FALLTHROUGH = 1,
9242 BRANCH = 2,
9243};
9244
9245static u32 state_htab_size(struct bpf_verifier_env *env)
9246{
9247 return env->prog->len;
9248}
9249
9250static struct bpf_verifier_state_list **explored_state(
9251 struct bpf_verifier_env *env,
9252 int idx)
9253{
9254 struct bpf_verifier_state *cur = env->cur_state;
9255 struct bpf_func_state *state = cur->frame[cur->curframe];
9256
9257 return &env->explored_states[(idx ^ state->callsite) % state_htab_size(env)];
9258}
9259
9260static void init_explored_state(struct bpf_verifier_env *env, int idx)
9261{
9262 env->insn_aux_data[idx].prune_point = true;
9263}
9264
9265enum {
9266 DONE_EXPLORING = 0,
9267 KEEP_EXPLORING = 1,
9268};
9269
9270
9271
9272
9273
9274
9275static int push_insn(int t, int w, int e, struct bpf_verifier_env *env,
9276 bool loop_ok)
9277{
9278 int *insn_stack = env->cfg.insn_stack;
9279 int *insn_state = env->cfg.insn_state;
9280
9281 if (e == FALLTHROUGH && insn_state[t] >= (DISCOVERED | FALLTHROUGH))
9282 return DONE_EXPLORING;
9283
9284 if (e == BRANCH && insn_state[t] >= (DISCOVERED | BRANCH))
9285 return DONE_EXPLORING;
9286
9287 if (w < 0 || w >= env->prog->len) {
9288 verbose_linfo(env, t, "%d: ", t);
9289 verbose(env, "jump out of range from insn %d to %d\n", t, w);
9290 return -EINVAL;
9291 }
9292
9293 if (e == BRANCH)
9294
9295 init_explored_state(env, w);
9296
9297 if (insn_state[w] == 0) {
9298
9299 insn_state[t] = DISCOVERED | e;
9300 insn_state[w] = DISCOVERED;
9301 if (env->cfg.cur_stack >= env->prog->len)
9302 return -E2BIG;
9303 insn_stack[env->cfg.cur_stack++] = w;
9304 return KEEP_EXPLORING;
9305 } else if ((insn_state[w] & 0xF0) == DISCOVERED) {
9306 if (loop_ok && env->bpf_capable)
9307 return DONE_EXPLORING;
9308 verbose_linfo(env, t, "%d: ", t);
9309 verbose_linfo(env, w, "%d: ", w);
9310 verbose(env, "back-edge from insn %d to %d\n", t, w);
9311 return -EINVAL;
9312 } else if (insn_state[w] == EXPLORED) {
9313
9314 insn_state[t] = DISCOVERED | e;
9315 } else {
9316 verbose(env, "insn state internal bug\n");
9317 return -EFAULT;
9318 }
9319 return DONE_EXPLORING;
9320}
9321
9322static int visit_func_call_insn(int t, int insn_cnt,
9323 struct bpf_insn *insns,
9324 struct bpf_verifier_env *env,
9325 bool visit_callee)
9326{
9327 int ret;
9328
9329 ret = push_insn(t, t + 1, FALLTHROUGH, env, false);
9330 if (ret)
9331 return ret;
9332
9333 if (t + 1 < insn_cnt)
9334 init_explored_state(env, t + 1);
9335 if (visit_callee) {
9336 init_explored_state(env, t);
9337 ret = push_insn(t, t + insns[t].imm + 1, BRANCH,
9338 env, false);
9339 }
9340 return ret;
9341}
9342
9343
9344
9345
9346
9347
9348static int visit_insn(int t, int insn_cnt, struct bpf_verifier_env *env)
9349{
9350 struct bpf_insn *insns = env->prog->insnsi;
9351 int ret;
9352
9353 if (bpf_pseudo_func(insns + t))
9354 return visit_func_call_insn(t, insn_cnt, insns, env, true);
9355
9356
9357 if (BPF_CLASS(insns[t].code) != BPF_JMP &&
9358 BPF_CLASS(insns[t].code) != BPF_JMP32)
9359 return push_insn(t, t + 1, FALLTHROUGH, env, false);
9360
9361 switch (BPF_OP(insns[t].code)) {
9362 case BPF_EXIT:
9363 return DONE_EXPLORING;
9364
9365 case BPF_CALL:
9366 return visit_func_call_insn(t, insn_cnt, insns, env,
9367 insns[t].src_reg == BPF_PSEUDO_CALL);
9368
9369 case BPF_JA:
9370 if (BPF_SRC(insns[t].code) != BPF_K)
9371 return -EINVAL;
9372
9373
9374 ret = push_insn(t, t + insns[t].off + 1, FALLTHROUGH, env,
9375 true);
9376 if (ret)
9377 return ret;
9378
9379
9380
9381
9382
9383 init_explored_state(env, t + insns[t].off + 1);
9384
9385
9386
9387 if (t + 1 < insn_cnt)
9388 init_explored_state(env, t + 1);
9389
9390 return ret;
9391
9392 default:
9393
9394 init_explored_state(env, t);
9395 ret = push_insn(t, t + 1, FALLTHROUGH, env, true);
9396 if (ret)
9397 return ret;
9398
9399 return push_insn(t, t + insns[t].off + 1, BRANCH, env, true);
9400 }
9401}
9402
9403
9404
9405
9406static int check_cfg(struct bpf_verifier_env *env)
9407{
9408 int insn_cnt = env->prog->len;
9409 int *insn_stack, *insn_state;
9410 int ret = 0;
9411 int i;
9412
9413 insn_state = env->cfg.insn_state = kvcalloc(insn_cnt, sizeof(int), GFP_KERNEL);
9414 if (!insn_state)
9415 return -ENOMEM;
9416
9417 insn_stack = env->cfg.insn_stack = kvcalloc(insn_cnt, sizeof(int), GFP_KERNEL);
9418 if (!insn_stack) {
9419 kvfree(insn_state);
9420 return -ENOMEM;
9421 }
9422
9423 insn_state[0] = DISCOVERED;
9424 insn_stack[0] = 0;
9425 env->cfg.cur_stack = 1;
9426
9427 while (env->cfg.cur_stack > 0) {
9428 int t = insn_stack[env->cfg.cur_stack - 1];
9429
9430 ret = visit_insn(t, insn_cnt, env);
9431 switch (ret) {
9432 case DONE_EXPLORING:
9433 insn_state[t] = EXPLORED;
9434 env->cfg.cur_stack--;
9435 break;
9436 case KEEP_EXPLORING:
9437 break;
9438 default:
9439 if (ret > 0) {
9440 verbose(env, "visit_insn internal bug\n");
9441 ret = -EFAULT;
9442 }
9443 goto err_free;
9444 }
9445 }
9446
9447 if (env->cfg.cur_stack < 0) {
9448 verbose(env, "pop stack internal bug\n");
9449 ret = -EFAULT;
9450 goto err_free;
9451 }
9452
9453 for (i = 0; i < insn_cnt; i++) {
9454 if (insn_state[i] != EXPLORED) {
9455 verbose(env, "unreachable insn %d\n", i);
9456 ret = -EINVAL;
9457 goto err_free;
9458 }
9459 }
9460 ret = 0;
9461
9462err_free:
9463 kvfree(insn_state);
9464 kvfree(insn_stack);
9465 env->cfg.insn_state = env->cfg.insn_stack = NULL;
9466 return ret;
9467}
9468
9469static int check_abnormal_return(struct bpf_verifier_env *env)
9470{
9471 int i;
9472
9473 for (i = 1; i < env->subprog_cnt; i++) {
9474 if (env->subprog_info[i].has_ld_abs) {
9475 verbose(env, "LD_ABS is not allowed in subprogs without BTF\n");
9476 return -EINVAL;
9477 }
9478 if (env->subprog_info[i].has_tail_call) {
9479 verbose(env, "tail_call is not allowed in subprogs without BTF\n");
9480 return -EINVAL;
9481 }
9482 }
9483 return 0;
9484}
9485
9486
9487#define MIN_BPF_FUNCINFO_SIZE 8
9488#define MAX_FUNCINFO_REC_SIZE 252
9489
9490static int check_btf_func(struct bpf_verifier_env *env,
9491 const union bpf_attr *attr,
9492 union bpf_attr __user *uattr)
9493{
9494 const struct btf_type *type, *func_proto, *ret_type;
9495 u32 i, nfuncs, urec_size, min_size;
9496 u32 krec_size = sizeof(struct bpf_func_info);
9497 struct bpf_func_info *krecord;
9498 struct bpf_func_info_aux *info_aux = NULL;
9499 struct bpf_prog *prog;
9500 const struct btf *btf;
9501 void __user *urecord;
9502 u32 prev_offset = 0;
9503 bool scalar_return;
9504 int ret = -ENOMEM;
9505
9506 nfuncs = attr->func_info_cnt;
9507 if (!nfuncs) {
9508 if (check_abnormal_return(env))
9509 return -EINVAL;
9510 return 0;
9511 }
9512
9513 if (nfuncs != env->subprog_cnt) {
9514 verbose(env, "number of funcs in func_info doesn't match number of subprogs\n");
9515 return -EINVAL;
9516 }
9517
9518 urec_size = attr->func_info_rec_size;
9519 if (urec_size < MIN_BPF_FUNCINFO_SIZE ||
9520 urec_size > MAX_FUNCINFO_REC_SIZE ||
9521 urec_size % sizeof(u32)) {
9522 verbose(env, "invalid func info rec size %u\n", urec_size);
9523 return -EINVAL;
9524 }
9525
9526 prog = env->prog;
9527 btf = prog->aux->btf;
9528
9529 urecord = u64_to_user_ptr(attr->func_info);
9530 min_size = min_t(u32, krec_size, urec_size);
9531
9532 krecord = kvcalloc(nfuncs, krec_size, GFP_KERNEL | __GFP_NOWARN);
9533 if (!krecord)
9534 return -ENOMEM;
9535 info_aux = kcalloc(nfuncs, sizeof(*info_aux), GFP_KERNEL | __GFP_NOWARN);
9536 if (!info_aux)
9537 goto err_free;
9538
9539 for (i = 0; i < nfuncs; i++) {
9540 ret = bpf_check_uarg_tail_zero(urecord, krec_size, urec_size);
9541 if (ret) {
9542 if (ret == -E2BIG) {
9543 verbose(env, "nonzero tailing record in func info");
9544
9545
9546
9547 if (put_user(min_size, &uattr->func_info_rec_size))
9548 ret = -EFAULT;
9549 }
9550 goto err_free;
9551 }
9552
9553 if (copy_from_user(&krecord[i], urecord, min_size)) {
9554 ret = -EFAULT;
9555 goto err_free;
9556 }
9557
9558
9559 ret = -EINVAL;
9560 if (i == 0) {
9561 if (krecord[i].insn_off) {
9562 verbose(env,
9563 "nonzero insn_off %u for the first func info record",
9564 krecord[i].insn_off);
9565 goto err_free;
9566 }
9567 } else if (krecord[i].insn_off <= prev_offset) {
9568 verbose(env,
9569 "same or smaller insn offset (%u) than previous func info record (%u)",
9570 krecord[i].insn_off, prev_offset);
9571 goto err_free;
9572 }
9573
9574 if (env->subprog_info[i].start != krecord[i].insn_off) {
9575 verbose(env, "func_info BTF section doesn't match subprog layout in BPF program\n");
9576 goto err_free;
9577 }
9578
9579
9580 type = btf_type_by_id(btf, krecord[i].type_id);
9581 if (!type || !btf_type_is_func(type)) {
9582 verbose(env, "invalid type id %d in func info",
9583 krecord[i].type_id);
9584 goto err_free;
9585 }
9586 info_aux[i].linkage = BTF_INFO_VLEN(type->info);
9587
9588 func_proto = btf_type_by_id(btf, type->type);
9589 if (unlikely(!func_proto || !btf_type_is_func_proto(func_proto)))
9590
9591 goto err_free;
9592 ret_type = btf_type_skip_modifiers(btf, func_proto->type, NULL);
9593 scalar_return =
9594 btf_type_is_small_int(ret_type) || btf_type_is_enum(ret_type);
9595 if (i && !scalar_return && env->subprog_info[i].has_ld_abs) {
9596 verbose(env, "LD_ABS is only allowed in functions that return 'int'.\n");
9597 goto err_free;
9598 }
9599 if (i && !scalar_return && env->subprog_info[i].has_tail_call) {
9600 verbose(env, "tail_call is only allowed in functions that return 'int'.\n");
9601 goto err_free;
9602 }
9603
9604 prev_offset = krecord[i].insn_off;
9605 urecord += urec_size;
9606 }
9607
9608 prog->aux->func_info = krecord;
9609 prog->aux->func_info_cnt = nfuncs;
9610 prog->aux->func_info_aux = info_aux;
9611 return 0;
9612
9613err_free:
9614 kvfree(krecord);
9615 kfree(info_aux);
9616 return ret;
9617}
9618
9619static void adjust_btf_func(struct bpf_verifier_env *env)
9620{
9621 struct bpf_prog_aux *aux = env->prog->aux;
9622 int i;
9623
9624 if (!aux->func_info)
9625 return;
9626
9627 for (i = 0; i < env->subprog_cnt; i++)
9628 aux->func_info[i].insn_off = env->subprog_info[i].start;
9629}
9630
9631#define MIN_BPF_LINEINFO_SIZE (offsetof(struct bpf_line_info, line_col) + \
9632 sizeof(((struct bpf_line_info *)(0))->line_col))
9633#define MAX_LINEINFO_REC_SIZE MAX_FUNCINFO_REC_SIZE
9634
9635static int check_btf_line(struct bpf_verifier_env *env,
9636 const union bpf_attr *attr,
9637 union bpf_attr __user *uattr)
9638{
9639 u32 i, s, nr_linfo, ncopy, expected_size, rec_size, prev_offset = 0;
9640 struct bpf_subprog_info *sub;
9641 struct bpf_line_info *linfo;
9642 struct bpf_prog *prog;
9643 const struct btf *btf;
9644 void __user *ulinfo;
9645 int err;
9646
9647 nr_linfo = attr->line_info_cnt;
9648 if (!nr_linfo)
9649 return 0;
9650
9651 rec_size = attr->line_info_rec_size;
9652 if (rec_size < MIN_BPF_LINEINFO_SIZE ||
9653 rec_size > MAX_LINEINFO_REC_SIZE ||
9654 rec_size & (sizeof(u32) - 1))
9655 return -EINVAL;
9656
9657
9658
9659
9660 linfo = kvcalloc(nr_linfo, sizeof(struct bpf_line_info),
9661 GFP_KERNEL | __GFP_NOWARN);
9662 if (!linfo)
9663 return -ENOMEM;
9664
9665 prog = env->prog;
9666 btf = prog->aux->btf;
9667
9668 s = 0;
9669 sub = env->subprog_info;
9670 ulinfo = u64_to_user_ptr(attr->line_info);
9671 expected_size = sizeof(struct bpf_line_info);
9672 ncopy = min_t(u32, expected_size, rec_size);
9673 for (i = 0; i < nr_linfo; i++) {
9674 err = bpf_check_uarg_tail_zero(ulinfo, expected_size, rec_size);
9675 if (err) {
9676 if (err == -E2BIG) {
9677 verbose(env, "nonzero tailing record in line_info");
9678 if (put_user(expected_size,
9679 &uattr->line_info_rec_size))
9680 err = -EFAULT;
9681 }
9682 goto err_free;
9683 }
9684
9685 if (copy_from_user(&linfo[i], ulinfo, ncopy)) {
9686 err = -EFAULT;
9687 goto err_free;
9688 }
9689
9690
9691
9692
9693
9694
9695
9696
9697
9698
9699
9700
9701 if ((i && linfo[i].insn_off <= prev_offset) ||
9702 linfo[i].insn_off >= prog->len) {
9703 verbose(env, "Invalid line_info[%u].insn_off:%u (prev_offset:%u prog->len:%u)\n",
9704 i, linfo[i].insn_off, prev_offset,
9705 prog->len);
9706 err = -EINVAL;
9707 goto err_free;
9708 }
9709
9710 if (!prog->insnsi[linfo[i].insn_off].code) {
9711 verbose(env,
9712 "Invalid insn code at line_info[%u].insn_off\n",
9713 i);
9714 err = -EINVAL;
9715 goto err_free;
9716 }
9717
9718 if (!btf_name_by_offset(btf, linfo[i].line_off) ||
9719 !btf_name_by_offset(btf, linfo[i].file_name_off)) {
9720 verbose(env, "Invalid line_info[%u].line_off or .file_name_off\n", i);
9721 err = -EINVAL;
9722 goto err_free;
9723 }
9724
9725 if (s != env->subprog_cnt) {
9726 if (linfo[i].insn_off == sub[s].start) {
9727 sub[s].linfo_idx = i;
9728 s++;
9729 } else if (sub[s].start < linfo[i].insn_off) {
9730 verbose(env, "missing bpf_line_info for func#%u\n", s);
9731 err = -EINVAL;
9732 goto err_free;
9733 }
9734 }
9735
9736 prev_offset = linfo[i].insn_off;
9737 ulinfo += rec_size;
9738 }
9739
9740 if (s != env->subprog_cnt) {
9741 verbose(env, "missing bpf_line_info for %u funcs starting from func#%u\n",
9742 env->subprog_cnt - s, s);
9743 err = -EINVAL;
9744 goto err_free;
9745 }
9746
9747 prog->aux->linfo = linfo;
9748 prog->aux->nr_linfo = nr_linfo;
9749
9750 return 0;
9751
9752err_free:
9753 kvfree(linfo);
9754 return err;
9755}
9756
9757static int check_btf_info(struct bpf_verifier_env *env,
9758 const union bpf_attr *attr,
9759 union bpf_attr __user *uattr)
9760{
9761 struct btf *btf;
9762 int err;
9763
9764 if (!attr->func_info_cnt && !attr->line_info_cnt) {
9765 if (check_abnormal_return(env))
9766 return -EINVAL;
9767 return 0;
9768 }
9769
9770 btf = btf_get_by_fd(attr->prog_btf_fd);
9771 if (IS_ERR(btf))
9772 return PTR_ERR(btf);
9773 if (btf_is_kernel(btf)) {
9774 btf_put(btf);
9775 return -EACCES;
9776 }
9777 env->prog->aux->btf = btf;
9778
9779 err = check_btf_func(env, attr, uattr);
9780 if (err)
9781 return err;
9782
9783 err = check_btf_line(env, attr, uattr);
9784 if (err)
9785 return err;
9786
9787 return 0;
9788}
9789
9790
9791static bool range_within(struct bpf_reg_state *old,
9792 struct bpf_reg_state *cur)
9793{
9794 return old->umin_value <= cur->umin_value &&
9795 old->umax_value >= cur->umax_value &&
9796 old->smin_value <= cur->smin_value &&
9797 old->smax_value >= cur->smax_value &&
9798 old->u32_min_value <= cur->u32_min_value &&
9799 old->u32_max_value >= cur->u32_max_value &&
9800 old->s32_min_value <= cur->s32_min_value &&
9801 old->s32_max_value >= cur->s32_max_value;
9802}
9803
9804
9805#define ID_MAP_SIZE (MAX_BPF_REG + MAX_BPF_STACK / BPF_REG_SIZE)
9806struct idpair {
9807 u32 old;
9808 u32 cur;
9809};
9810
9811
9812
9813
9814
9815
9816
9817
9818
9819
9820
9821static bool check_ids(u32 old_id, u32 cur_id, struct idpair *idmap)
9822{
9823 unsigned int i;
9824
9825 for (i = 0; i < ID_MAP_SIZE; i++) {
9826 if (!idmap[i].old) {
9827
9828 idmap[i].old = old_id;
9829 idmap[i].cur = cur_id;
9830 return true;
9831 }
9832 if (idmap[i].old == old_id)
9833 return idmap[i].cur == cur_id;
9834 }
9835
9836 WARN_ON_ONCE(1);
9837 return false;
9838}
9839
9840static void clean_func_state(struct bpf_verifier_env *env,
9841 struct bpf_func_state *st)
9842{
9843 enum bpf_reg_liveness live;
9844 int i, j;
9845
9846 for (i = 0; i < BPF_REG_FP; i++) {
9847 live = st->regs[i].live;
9848
9849 st->regs[i].live |= REG_LIVE_DONE;
9850 if (!(live & REG_LIVE_READ))
9851
9852
9853
9854 __mark_reg_not_init(env, &st->regs[i]);
9855 }
9856
9857 for (i = 0; i < st->allocated_stack / BPF_REG_SIZE; i++) {
9858 live = st->stack[i].spilled_ptr.live;
9859
9860 st->stack[i].spilled_ptr.live |= REG_LIVE_DONE;
9861 if (!(live & REG_LIVE_READ)) {
9862 __mark_reg_not_init(env, &st->stack[i].spilled_ptr);
9863 for (j = 0; j < BPF_REG_SIZE; j++)
9864 st->stack[i].slot_type[j] = STACK_INVALID;
9865 }
9866 }
9867}
9868
9869static void clean_verifier_state(struct bpf_verifier_env *env,
9870 struct bpf_verifier_state *st)
9871{
9872 int i;
9873
9874 if (st->frame[0]->regs[0].live & REG_LIVE_DONE)
9875
9876 return;
9877
9878 for (i = 0; i <= st->curframe; i++)
9879 clean_func_state(env, st->frame[i]);
9880}
9881
9882
9883
9884
9885
9886
9887
9888
9889
9890
9891
9892
9893
9894
9895
9896
9897
9898
9899
9900
9901
9902
9903
9904
9905
9906
9907
9908
9909
9910
9911
9912
9913
9914static void clean_live_states(struct bpf_verifier_env *env, int insn,
9915 struct bpf_verifier_state *cur)
9916{
9917 struct bpf_verifier_state_list *sl;
9918 int i;
9919
9920 sl = *explored_state(env, insn);
9921 while (sl) {
9922 if (sl->state.branches)
9923 goto next;
9924 if (sl->state.insn_idx != insn ||
9925 sl->state.curframe != cur->curframe)
9926 goto next;
9927 for (i = 0; i <= cur->curframe; i++)
9928 if (sl->state.frame[i]->callsite != cur->frame[i]->callsite)
9929 goto next;
9930 clean_verifier_state(env, &sl->state);
9931next:
9932 sl = sl->next;
9933 }
9934}
9935
9936
9937static bool regsafe(struct bpf_reg_state *rold, struct bpf_reg_state *rcur,
9938 struct idpair *idmap)
9939{
9940 bool equal;
9941
9942 if (!(rold->live & REG_LIVE_READ))
9943
9944 return true;
9945
9946 equal = memcmp(rold, rcur, offsetof(struct bpf_reg_state, parent)) == 0;
9947
9948 if (rold->type == PTR_TO_STACK)
9949
9950
9951
9952 return equal && rold->frameno == rcur->frameno;
9953
9954 if (equal)
9955 return true;
9956
9957 if (rold->type == NOT_INIT)
9958
9959 return true;
9960 if (rcur->type == NOT_INIT)
9961 return false;
9962 switch (rold->type) {
9963 case SCALAR_VALUE:
9964 if (rcur->type == SCALAR_VALUE) {
9965 if (!rold->precise && !rcur->precise)
9966 return true;
9967
9968 return range_within(rold, rcur) &&
9969 tnum_in(rold->var_off, rcur->var_off);
9970 } else {
9971
9972
9973
9974
9975
9976
9977
9978 return false;
9979 }
9980 case PTR_TO_MAP_KEY:
9981 case PTR_TO_MAP_VALUE:
9982
9983
9984
9985
9986
9987
9988
9989
9990 return memcmp(rold, rcur, offsetof(struct bpf_reg_state, id)) == 0 &&
9991 range_within(rold, rcur) &&
9992 tnum_in(rold->var_off, rcur->var_off);
9993 case PTR_TO_MAP_VALUE_OR_NULL:
9994
9995
9996
9997
9998
9999
10000
10001 if (rcur->type != PTR_TO_MAP_VALUE_OR_NULL)
10002 return false;
10003 if (memcmp(rold, rcur, offsetof(struct bpf_reg_state, id)))
10004 return false;
10005
10006 return check_ids(rold->id, rcur->id, idmap);
10007 case PTR_TO_PACKET_META:
10008 case PTR_TO_PACKET:
10009 if (rcur->type != rold->type)
10010 return false;
10011
10012
10013
10014
10015
10016
10017 if (rold->range > rcur->range)
10018 return false;
10019
10020
10021
10022 if (rold->off != rcur->off)
10023 return false;
10024
10025 if (rold->id && !check_ids(rold->id, rcur->id, idmap))
10026 return false;
10027
10028 return range_within(rold, rcur) &&
10029 tnum_in(rold->var_off, rcur->var_off);
10030 case PTR_TO_CTX:
10031 case CONST_PTR_TO_MAP:
10032 case PTR_TO_PACKET_END:
10033 case PTR_TO_FLOW_KEYS:
10034 case PTR_TO_SOCKET:
10035 case PTR_TO_SOCKET_OR_NULL:
10036 case PTR_TO_SOCK_COMMON:
10037 case PTR_TO_SOCK_COMMON_OR_NULL:
10038 case PTR_TO_TCP_SOCK:
10039 case PTR_TO_TCP_SOCK_OR_NULL:
10040 case PTR_TO_XDP_SOCK:
10041
10042
10043
10044 default:
10045
10046 return false;
10047 }
10048
10049
10050 WARN_ON_ONCE(1);
10051 return false;
10052}
10053
10054static bool stacksafe(struct bpf_func_state *old,
10055 struct bpf_func_state *cur,
10056 struct idpair *idmap)
10057{
10058 int i, spi;
10059
10060
10061
10062
10063
10064 for (i = 0; i < old->allocated_stack; i++) {
10065 spi = i / BPF_REG_SIZE;
10066
10067 if (!(old->stack[spi].spilled_ptr.live & REG_LIVE_READ)) {
10068 i += BPF_REG_SIZE - 1;
10069
10070 continue;
10071 }
10072
10073 if (old->stack[spi].slot_type[i % BPF_REG_SIZE] == STACK_INVALID)
10074 continue;
10075
10076
10077
10078
10079 if (i >= cur->allocated_stack)
10080 return false;
10081
10082
10083
10084
10085
10086 if (old->stack[spi].slot_type[i % BPF_REG_SIZE] == STACK_MISC &&
10087 cur->stack[spi].slot_type[i % BPF_REG_SIZE] == STACK_ZERO)
10088 continue;
10089 if (old->stack[spi].slot_type[i % BPF_REG_SIZE] !=
10090 cur->stack[spi].slot_type[i % BPF_REG_SIZE])
10091
10092
10093
10094
10095
10096 return false;
10097 if (i % BPF_REG_SIZE)
10098 continue;
10099 if (old->stack[spi].slot_type[0] != STACK_SPILL)
10100 continue;
10101 if (!regsafe(&old->stack[spi].spilled_ptr,
10102 &cur->stack[spi].spilled_ptr,
10103 idmap))
10104
10105
10106
10107
10108
10109
10110
10111
10112
10113
10114 return false;
10115 }
10116 return true;
10117}
10118
10119static bool refsafe(struct bpf_func_state *old, struct bpf_func_state *cur)
10120{
10121 if (old->acquired_refs != cur->acquired_refs)
10122 return false;
10123 return !memcmp(old->refs, cur->refs,
10124 sizeof(*old->refs) * old->acquired_refs);
10125}
10126
10127
10128
10129
10130
10131
10132
10133
10134
10135
10136
10137
10138
10139
10140
10141
10142
10143
10144
10145
10146
10147
10148
10149
10150
10151
10152
10153static bool func_states_equal(struct bpf_func_state *old,
10154 struct bpf_func_state *cur)
10155{
10156 struct idpair *idmap;
10157 bool ret = false;
10158 int i;
10159
10160 idmap = kcalloc(ID_MAP_SIZE, sizeof(struct idpair), GFP_KERNEL);
10161
10162 if (!idmap)
10163 return false;
10164
10165 for (i = 0; i < MAX_BPF_REG; i++) {
10166 if (!regsafe(&old->regs[i], &cur->regs[i], idmap))
10167 goto out_free;
10168 }
10169
10170 if (!stacksafe(old, cur, idmap))
10171 goto out_free;
10172
10173 if (!refsafe(old, cur))
10174 goto out_free;
10175 ret = true;
10176out_free:
10177 kfree(idmap);
10178 return ret;
10179}
10180
10181static bool states_equal(struct bpf_verifier_env *env,
10182 struct bpf_verifier_state *old,
10183 struct bpf_verifier_state *cur)
10184{
10185 int i;
10186
10187 if (old->curframe != cur->curframe)
10188 return false;
10189
10190
10191
10192
10193 if (old->speculative && !cur->speculative)
10194 return false;
10195
10196 if (old->active_spin_lock != cur->active_spin_lock)
10197 return false;
10198
10199
10200
10201
10202 for (i = 0; i <= old->curframe; i++) {
10203 if (old->frame[i]->callsite != cur->frame[i]->callsite)
10204 return false;
10205 if (!func_states_equal(old->frame[i], cur->frame[i]))
10206 return false;
10207 }
10208 return true;
10209}
10210
10211
10212
10213
10214static int propagate_liveness_reg(struct bpf_verifier_env *env,
10215 struct bpf_reg_state *reg,
10216 struct bpf_reg_state *parent_reg)
10217{
10218 u8 parent_flag = parent_reg->live & REG_LIVE_READ;
10219 u8 flag = reg->live & REG_LIVE_READ;
10220 int err;
10221
10222
10223
10224
10225
10226 if (parent_flag == REG_LIVE_READ64 ||
10227
10228 !flag ||
10229
10230 parent_flag == flag)
10231 return 0;
10232
10233 err = mark_reg_read(env, reg, parent_reg, flag);
10234 if (err)
10235 return err;
10236
10237 return flag;
10238}
10239
10240
10241
10242
10243
10244
10245
10246
10247static int propagate_liveness(struct bpf_verifier_env *env,
10248 const struct bpf_verifier_state *vstate,
10249 struct bpf_verifier_state *vparent)
10250{
10251 struct bpf_reg_state *state_reg, *parent_reg;
10252 struct bpf_func_state *state, *parent;
10253 int i, frame, err = 0;
10254
10255 if (vparent->curframe != vstate->curframe) {
10256 WARN(1, "propagate_live: parent frame %d current frame %d\n",
10257 vparent->curframe, vstate->curframe);
10258 return -EFAULT;
10259 }
10260
10261 BUILD_BUG_ON(BPF_REG_FP + 1 != MAX_BPF_REG);
10262 for (frame = 0; frame <= vstate->curframe; frame++) {
10263 parent = vparent->frame[frame];
10264 state = vstate->frame[frame];
10265 parent_reg = parent->regs;
10266 state_reg = state->regs;
10267
10268 for (i = frame < vstate->curframe ? BPF_REG_6 : 0; i < BPF_REG_FP; i++) {
10269 err = propagate_liveness_reg(env, &state_reg[i],
10270 &parent_reg[i]);
10271 if (err < 0)
10272 return err;
10273 if (err == REG_LIVE_READ64)
10274 mark_insn_zext(env, &parent_reg[i]);
10275 }
10276
10277
10278 for (i = 0; i < state->allocated_stack / BPF_REG_SIZE &&
10279 i < parent->allocated_stack / BPF_REG_SIZE; i++) {
10280 parent_reg = &parent->stack[i].spilled_ptr;
10281 state_reg = &state->stack[i].spilled_ptr;
10282 err = propagate_liveness_reg(env, state_reg,
10283 parent_reg);
10284 if (err < 0)
10285 return err;
10286 }
10287 }
10288 return 0;
10289}
10290
10291
10292
10293
10294static int propagate_precision(struct bpf_verifier_env *env,
10295 const struct bpf_verifier_state *old)
10296{
10297 struct bpf_reg_state *state_reg;
10298 struct bpf_func_state *state;
10299 int i, err = 0;
10300
10301 state = old->frame[old->curframe];
10302 state_reg = state->regs;
10303 for (i = 0; i < BPF_REG_FP; i++, state_reg++) {
10304 if (state_reg->type != SCALAR_VALUE ||
10305 !state_reg->precise)
10306 continue;
10307 if (env->log.level & BPF_LOG_LEVEL2)
10308 verbose(env, "propagating r%d\n", i);
10309 err = mark_chain_precision(env, i);
10310 if (err < 0)
10311 return err;
10312 }
10313
10314 for (i = 0; i < state->allocated_stack / BPF_REG_SIZE; i++) {
10315 if (state->stack[i].slot_type[0] != STACK_SPILL)
10316 continue;
10317 state_reg = &state->stack[i].spilled_ptr;
10318 if (state_reg->type != SCALAR_VALUE ||
10319 !state_reg->precise)
10320 continue;
10321 if (env->log.level & BPF_LOG_LEVEL2)
10322 verbose(env, "propagating fp%d\n",
10323 (-i - 1) * BPF_REG_SIZE);
10324 err = mark_chain_precision_stack(env, i);
10325 if (err < 0)
10326 return err;
10327 }
10328 return 0;
10329}
10330
10331static bool states_maybe_looping(struct bpf_verifier_state *old,
10332 struct bpf_verifier_state *cur)
10333{
10334 struct bpf_func_state *fold, *fcur;
10335 int i, fr = cur->curframe;
10336
10337 if (old->curframe != fr)
10338 return false;
10339
10340 fold = old->frame[fr];
10341 fcur = cur->frame[fr];
10342 for (i = 0; i < MAX_BPF_REG; i++)
10343 if (memcmp(&fold->regs[i], &fcur->regs[i],
10344 offsetof(struct bpf_reg_state, parent)))
10345 return false;
10346 return true;
10347}
10348
10349
10350static int is_state_visited(struct bpf_verifier_env *env, int insn_idx)
10351{
10352 struct bpf_verifier_state_list *new_sl;
10353 struct bpf_verifier_state_list *sl, **pprev;
10354 struct bpf_verifier_state *cur = env->cur_state, *new;
10355 int i, j, err, states_cnt = 0;
10356 bool add_new_state = env->test_state_freq ? true : false;
10357
10358 cur->last_insn_idx = env->prev_insn_idx;
10359 if (!env->insn_aux_data[insn_idx].prune_point)
10360
10361
10362
10363 return 0;
10364
10365
10366
10367
10368
10369
10370
10371
10372
10373 if (env->jmps_processed - env->prev_jmps_processed >= 2 &&
10374 env->insn_processed - env->prev_insn_processed >= 8)
10375 add_new_state = true;
10376
10377 pprev = explored_state(env, insn_idx);
10378 sl = *pprev;
10379
10380 clean_live_states(env, insn_idx, cur);
10381
10382 while (sl) {
10383 states_cnt++;
10384 if (sl->state.insn_idx != insn_idx)
10385 goto next;
10386 if (sl->state.branches) {
10387 if (states_maybe_looping(&sl->state, cur) &&
10388 states_equal(env, &sl->state, cur)) {
10389 verbose_linfo(env, insn_idx, "; ");
10390 verbose(env, "infinite loop detected at insn %d\n", insn_idx);
10391 return -EINVAL;
10392 }
10393
10394
10395
10396
10397
10398
10399
10400
10401
10402
10403
10404
10405 if (env->jmps_processed - env->prev_jmps_processed < 20 &&
10406 env->insn_processed - env->prev_insn_processed < 100)
10407 add_new_state = false;
10408 goto miss;
10409 }
10410 if (states_equal(env, &sl->state, cur)) {
10411 sl->hit_cnt++;
10412
10413
10414
10415
10416
10417
10418
10419
10420
10421
10422 err = propagate_liveness(env, &sl->state, cur);
10423
10424
10425
10426
10427
10428
10429 err = err ? : push_jmp_history(env, cur);
10430 err = err ? : propagate_precision(env, &sl->state);
10431 if (err)
10432 return err;
10433 return 1;
10434 }
10435miss:
10436
10437
10438
10439
10440
10441
10442 if (add_new_state)
10443 sl->miss_cnt++;
10444
10445
10446
10447
10448
10449 if (sl->miss_cnt > sl->hit_cnt * 3 + 3) {
10450
10451
10452
10453 *pprev = sl->next;
10454 if (sl->state.frame[0]->regs[0].live & REG_LIVE_DONE) {
10455 u32 br = sl->state.branches;
10456
10457 WARN_ONCE(br,
10458 "BUG live_done but branches_to_explore %d\n",
10459 br);
10460 free_verifier_state(&sl->state, false);
10461 kfree(sl);
10462 env->peak_states--;
10463 } else {
10464
10465
10466
10467
10468 sl->next = env->free_list;
10469 env->free_list = sl;
10470 }
10471 sl = *pprev;
10472 continue;
10473 }
10474next:
10475 pprev = &sl->next;
10476 sl = *pprev;
10477 }
10478
10479 if (env->max_states_per_insn < states_cnt)
10480 env->max_states_per_insn = states_cnt;
10481
10482 if (!env->bpf_capable && states_cnt > BPF_COMPLEXITY_LIMIT_STATES)
10483 return push_jmp_history(env, cur);
10484
10485 if (!add_new_state)
10486 return push_jmp_history(env, cur);
10487
10488
10489
10490
10491
10492
10493
10494
10495
10496
10497 new_sl = kzalloc(sizeof(struct bpf_verifier_state_list), GFP_KERNEL);
10498 if (!new_sl)
10499 return -ENOMEM;
10500 env->total_states++;
10501 env->peak_states++;
10502 env->prev_jmps_processed = env->jmps_processed;
10503 env->prev_insn_processed = env->insn_processed;
10504
10505
10506 new = &new_sl->state;
10507 err = copy_verifier_state(new, cur);
10508 if (err) {
10509 free_verifier_state(new, false);
10510 kfree(new_sl);
10511 return err;
10512 }
10513 new->insn_idx = insn_idx;
10514 WARN_ONCE(new->branches != 1,
10515 "BUG is_state_visited:branches_to_explore=%d insn %d\n", new->branches, insn_idx);
10516
10517 cur->parent = new;
10518 cur->first_insn_idx = insn_idx;
10519 clear_jmp_history(cur);
10520 new_sl->next = *explored_state(env, insn_idx);
10521 *explored_state(env, insn_idx) = new_sl;
10522
10523
10524
10525
10526
10527
10528
10529
10530
10531
10532
10533
10534
10535 for (j = 0; j <= cur->curframe; j++) {
10536 for (i = j < cur->curframe ? BPF_REG_6 : 0; i < BPF_REG_FP; i++)
10537 cur->frame[j]->regs[i].parent = &new->frame[j]->regs[i];
10538 for (i = 0; i < BPF_REG_FP; i++)
10539 cur->frame[j]->regs[i].live = REG_LIVE_NONE;
10540 }
10541
10542
10543 for (j = 0; j <= cur->curframe; j++) {
10544 struct bpf_func_state *frame = cur->frame[j];
10545 struct bpf_func_state *newframe = new->frame[j];
10546
10547 for (i = 0; i < frame->allocated_stack / BPF_REG_SIZE; i++) {
10548 frame->stack[i].spilled_ptr.live = REG_LIVE_NONE;
10549 frame->stack[i].spilled_ptr.parent =
10550 &newframe->stack[i].spilled_ptr;
10551 }
10552 }
10553 return 0;
10554}
10555
10556
10557static bool reg_type_mismatch_ok(enum bpf_reg_type type)
10558{
10559 switch (type) {
10560 case PTR_TO_CTX:
10561 case PTR_TO_SOCKET:
10562 case PTR_TO_SOCKET_OR_NULL:
10563 case PTR_TO_SOCK_COMMON:
10564 case PTR_TO_SOCK_COMMON_OR_NULL:
10565 case PTR_TO_TCP_SOCK:
10566 case PTR_TO_TCP_SOCK_OR_NULL:
10567 case PTR_TO_XDP_SOCK:
10568 case PTR_TO_BTF_ID:
10569 case PTR_TO_BTF_ID_OR_NULL:
10570 return false;
10571 default:
10572 return true;
10573 }
10574}
10575
10576
10577
10578
10579
10580
10581
10582
10583
10584
10585
10586
10587
10588static bool reg_type_mismatch(enum bpf_reg_type src, enum bpf_reg_type prev)
10589{
10590 return src != prev && (!reg_type_mismatch_ok(src) ||
10591 !reg_type_mismatch_ok(prev));
10592}
10593
10594static int do_check(struct bpf_verifier_env *env)
10595{
10596 bool pop_log = !(env->log.level & BPF_LOG_LEVEL2);
10597 struct bpf_verifier_state *state = env->cur_state;
10598 struct bpf_insn *insns = env->prog->insnsi;
10599 struct bpf_reg_state *regs;
10600 int insn_cnt = env->prog->len;
10601 bool do_print_state = false;
10602 int prev_insn_idx = -1;
10603
10604 for (;;) {
10605 struct bpf_insn *insn;
10606 u8 class;
10607 int err;
10608
10609 env->prev_insn_idx = prev_insn_idx;
10610 if (env->insn_idx >= insn_cnt) {
10611 verbose(env, "invalid insn idx %d insn_cnt %d\n",
10612 env->insn_idx, insn_cnt);
10613 return -EFAULT;
10614 }
10615
10616 insn = &insns[env->insn_idx];
10617 class = BPF_CLASS(insn->code);
10618
10619 if (++env->insn_processed > BPF_COMPLEXITY_LIMIT_INSNS) {
10620 verbose(env,
10621 "BPF program is too large. Processed %d insn\n",
10622 env->insn_processed);
10623 return -E2BIG;
10624 }
10625
10626 err = is_state_visited(env, env->insn_idx);
10627 if (err < 0)
10628 return err;
10629 if (err == 1) {
10630
10631 if (env->log.level & BPF_LOG_LEVEL) {
10632 if (do_print_state)
10633 verbose(env, "\nfrom %d to %d%s: safe\n",
10634 env->prev_insn_idx, env->insn_idx,
10635 env->cur_state->speculative ?
10636 " (speculative execution)" : "");
10637 else
10638 verbose(env, "%d: safe\n", env->insn_idx);
10639 }
10640 goto process_bpf_exit;
10641 }
10642
10643 if (signal_pending(current))
10644 return -EAGAIN;
10645
10646 if (need_resched())
10647 cond_resched();
10648
10649 if (env->log.level & BPF_LOG_LEVEL2 ||
10650 (env->log.level & BPF_LOG_LEVEL && do_print_state)) {
10651 if (env->log.level & BPF_LOG_LEVEL2)
10652 verbose(env, "%d:", env->insn_idx);
10653 else
10654 verbose(env, "\nfrom %d to %d%s:",
10655 env->prev_insn_idx, env->insn_idx,
10656 env->cur_state->speculative ?
10657 " (speculative execution)" : "");
10658 print_verifier_state(env, state->frame[state->curframe]);
10659 do_print_state = false;
10660 }
10661
10662 if (env->log.level & BPF_LOG_LEVEL) {
10663 const struct bpf_insn_cbs cbs = {
10664 .cb_call = disasm_kfunc_name,
10665 .cb_print = verbose,
10666 .private_data = env,
10667 };
10668
10669 verbose_linfo(env, env->insn_idx, "; ");
10670 verbose(env, "%d: ", env->insn_idx);
10671 print_bpf_insn(&cbs, insn, env->allow_ptr_leaks);
10672 }
10673
10674 if (bpf_prog_is_dev_bound(env->prog->aux)) {
10675 err = bpf_prog_offload_verify_insn(env, env->insn_idx,
10676 env->prev_insn_idx);
10677 if (err)
10678 return err;
10679 }
10680
10681 regs = cur_regs(env);
10682 sanitize_mark_insn_seen(env);
10683 prev_insn_idx = env->insn_idx;
10684
10685 if (class == BPF_ALU || class == BPF_ALU64) {
10686 err = check_alu_op(env, insn);
10687 if (err)
10688 return err;
10689
10690 } else if (class == BPF_LDX) {
10691 enum bpf_reg_type *prev_src_type, src_reg_type;
10692
10693
10694
10695
10696 err = check_reg_arg(env, insn->src_reg, SRC_OP);
10697 if (err)
10698 return err;
10699
10700 err = check_reg_arg(env, insn->dst_reg, DST_OP_NO_MARK);
10701 if (err)
10702 return err;
10703
10704 src_reg_type = regs[insn->src_reg].type;
10705
10706
10707
10708
10709 err = check_mem_access(env, env->insn_idx, insn->src_reg,
10710 insn->off, BPF_SIZE(insn->code),
10711 BPF_READ, insn->dst_reg, false);
10712 if (err)
10713 return err;
10714
10715 prev_src_type = &env->insn_aux_data[env->insn_idx].ptr_type;
10716
10717 if (*prev_src_type == NOT_INIT) {
10718
10719
10720
10721
10722 *prev_src_type = src_reg_type;
10723
10724 } else if (reg_type_mismatch(src_reg_type, *prev_src_type)) {
10725
10726
10727
10728
10729
10730
10731
10732 verbose(env, "same insn cannot be used with different pointers\n");
10733 return -EINVAL;
10734 }
10735
10736 } else if (class == BPF_STX) {
10737 enum bpf_reg_type *prev_dst_type, dst_reg_type;
10738
10739 if (BPF_MODE(insn->code) == BPF_ATOMIC) {
10740 err = check_atomic(env, env->insn_idx, insn);
10741 if (err)
10742 return err;
10743 env->insn_idx++;
10744 continue;
10745 }
10746
10747 if (BPF_MODE(insn->code) != BPF_MEM || insn->imm != 0) {
10748 verbose(env, "BPF_STX uses reserved fields\n");
10749 return -EINVAL;
10750 }
10751
10752
10753 err = check_reg_arg(env, insn->src_reg, SRC_OP);
10754 if (err)
10755 return err;
10756
10757 err = check_reg_arg(env, insn->dst_reg, SRC_OP);
10758 if (err)
10759 return err;
10760
10761 dst_reg_type = regs[insn->dst_reg].type;
10762
10763
10764 err = check_mem_access(env, env->insn_idx, insn->dst_reg,
10765 insn->off, BPF_SIZE(insn->code),
10766 BPF_WRITE, insn->src_reg, false);
10767 if (err)
10768 return err;
10769
10770 prev_dst_type = &env->insn_aux_data[env->insn_idx].ptr_type;
10771
10772 if (*prev_dst_type == NOT_INIT) {
10773 *prev_dst_type = dst_reg_type;
10774 } else if (reg_type_mismatch(dst_reg_type, *prev_dst_type)) {
10775 verbose(env, "same insn cannot be used with different pointers\n");
10776 return -EINVAL;
10777 }
10778
10779 } else if (class == BPF_ST) {
10780 if (BPF_MODE(insn->code) != BPF_MEM ||
10781 insn->src_reg != BPF_REG_0) {
10782 verbose(env, "BPF_ST uses reserved fields\n");
10783 return -EINVAL;
10784 }
10785
10786 err = check_reg_arg(env, insn->dst_reg, SRC_OP);
10787 if (err)
10788 return err;
10789
10790 if (is_ctx_reg(env, insn->dst_reg)) {
10791 verbose(env, "BPF_ST stores into R%d %s is not allowed\n",
10792 insn->dst_reg,
10793 reg_type_str[reg_state(env, insn->dst_reg)->type]);
10794 return -EACCES;
10795 }
10796
10797
10798 err = check_mem_access(env, env->insn_idx, insn->dst_reg,
10799 insn->off, BPF_SIZE(insn->code),
10800 BPF_WRITE, -1, false);
10801 if (err)
10802 return err;
10803
10804 } else if (class == BPF_JMP || class == BPF_JMP32) {
10805 u8 opcode = BPF_OP(insn->code);
10806
10807 env->jmps_processed++;
10808 if (opcode == BPF_CALL) {
10809 if (BPF_SRC(insn->code) != BPF_K ||
10810 insn->off != 0 ||
10811 (insn->src_reg != BPF_REG_0 &&
10812 insn->src_reg != BPF_PSEUDO_CALL &&
10813 insn->src_reg != BPF_PSEUDO_KFUNC_CALL) ||
10814 insn->dst_reg != BPF_REG_0 ||
10815 class == BPF_JMP32) {
10816 verbose(env, "BPF_CALL uses reserved fields\n");
10817 return -EINVAL;
10818 }
10819
10820 if (env->cur_state->active_spin_lock &&
10821 (insn->src_reg == BPF_PSEUDO_CALL ||
10822 insn->imm != BPF_FUNC_spin_unlock)) {
10823 verbose(env, "function calls are not allowed while holding a lock\n");
10824 return -EINVAL;
10825 }
10826 if (insn->src_reg == BPF_PSEUDO_CALL)
10827 err = check_func_call(env, insn, &env->insn_idx);
10828 else if (insn->src_reg == BPF_PSEUDO_KFUNC_CALL)
10829 err = check_kfunc_call(env, insn);
10830 else
10831 err = check_helper_call(env, insn, &env->insn_idx);
10832 if (err)
10833 return err;
10834 } else if (opcode == BPF_JA) {
10835 if (BPF_SRC(insn->code) != BPF_K ||
10836 insn->imm != 0 ||
10837 insn->src_reg != BPF_REG_0 ||
10838 insn->dst_reg != BPF_REG_0 ||
10839 class == BPF_JMP32) {
10840 verbose(env, "BPF_JA uses reserved fields\n");
10841 return -EINVAL;
10842 }
10843
10844 env->insn_idx += insn->off + 1;
10845 continue;
10846
10847 } else if (opcode == BPF_EXIT) {
10848 if (BPF_SRC(insn->code) != BPF_K ||
10849 insn->imm != 0 ||
10850 insn->src_reg != BPF_REG_0 ||
10851 insn->dst_reg != BPF_REG_0 ||
10852 class == BPF_JMP32) {
10853 verbose(env, "BPF_EXIT uses reserved fields\n");
10854 return -EINVAL;
10855 }
10856
10857 if (env->cur_state->active_spin_lock) {
10858 verbose(env, "bpf_spin_unlock is missing\n");
10859 return -EINVAL;
10860 }
10861
10862 if (state->curframe) {
10863
10864 err = prepare_func_exit(env, &env->insn_idx);
10865 if (err)
10866 return err;
10867 do_print_state = true;
10868 continue;
10869 }
10870
10871 err = check_reference_leak(env);
10872 if (err)
10873 return err;
10874
10875 err = check_return_code(env);
10876 if (err)
10877 return err;
10878process_bpf_exit:
10879 update_branch_counts(env, env->cur_state);
10880 err = pop_stack(env, &prev_insn_idx,
10881 &env->insn_idx, pop_log);
10882 if (err < 0) {
10883 if (err != -ENOENT)
10884 return err;
10885 break;
10886 } else {
10887 do_print_state = true;
10888 continue;
10889 }
10890 } else {
10891 err = check_cond_jmp_op(env, insn, &env->insn_idx);
10892 if (err)
10893 return err;
10894 }
10895 } else if (class == BPF_LD) {
10896 u8 mode = BPF_MODE(insn->code);
10897
10898 if (mode == BPF_ABS || mode == BPF_IND) {
10899 err = check_ld_abs(env, insn);
10900 if (err)
10901 return err;
10902
10903 } else if (mode == BPF_IMM) {
10904 err = check_ld_imm(env, insn);
10905 if (err)
10906 return err;
10907
10908 env->insn_idx++;
10909 sanitize_mark_insn_seen(env);
10910 } else {
10911 verbose(env, "invalid BPF_LD mode\n");
10912 return -EINVAL;
10913 }
10914 } else {
10915 verbose(env, "unknown insn class %d\n", class);
10916 return -EINVAL;
10917 }
10918
10919 env->insn_idx++;
10920 }
10921
10922 return 0;
10923}
10924
10925static int find_btf_percpu_datasec(struct btf *btf)
10926{
10927 const struct btf_type *t;
10928 const char *tname;
10929 int i, n;
10930
10931
10932
10933
10934
10935
10936 n = btf_nr_types(btf);
10937 if (btf_is_module(btf))
10938 i = btf_nr_types(btf_vmlinux);
10939 else
10940 i = 1;
10941
10942 for(; i < n; i++) {
10943 t = btf_type_by_id(btf, i);
10944 if (BTF_INFO_KIND(t->info) != BTF_KIND_DATASEC)
10945 continue;
10946
10947 tname = btf_name_by_offset(btf, t->name_off);
10948 if (!strcmp(tname, ".data..percpu"))
10949 return i;
10950 }
10951
10952 return -ENOENT;
10953}
10954
10955
10956static int check_pseudo_btf_id(struct bpf_verifier_env *env,
10957 struct bpf_insn *insn,
10958 struct bpf_insn_aux_data *aux)
10959{
10960 const struct btf_var_secinfo *vsi;
10961 const struct btf_type *datasec;
10962 struct btf_mod_pair *btf_mod;
10963 const struct btf_type *t;
10964 const char *sym_name;
10965 bool percpu = false;
10966 u32 type, id = insn->imm;
10967 struct btf *btf;
10968 s32 datasec_id;
10969 u64 addr;
10970 int i, btf_fd, err;
10971
10972 btf_fd = insn[1].imm;
10973 if (btf_fd) {
10974 btf = btf_get_by_fd(btf_fd);
10975 if (IS_ERR(btf)) {
10976 verbose(env, "invalid module BTF object FD specified.\n");
10977 return -EINVAL;
10978 }
10979 } else {
10980 if (!btf_vmlinux) {
10981 verbose(env, "kernel is missing BTF, make sure CONFIG_DEBUG_INFO_BTF=y is specified in Kconfig.\n");
10982 return -EINVAL;
10983 }
10984 btf = btf_vmlinux;
10985 btf_get(btf);
10986 }
10987
10988 t = btf_type_by_id(btf, id);
10989 if (!t) {
10990 verbose(env, "ldimm64 insn specifies invalid btf_id %d.\n", id);
10991 err = -ENOENT;
10992 goto err_put;
10993 }
10994
10995 if (!btf_type_is_var(t)) {
10996 verbose(env, "pseudo btf_id %d in ldimm64 isn't KIND_VAR.\n", id);
10997 err = -EINVAL;
10998 goto err_put;
10999 }
11000
11001 sym_name = btf_name_by_offset(btf, t->name_off);
11002 addr = kallsyms_lookup_name(sym_name);
11003 if (!addr) {
11004 verbose(env, "ldimm64 failed to find the address for kernel symbol '%s'.\n",
11005 sym_name);
11006 err = -ENOENT;
11007 goto err_put;
11008 }
11009
11010 datasec_id = find_btf_percpu_datasec(btf);
11011 if (datasec_id > 0) {
11012 datasec = btf_type_by_id(btf, datasec_id);
11013 for_each_vsi(i, datasec, vsi) {
11014 if (vsi->type == id) {
11015 percpu = true;
11016 break;
11017 }
11018 }
11019 }
11020
11021 insn[0].imm = (u32)addr;
11022 insn[1].imm = addr >> 32;
11023
11024 type = t->type;
11025 t = btf_type_skip_modifiers(btf, type, NULL);
11026 if (percpu) {
11027 aux->btf_var.reg_type = PTR_TO_PERCPU_BTF_ID;
11028 aux->btf_var.btf = btf;
11029 aux->btf_var.btf_id = type;
11030 } else if (!btf_type_is_struct(t)) {
11031 const struct btf_type *ret;
11032 const char *tname;
11033 u32 tsize;
11034
11035
11036 ret = btf_resolve_size(btf, t, &tsize);
11037 if (IS_ERR(ret)) {
11038 tname = btf_name_by_offset(btf, t->name_off);
11039 verbose(env, "ldimm64 unable to resolve the size of type '%s': %ld\n",
11040 tname, PTR_ERR(ret));
11041 err = -EINVAL;
11042 goto err_put;
11043 }
11044 aux->btf_var.reg_type = PTR_TO_MEM;
11045 aux->btf_var.mem_size = tsize;
11046 } else {
11047 aux->btf_var.reg_type = PTR_TO_BTF_ID;
11048 aux->btf_var.btf = btf;
11049 aux->btf_var.btf_id = type;
11050 }
11051
11052
11053 for (i = 0; i < env->used_btf_cnt; i++) {
11054 if (env->used_btfs[i].btf == btf) {
11055 btf_put(btf);
11056 return 0;
11057 }
11058 }
11059
11060 if (env->used_btf_cnt >= MAX_USED_BTFS) {
11061 err = -E2BIG;
11062 goto err_put;
11063 }
11064
11065 btf_mod = &env->used_btfs[env->used_btf_cnt];
11066 btf_mod->btf = btf;
11067 btf_mod->module = NULL;
11068
11069
11070 if (btf_is_module(btf)) {
11071 btf_mod->module = btf_try_get_module(btf);
11072 if (!btf_mod->module) {
11073 err = -ENXIO;
11074 goto err_put;
11075 }
11076 }
11077
11078 env->used_btf_cnt++;
11079
11080 return 0;
11081err_put:
11082 btf_put(btf);
11083 return err;
11084}
11085
11086static int check_map_prealloc(struct bpf_map *map)
11087{
11088 return (map->map_type != BPF_MAP_TYPE_HASH &&
11089 map->map_type != BPF_MAP_TYPE_PERCPU_HASH &&
11090 map->map_type != BPF_MAP_TYPE_HASH_OF_MAPS) ||
11091 !(map->map_flags & BPF_F_NO_PREALLOC);
11092}
11093
11094static bool is_tracing_prog_type(enum bpf_prog_type type)
11095{
11096 switch (type) {
11097 case BPF_PROG_TYPE_KPROBE:
11098 case BPF_PROG_TYPE_TRACEPOINT:
11099 case BPF_PROG_TYPE_PERF_EVENT:
11100 case BPF_PROG_TYPE_RAW_TRACEPOINT:
11101 return true;
11102 default:
11103 return false;
11104 }
11105}
11106
11107static bool is_preallocated_map(struct bpf_map *map)
11108{
11109 if (!check_map_prealloc(map))
11110 return false;
11111 if (map->inner_map_meta && !check_map_prealloc(map->inner_map_meta))
11112 return false;
11113 return true;
11114}
11115
11116static int check_map_prog_compatibility(struct bpf_verifier_env *env,
11117 struct bpf_map *map,
11118 struct bpf_prog *prog)
11119
11120{
11121 enum bpf_prog_type prog_type = resolve_prog_type(prog);
11122
11123
11124
11125
11126
11127
11128
11129
11130
11131
11132
11133
11134
11135
11136
11137
11138
11139 if (is_tracing_prog_type(prog_type) && !is_preallocated_map(map)) {
11140 if (prog_type == BPF_PROG_TYPE_PERF_EVENT) {
11141 verbose(env, "perf_event programs can only use preallocated hash map\n");
11142 return -EINVAL;
11143 }
11144 if (IS_ENABLED(CONFIG_PREEMPT_RT)) {
11145 verbose(env, "trace type programs can only use preallocated hash map\n");
11146 return -EINVAL;
11147 }
11148 WARN_ONCE(1, "trace type BPF program uses run-time allocation\n");
11149 verbose(env, "trace type programs with run-time allocated hash maps are unsafe. Switch to preallocated hash maps.\n");
11150 }
11151
11152 if (map_value_has_spin_lock(map)) {
11153 if (prog_type == BPF_PROG_TYPE_SOCKET_FILTER) {
11154 verbose(env, "socket filter progs cannot use bpf_spin_lock yet\n");
11155 return -EINVAL;
11156 }
11157
11158 if (is_tracing_prog_type(prog_type)) {
11159 verbose(env, "tracing progs cannot use bpf_spin_lock yet\n");
11160 return -EINVAL;
11161 }
11162
11163 if (prog->aux->sleepable) {
11164 verbose(env, "sleepable progs cannot use bpf_spin_lock yet\n");
11165 return -EINVAL;
11166 }
11167 }
11168
11169 if ((bpf_prog_is_dev_bound(prog->aux) || bpf_map_is_dev_bound(map)) &&
11170 !bpf_offload_prog_map_match(prog, map)) {
11171 verbose(env, "offload device mismatch between prog and map\n");
11172 return -EINVAL;
11173 }
11174
11175 if (map->map_type == BPF_MAP_TYPE_STRUCT_OPS) {
11176 verbose(env, "bpf_struct_ops map cannot be used in prog\n");
11177 return -EINVAL;
11178 }
11179
11180 if (prog->aux->sleepable)
11181 switch (map->map_type) {
11182 case BPF_MAP_TYPE_HASH:
11183 case BPF_MAP_TYPE_LRU_HASH:
11184 case BPF_MAP_TYPE_ARRAY:
11185 case BPF_MAP_TYPE_PERCPU_HASH:
11186 case BPF_MAP_TYPE_PERCPU_ARRAY:
11187 case BPF_MAP_TYPE_LRU_PERCPU_HASH:
11188 case BPF_MAP_TYPE_ARRAY_OF_MAPS:
11189 case BPF_MAP_TYPE_HASH_OF_MAPS:
11190 if (!is_preallocated_map(map)) {
11191 verbose(env,
11192 "Sleepable programs can only use preallocated maps\n");
11193 return -EINVAL;
11194 }
11195 break;
11196 case BPF_MAP_TYPE_RINGBUF:
11197 break;
11198 default:
11199 verbose(env,
11200 "Sleepable programs can only use array, hash, and ringbuf maps\n");
11201 return -EINVAL;
11202 }
11203
11204 return 0;
11205}
11206
11207static bool bpf_map_is_cgroup_storage(struct bpf_map *map)
11208{
11209 return (map->map_type == BPF_MAP_TYPE_CGROUP_STORAGE ||
11210 map->map_type == BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE);
11211}
11212
11213
11214
11215
11216
11217
11218
11219
11220static int resolve_pseudo_ldimm64(struct bpf_verifier_env *env)
11221{
11222 struct bpf_insn *insn = env->prog->insnsi;
11223 int insn_cnt = env->prog->len;
11224 int i, j, err;
11225
11226 err = bpf_prog_calc_tag(env->prog);
11227 if (err)
11228 return err;
11229
11230 for (i = 0; i < insn_cnt; i++, insn++) {
11231 if (BPF_CLASS(insn->code) == BPF_LDX &&
11232 (BPF_MODE(insn->code) != BPF_MEM || insn->imm != 0)) {
11233 verbose(env, "BPF_LDX uses reserved fields\n");
11234 return -EINVAL;
11235 }
11236
11237 if (insn[0].code == (BPF_LD | BPF_IMM | BPF_DW)) {
11238 struct bpf_insn_aux_data *aux;
11239 struct bpf_map *map;
11240 struct fd f;
11241 u64 addr;
11242
11243 if (i == insn_cnt - 1 || insn[1].code != 0 ||
11244 insn[1].dst_reg != 0 || insn[1].src_reg != 0 ||
11245 insn[1].off != 0) {
11246 verbose(env, "invalid bpf_ld_imm64 insn\n");
11247 return -EINVAL;
11248 }
11249
11250 if (insn[0].src_reg == 0)
11251
11252 goto next_insn;
11253
11254 if (insn[0].src_reg == BPF_PSEUDO_BTF_ID) {
11255 aux = &env->insn_aux_data[i];
11256 err = check_pseudo_btf_id(env, insn, aux);
11257 if (err)
11258 return err;
11259 goto next_insn;
11260 }
11261
11262 if (insn[0].src_reg == BPF_PSEUDO_FUNC) {
11263 aux = &env->insn_aux_data[i];
11264 aux->ptr_type = PTR_TO_FUNC;
11265 goto next_insn;
11266 }
11267
11268
11269
11270
11271 if ((insn[0].src_reg != BPF_PSEUDO_MAP_FD &&
11272 insn[0].src_reg != BPF_PSEUDO_MAP_VALUE) ||
11273 (insn[0].src_reg == BPF_PSEUDO_MAP_FD &&
11274 insn[1].imm != 0)) {
11275 verbose(env,
11276 "unrecognized bpf_ld_imm64 insn\n");
11277 return -EINVAL;
11278 }
11279
11280 f = fdget(insn[0].imm);
11281 map = __bpf_map_get(f);
11282 if (IS_ERR(map)) {
11283 verbose(env, "fd %d is not pointing to valid bpf_map\n",
11284 insn[0].imm);
11285 return PTR_ERR(map);
11286 }
11287
11288 err = check_map_prog_compatibility(env, map, env->prog);
11289 if (err) {
11290 fdput(f);
11291 return err;
11292 }
11293
11294 aux = &env->insn_aux_data[i];
11295 if (insn->src_reg == BPF_PSEUDO_MAP_FD) {
11296 addr = (unsigned long)map;
11297 } else {
11298 u32 off = insn[1].imm;
11299
11300 if (off >= BPF_MAX_VAR_OFF) {
11301 verbose(env, "direct value offset of %u is not allowed\n", off);
11302 fdput(f);
11303 return -EINVAL;
11304 }
11305
11306 if (!map->ops->map_direct_value_addr) {
11307 verbose(env, "no direct value access support for this map type\n");
11308 fdput(f);
11309 return -EINVAL;
11310 }
11311
11312 err = map->ops->map_direct_value_addr(map, &addr, off);
11313 if (err) {
11314 verbose(env, "invalid access to map value pointer, value_size=%u off=%u\n",
11315 map->value_size, off);
11316 fdput(f);
11317 return err;
11318 }
11319
11320 aux->map_off = off;
11321 addr += off;
11322 }
11323
11324 insn[0].imm = (u32)addr;
11325 insn[1].imm = addr >> 32;
11326
11327
11328 for (j = 0; j < env->used_map_cnt; j++) {
11329 if (env->used_maps[j] == map) {
11330 aux->map_index = j;
11331 fdput(f);
11332 goto next_insn;
11333 }
11334 }
11335
11336 if (env->used_map_cnt >= MAX_USED_MAPS) {
11337 fdput(f);
11338 return -E2BIG;
11339 }
11340
11341
11342
11343
11344
11345
11346 bpf_map_inc(map);
11347
11348 aux->map_index = env->used_map_cnt;
11349 env->used_maps[env->used_map_cnt++] = map;
11350
11351 if (bpf_map_is_cgroup_storage(map) &&
11352 bpf_cgroup_storage_assign(env->prog->aux, map)) {
11353 verbose(env, "only one cgroup storage of each type is allowed\n");
11354 fdput(f);
11355 return -EBUSY;
11356 }
11357
11358 fdput(f);
11359next_insn:
11360 insn++;
11361 i++;
11362 continue;
11363 }
11364
11365
11366 if (!bpf_opcode_in_insntable(insn->code)) {
11367 verbose(env, "unknown opcode %02x\n", insn->code);
11368 return -EINVAL;
11369 }
11370 }
11371
11372
11373
11374
11375
11376 return 0;
11377}
11378
11379
11380static void release_maps(struct bpf_verifier_env *env)
11381{
11382 __bpf_free_used_maps(env->prog->aux, env->used_maps,
11383 env->used_map_cnt);
11384}
11385
11386
11387static void release_btfs(struct bpf_verifier_env *env)
11388{
11389 __bpf_free_used_btfs(env->prog->aux, env->used_btfs,
11390 env->used_btf_cnt);
11391}
11392
11393
11394static void convert_pseudo_ld_imm64(struct bpf_verifier_env *env)
11395{
11396 struct bpf_insn *insn = env->prog->insnsi;
11397 int insn_cnt = env->prog->len;
11398 int i;
11399
11400 for (i = 0; i < insn_cnt; i++, insn++) {
11401 if (insn->code != (BPF_LD | BPF_IMM | BPF_DW))
11402 continue;
11403 if (insn->src_reg == BPF_PSEUDO_FUNC)
11404 continue;
11405 insn->src_reg = 0;
11406 }
11407}
11408
11409
11410
11411
11412
11413static int adjust_insn_aux_data(struct bpf_verifier_env *env,
11414 struct bpf_prog *new_prog, u32 off, u32 cnt)
11415{
11416 struct bpf_insn_aux_data *new_data, *old_data = env->insn_aux_data;
11417 struct bpf_insn *insn = new_prog->insnsi;
11418 u32 old_seen = old_data[off].seen;
11419 u32 prog_len;
11420 int i;
11421
11422
11423
11424
11425
11426 old_data[off].zext_dst = insn_has_def32(env, insn + off + cnt - 1);
11427
11428 if (cnt == 1)
11429 return 0;
11430 prog_len = new_prog->len;
11431 new_data = vzalloc(array_size(prog_len,
11432 sizeof(struct bpf_insn_aux_data)));
11433 if (!new_data)
11434 return -ENOMEM;
11435 memcpy(new_data, old_data, sizeof(struct bpf_insn_aux_data) * off);
11436 memcpy(new_data + off + cnt - 1, old_data + off,
11437 sizeof(struct bpf_insn_aux_data) * (prog_len - off - cnt + 1));
11438 for (i = off; i < off + cnt - 1; i++) {
11439
11440 new_data[i].seen = old_seen;
11441 new_data[i].zext_dst = insn_has_def32(env, insn + i);
11442 }
11443 env->insn_aux_data = new_data;
11444 vfree(old_data);
11445 return 0;
11446}
11447
11448static void adjust_subprog_starts(struct bpf_verifier_env *env, u32 off, u32 len)
11449{
11450 int i;
11451
11452 if (len == 1)
11453 return;
11454
11455 for (i = 0; i <= env->subprog_cnt; i++) {
11456 if (env->subprog_info[i].start <= off)
11457 continue;
11458 env->subprog_info[i].start += len - 1;
11459 }
11460}
11461
11462static void adjust_poke_descs(struct bpf_prog *prog, u32 len)
11463{
11464 struct bpf_jit_poke_descriptor *tab = prog->aux->poke_tab;
11465 int i, sz = prog->aux->size_poke_tab;
11466 struct bpf_jit_poke_descriptor *desc;
11467
11468 for (i = 0; i < sz; i++) {
11469 desc = &tab[i];
11470 desc->insn_idx += len - 1;
11471 }
11472}
11473
11474static struct bpf_prog *bpf_patch_insn_data(struct bpf_verifier_env *env, u32 off,
11475 const struct bpf_insn *patch, u32 len)
11476{
11477 struct bpf_prog *new_prog;
11478
11479 new_prog = bpf_patch_insn_single(env->prog, off, patch, len);
11480 if (IS_ERR(new_prog)) {
11481 if (PTR_ERR(new_prog) == -ERANGE)
11482 verbose(env,
11483 "insn %d cannot be patched due to 16-bit range\n",
11484 env->insn_aux_data[off].orig_idx);
11485 return NULL;
11486 }
11487 if (adjust_insn_aux_data(env, new_prog, off, len))
11488 return NULL;
11489 adjust_subprog_starts(env, off, len);
11490 adjust_poke_descs(new_prog, len);
11491 return new_prog;
11492}
11493
11494static int adjust_subprog_starts_after_remove(struct bpf_verifier_env *env,
11495 u32 off, u32 cnt)
11496{
11497 int i, j;
11498
11499
11500 for (i = 0; i < env->subprog_cnt; i++)
11501 if (env->subprog_info[i].start >= off)
11502 break;
11503
11504 for (j = i; j < env->subprog_cnt; j++)
11505 if (env->subprog_info[j].start >= off + cnt)
11506 break;
11507
11508
11509
11510 if (env->subprog_info[j].start != off + cnt)
11511 j--;
11512
11513 if (j > i) {
11514 struct bpf_prog_aux *aux = env->prog->aux;
11515 int move;
11516
11517
11518 move = env->subprog_cnt + 1 - j;
11519
11520 memmove(env->subprog_info + i,
11521 env->subprog_info + j,
11522 sizeof(*env->subprog_info) * move);
11523 env->subprog_cnt -= j - i;
11524
11525
11526 if (aux->func_info) {
11527 move = aux->func_info_cnt - j;
11528
11529 memmove(aux->func_info + i,
11530 aux->func_info + j,
11531 sizeof(*aux->func_info) * move);
11532 aux->func_info_cnt -= j - i;
11533
11534
11535
11536 }
11537 } else {
11538
11539 if (env->subprog_info[i].start == off)
11540 i++;
11541 }
11542
11543
11544 for (; i <= env->subprog_cnt; i++)
11545 env->subprog_info[i].start -= cnt;
11546
11547 return 0;
11548}
11549
11550static int bpf_adj_linfo_after_remove(struct bpf_verifier_env *env, u32 off,
11551 u32 cnt)
11552{
11553 struct bpf_prog *prog = env->prog;
11554 u32 i, l_off, l_cnt, nr_linfo;
11555 struct bpf_line_info *linfo;
11556
11557 nr_linfo = prog->aux->nr_linfo;
11558 if (!nr_linfo)
11559 return 0;
11560
11561 linfo = prog->aux->linfo;
11562
11563
11564 for (i = 0; i < nr_linfo; i++)
11565 if (linfo[i].insn_off >= off)
11566 break;
11567
11568 l_off = i;
11569 l_cnt = 0;
11570 for (; i < nr_linfo; i++)
11571 if (linfo[i].insn_off < off + cnt)
11572 l_cnt++;
11573 else
11574 break;
11575
11576
11577
11578
11579
11580 if (prog->len != off && l_cnt &&
11581 (i == nr_linfo || linfo[i].insn_off != off + cnt)) {
11582 l_cnt--;
11583 linfo[--i].insn_off = off + cnt;
11584 }
11585
11586
11587 if (l_cnt) {
11588 memmove(linfo + l_off, linfo + i,
11589 sizeof(*linfo) * (nr_linfo - i));
11590
11591 prog->aux->nr_linfo -= l_cnt;
11592 nr_linfo = prog->aux->nr_linfo;
11593 }
11594
11595
11596 for (i = l_off; i < nr_linfo; i++)
11597 linfo[i].insn_off -= cnt;
11598
11599
11600 for (i = 0; i <= env->subprog_cnt; i++)
11601 if (env->subprog_info[i].linfo_idx > l_off) {
11602
11603
11604
11605 if (env->subprog_info[i].linfo_idx >= l_off + l_cnt)
11606 env->subprog_info[i].linfo_idx -= l_cnt;
11607 else
11608 env->subprog_info[i].linfo_idx = l_off;
11609 }
11610
11611 return 0;
11612}
11613
11614static int verifier_remove_insns(struct bpf_verifier_env *env, u32 off, u32 cnt)
11615{
11616 struct bpf_insn_aux_data *aux_data = env->insn_aux_data;
11617 unsigned int orig_prog_len = env->prog->len;
11618 int err;
11619
11620 if (bpf_prog_is_dev_bound(env->prog->aux))
11621 bpf_prog_offload_remove_insns(env, off, cnt);
11622
11623 err = bpf_remove_insns(env->prog, off, cnt);
11624 if (err)
11625 return err;
11626
11627 err = adjust_subprog_starts_after_remove(env, off, cnt);
11628 if (err)
11629 return err;
11630
11631 err = bpf_adj_linfo_after_remove(env, off, cnt);
11632 if (err)
11633 return err;
11634
11635 memmove(aux_data + off, aux_data + off + cnt,
11636 sizeof(*aux_data) * (orig_prog_len - off - cnt));
11637
11638 return 0;
11639}
11640
11641
11642
11643
11644
11645
11646
11647
11648
11649
11650
11651
11652static void sanitize_dead_code(struct bpf_verifier_env *env)
11653{
11654 struct bpf_insn_aux_data *aux_data = env->insn_aux_data;
11655 struct bpf_insn trap = BPF_JMP_IMM(BPF_JA, 0, 0, -1);
11656 struct bpf_insn *insn = env->prog->insnsi;
11657 const int insn_cnt = env->prog->len;
11658 int i;
11659
11660 for (i = 0; i < insn_cnt; i++) {
11661 if (aux_data[i].seen)
11662 continue;
11663 memcpy(insn + i, &trap, sizeof(trap));
11664 }
11665}
11666
11667static bool insn_is_cond_jump(u8 code)
11668{
11669 u8 op;
11670
11671 if (BPF_CLASS(code) == BPF_JMP32)
11672 return true;
11673
11674 if (BPF_CLASS(code) != BPF_JMP)
11675 return false;
11676
11677 op = BPF_OP(code);
11678 return op != BPF_JA && op != BPF_EXIT && op != BPF_CALL;
11679}
11680
11681static void opt_hard_wire_dead_code_branches(struct bpf_verifier_env *env)
11682{
11683 struct bpf_insn_aux_data *aux_data = env->insn_aux_data;
11684 struct bpf_insn ja = BPF_JMP_IMM(BPF_JA, 0, 0, 0);
11685 struct bpf_insn *insn = env->prog->insnsi;
11686 const int insn_cnt = env->prog->len;
11687 int i;
11688
11689 for (i = 0; i < insn_cnt; i++, insn++) {
11690 if (!insn_is_cond_jump(insn->code))
11691 continue;
11692
11693 if (!aux_data[i + 1].seen)
11694 ja.off = insn->off;
11695 else if (!aux_data[i + 1 + insn->off].seen)
11696 ja.off = 0;
11697 else
11698 continue;
11699
11700 if (bpf_prog_is_dev_bound(env->prog->aux))
11701 bpf_prog_offload_replace_insn(env, i, &ja);
11702
11703 memcpy(insn, &ja, sizeof(ja));
11704 }
11705}
11706
11707static int opt_remove_dead_code(struct bpf_verifier_env *env)
11708{
11709 struct bpf_insn_aux_data *aux_data = env->insn_aux_data;
11710 int insn_cnt = env->prog->len;
11711 int i, err;
11712
11713 for (i = 0; i < insn_cnt; i++) {
11714 int j;
11715
11716 j = 0;
11717 while (i + j < insn_cnt && !aux_data[i + j].seen)
11718 j++;
11719 if (!j)
11720 continue;
11721
11722 err = verifier_remove_insns(env, i, j);
11723 if (err)
11724 return err;
11725 insn_cnt = env->prog->len;
11726 }
11727
11728 return 0;
11729}
11730
11731static int opt_remove_nops(struct bpf_verifier_env *env)
11732{
11733 const struct bpf_insn ja = BPF_JMP_IMM(BPF_JA, 0, 0, 0);
11734 struct bpf_insn *insn = env->prog->insnsi;
11735 int insn_cnt = env->prog->len;
11736 int i, err;
11737
11738 for (i = 0; i < insn_cnt; i++) {
11739 if (memcmp(&insn[i], &ja, sizeof(ja)))
11740 continue;
11741
11742 err = verifier_remove_insns(env, i, 1);
11743 if (err)
11744 return err;
11745 insn_cnt--;
11746 i--;
11747 }
11748
11749 return 0;
11750}
11751
11752static int opt_subreg_zext_lo32_rnd_hi32(struct bpf_verifier_env *env,
11753 const union bpf_attr *attr)
11754{
11755 struct bpf_insn *patch, zext_patch[2], rnd_hi32_patch[4];
11756 struct bpf_insn_aux_data *aux = env->insn_aux_data;
11757 int i, patch_len, delta = 0, len = env->prog->len;
11758 struct bpf_insn *insns = env->prog->insnsi;
11759 struct bpf_prog *new_prog;
11760 bool rnd_hi32;
11761
11762 rnd_hi32 = attr->prog_flags & BPF_F_TEST_RND_HI32;
11763 zext_patch[1] = BPF_ZEXT_REG(0);
11764 rnd_hi32_patch[1] = BPF_ALU64_IMM(BPF_MOV, BPF_REG_AX, 0);
11765 rnd_hi32_patch[2] = BPF_ALU64_IMM(BPF_LSH, BPF_REG_AX, 32);
11766 rnd_hi32_patch[3] = BPF_ALU64_REG(BPF_OR, 0, BPF_REG_AX);
11767 for (i = 0; i < len; i++) {
11768 int adj_idx = i + delta;
11769 struct bpf_insn insn;
11770 int load_reg;
11771
11772 insn = insns[adj_idx];
11773 load_reg = insn_def_regno(&insn);
11774 if (!aux[adj_idx].zext_dst) {
11775 u8 code, class;
11776 u32 imm_rnd;
11777
11778 if (!rnd_hi32)
11779 continue;
11780
11781 code = insn.code;
11782 class = BPF_CLASS(code);
11783 if (load_reg == -1)
11784 continue;
11785
11786
11787
11788
11789
11790 if (is_reg64(env, &insn, load_reg, NULL, DST_OP)) {
11791 if (class == BPF_LD &&
11792 BPF_MODE(code) == BPF_IMM)
11793 i++;
11794 continue;
11795 }
11796
11797
11798 if (class == BPF_LDX &&
11799 aux[adj_idx].ptr_type == PTR_TO_CTX)
11800 continue;
11801
11802 imm_rnd = get_random_int();
11803 rnd_hi32_patch[0] = insn;
11804 rnd_hi32_patch[1].imm = imm_rnd;
11805 rnd_hi32_patch[3].dst_reg = load_reg;
11806 patch = rnd_hi32_patch;
11807 patch_len = 4;
11808 goto apply_patch_buffer;
11809 }
11810
11811
11812
11813
11814
11815
11816
11817
11818
11819
11820
11821 if (!bpf_jit_needs_zext() && !is_cmpxchg_insn(&insn))
11822 continue;
11823
11824 if (WARN_ON(load_reg == -1)) {
11825 verbose(env, "verifier bug. zext_dst is set, but no reg is defined\n");
11826 return -EFAULT;
11827 }
11828
11829 zext_patch[0] = insn;
11830 zext_patch[1].dst_reg = load_reg;
11831 zext_patch[1].src_reg = load_reg;
11832 patch = zext_patch;
11833 patch_len = 2;
11834apply_patch_buffer:
11835 new_prog = bpf_patch_insn_data(env, adj_idx, patch, patch_len);
11836 if (!new_prog)
11837 return -ENOMEM;
11838 env->prog = new_prog;
11839 insns = new_prog->insnsi;
11840 aux = env->insn_aux_data;
11841 delta += patch_len - 1;
11842 }
11843
11844 return 0;
11845}
11846
11847
11848
11849
11850
11851
11852static int convert_ctx_accesses(struct bpf_verifier_env *env)
11853{
11854 const struct bpf_verifier_ops *ops = env->ops;
11855 int i, cnt, size, ctx_field_size, delta = 0;
11856 const int insn_cnt = env->prog->len;
11857 struct bpf_insn insn_buf[16], *insn;
11858 u32 target_size, size_default, off;
11859 struct bpf_prog *new_prog;
11860 enum bpf_access_type type;
11861 bool is_narrower_load;
11862
11863 if (ops->gen_prologue || env->seen_direct_write) {
11864 if (!ops->gen_prologue) {
11865 verbose(env, "bpf verifier is misconfigured\n");
11866 return -EINVAL;
11867 }
11868 cnt = ops->gen_prologue(insn_buf, env->seen_direct_write,
11869 env->prog);
11870 if (cnt >= ARRAY_SIZE(insn_buf)) {
11871 verbose(env, "bpf verifier is misconfigured\n");
11872 return -EINVAL;
11873 } else if (cnt) {
11874 new_prog = bpf_patch_insn_data(env, 0, insn_buf, cnt);
11875 if (!new_prog)
11876 return -ENOMEM;
11877
11878 env->prog = new_prog;
11879 delta += cnt - 1;
11880 }
11881 }
11882
11883 if (bpf_prog_is_dev_bound(env->prog->aux))
11884 return 0;
11885
11886 insn = env->prog->insnsi + delta;
11887
11888 for (i = 0; i < insn_cnt; i++, insn++) {
11889 bpf_convert_ctx_access_t convert_ctx_access;
11890
11891 if (insn->code == (BPF_LDX | BPF_MEM | BPF_B) ||
11892 insn->code == (BPF_LDX | BPF_MEM | BPF_H) ||
11893 insn->code == (BPF_LDX | BPF_MEM | BPF_W) ||
11894 insn->code == (BPF_LDX | BPF_MEM | BPF_DW))
11895 type = BPF_READ;
11896 else if (insn->code == (BPF_STX | BPF_MEM | BPF_B) ||
11897 insn->code == (BPF_STX | BPF_MEM | BPF_H) ||
11898 insn->code == (BPF_STX | BPF_MEM | BPF_W) ||
11899 insn->code == (BPF_STX | BPF_MEM | BPF_DW))
11900 type = BPF_WRITE;
11901 else
11902 continue;
11903
11904 if (type == BPF_WRITE &&
11905 env->insn_aux_data[i + delta].sanitize_stack_off) {
11906 struct bpf_insn patch[] = {
11907
11908
11909
11910
11911
11912 BPF_ST_MEM(BPF_DW, BPF_REG_FP,
11913 env->insn_aux_data[i + delta].sanitize_stack_off,
11914 0),
11915
11916
11917
11918 *insn,
11919 };
11920
11921 cnt = ARRAY_SIZE(patch);
11922 new_prog = bpf_patch_insn_data(env, i + delta, patch, cnt);
11923 if (!new_prog)
11924 return -ENOMEM;
11925
11926 delta += cnt - 1;
11927 env->prog = new_prog;
11928 insn = new_prog->insnsi + i + delta;
11929 continue;
11930 }
11931
11932 switch (env->insn_aux_data[i + delta].ptr_type) {
11933 case PTR_TO_CTX:
11934 if (!ops->convert_ctx_access)
11935 continue;
11936 convert_ctx_access = ops->convert_ctx_access;
11937 break;
11938 case PTR_TO_SOCKET:
11939 case PTR_TO_SOCK_COMMON:
11940 convert_ctx_access = bpf_sock_convert_ctx_access;
11941 break;
11942 case PTR_TO_TCP_SOCK:
11943 convert_ctx_access = bpf_tcp_sock_convert_ctx_access;
11944 break;
11945 case PTR_TO_XDP_SOCK:
11946 convert_ctx_access = bpf_xdp_sock_convert_ctx_access;
11947 break;
11948 case PTR_TO_BTF_ID:
11949 if (type == BPF_READ) {
11950 insn->code = BPF_LDX | BPF_PROBE_MEM |
11951 BPF_SIZE((insn)->code);
11952 env->prog->aux->num_exentries++;
11953 } else if (resolve_prog_type(env->prog) != BPF_PROG_TYPE_STRUCT_OPS) {
11954 verbose(env, "Writes through BTF pointers are not allowed\n");
11955 return -EINVAL;
11956 }
11957 continue;
11958 default:
11959 continue;
11960 }
11961
11962 ctx_field_size = env->insn_aux_data[i + delta].ctx_field_size;
11963 size = BPF_LDST_BYTES(insn);
11964
11965
11966
11967
11968
11969
11970 is_narrower_load = size < ctx_field_size;
11971 size_default = bpf_ctx_off_adjust_machine(ctx_field_size);
11972 off = insn->off;
11973 if (is_narrower_load) {
11974 u8 size_code;
11975
11976 if (type == BPF_WRITE) {
11977 verbose(env, "bpf verifier narrow ctx access misconfigured\n");
11978 return -EINVAL;
11979 }
11980
11981 size_code = BPF_H;
11982 if (ctx_field_size == 4)
11983 size_code = BPF_W;
11984 else if (ctx_field_size == 8)
11985 size_code = BPF_DW;
11986
11987 insn->off = off & ~(size_default - 1);
11988 insn->code = BPF_LDX | BPF_MEM | size_code;
11989 }
11990
11991 target_size = 0;
11992 cnt = convert_ctx_access(type, insn, insn_buf, env->prog,
11993 &target_size);
11994 if (cnt == 0 || cnt >= ARRAY_SIZE(insn_buf) ||
11995 (ctx_field_size && !target_size)) {
11996 verbose(env, "bpf verifier is misconfigured\n");
11997 return -EINVAL;
11998 }
11999
12000 if (is_narrower_load && size < target_size) {
12001 u8 shift = bpf_ctx_narrow_access_offset(
12002 off, size, size_default) * 8;
12003 if (ctx_field_size <= 4) {
12004 if (shift)
12005 insn_buf[cnt++] = BPF_ALU32_IMM(BPF_RSH,
12006 insn->dst_reg,
12007 shift);
12008 insn_buf[cnt++] = BPF_ALU32_IMM(BPF_AND, insn->dst_reg,
12009 (1 << size * 8) - 1);
12010 } else {
12011 if (shift)
12012 insn_buf[cnt++] = BPF_ALU64_IMM(BPF_RSH,
12013 insn->dst_reg,
12014 shift);
12015 insn_buf[cnt++] = BPF_ALU64_IMM(BPF_AND, insn->dst_reg,
12016 (1ULL << size * 8) - 1);
12017 }
12018 }
12019
12020 new_prog = bpf_patch_insn_data(env, i + delta, insn_buf, cnt);
12021 if (!new_prog)
12022 return -ENOMEM;
12023
12024 delta += cnt - 1;
12025
12026
12027 env->prog = new_prog;
12028 insn = new_prog->insnsi + i + delta;
12029 }
12030
12031 return 0;
12032}
12033
12034static int jit_subprogs(struct bpf_verifier_env *env)
12035{
12036 struct bpf_prog *prog = env->prog, **func, *tmp;
12037 int i, j, subprog_start, subprog_end = 0, len, subprog;
12038 struct bpf_map *map_ptr;
12039 struct bpf_insn *insn;
12040 void *old_bpf_func;
12041 int err, num_exentries;
12042
12043 if (env->subprog_cnt <= 1)
12044 return 0;
12045
12046 for (i = 0, insn = prog->insnsi; i < prog->len; i++, insn++) {
12047 if (bpf_pseudo_func(insn)) {
12048 env->insn_aux_data[i].call_imm = insn->imm;
12049
12050 continue;
12051 }
12052
12053 if (!bpf_pseudo_call(insn))
12054 continue;
12055
12056
12057
12058
12059 subprog = find_subprog(env, i + insn->imm + 1);
12060 if (subprog < 0) {
12061 WARN_ONCE(1, "verifier bug. No program starts at insn %d\n",
12062 i + insn->imm + 1);
12063 return -EFAULT;
12064 }
12065
12066
12067
12068 insn->off = subprog;
12069
12070
12071
12072 env->insn_aux_data[i].call_imm = insn->imm;
12073
12074 insn->imm = 1;
12075 }
12076
12077 err = bpf_prog_alloc_jited_linfo(prog);
12078 if (err)
12079 goto out_undo_insn;
12080
12081 err = -ENOMEM;
12082 func = kcalloc(env->subprog_cnt, sizeof(prog), GFP_KERNEL);
12083 if (!func)
12084 goto out_undo_insn;
12085
12086 for (i = 0; i < env->subprog_cnt; i++) {
12087 subprog_start = subprog_end;
12088 subprog_end = env->subprog_info[i + 1].start;
12089
12090 len = subprog_end - subprog_start;
12091
12092
12093
12094
12095
12096 func[i] = bpf_prog_alloc_no_stats(bpf_prog_size(len), GFP_USER);
12097 if (!func[i])
12098 goto out_free;
12099 memcpy(func[i]->insnsi, &prog->insnsi[subprog_start],
12100 len * sizeof(struct bpf_insn));
12101 func[i]->type = prog->type;
12102 func[i]->len = len;
12103 if (bpf_prog_calc_tag(func[i]))
12104 goto out_free;
12105 func[i]->is_func = 1;
12106 func[i]->aux->func_idx = i;
12107
12108 func[i]->aux->btf = prog->aux->btf;
12109 func[i]->aux->func_info = prog->aux->func_info;
12110
12111 for (j = 0; j < prog->aux->size_poke_tab; j++) {
12112 u32 insn_idx = prog->aux->poke_tab[j].insn_idx;
12113 int ret;
12114
12115 if (!(insn_idx >= subprog_start &&
12116 insn_idx <= subprog_end))
12117 continue;
12118
12119 ret = bpf_jit_add_poke_descriptor(func[i],
12120 &prog->aux->poke_tab[j]);
12121 if (ret < 0) {
12122 verbose(env, "adding tail call poke descriptor failed\n");
12123 goto out_free;
12124 }
12125
12126 func[i]->insnsi[insn_idx - subprog_start].imm = ret + 1;
12127
12128 map_ptr = func[i]->aux->poke_tab[ret].tail_call.map;
12129 ret = map_ptr->ops->map_poke_track(map_ptr, func[i]->aux);
12130 if (ret < 0) {
12131 verbose(env, "tracking tail call prog failed\n");
12132 goto out_free;
12133 }
12134 }
12135
12136
12137
12138
12139 func[i]->aux->name[0] = 'F';
12140 func[i]->aux->stack_depth = env->subprog_info[i].stack_depth;
12141 func[i]->jit_requested = 1;
12142 func[i]->aux->kfunc_tab = prog->aux->kfunc_tab;
12143 func[i]->aux->linfo = prog->aux->linfo;
12144 func[i]->aux->nr_linfo = prog->aux->nr_linfo;
12145 func[i]->aux->jited_linfo = prog->aux->jited_linfo;
12146 func[i]->aux->linfo_idx = env->subprog_info[i].linfo_idx;
12147 num_exentries = 0;
12148 insn = func[i]->insnsi;
12149 for (j = 0; j < func[i]->len; j++, insn++) {
12150 if (BPF_CLASS(insn->code) == BPF_LDX &&
12151 BPF_MODE(insn->code) == BPF_PROBE_MEM)
12152 num_exentries++;
12153 }
12154 func[i]->aux->num_exentries = num_exentries;
12155 func[i]->aux->tail_call_reachable = env->subprog_info[i].tail_call_reachable;
12156 func[i] = bpf_int_jit_compile(func[i]);
12157 if (!func[i]->jited) {
12158 err = -ENOTSUPP;
12159 goto out_free;
12160 }
12161 cond_resched();
12162 }
12163
12164
12165
12166
12167
12168
12169
12170 for (i = 0; i < prog->aux->size_poke_tab; i++) {
12171 map_ptr = prog->aux->poke_tab[i].tail_call.map;
12172
12173 map_ptr->ops->map_poke_untrack(map_ptr, prog->aux);
12174 }
12175
12176
12177
12178
12179
12180 for (i = 0; i < env->subprog_cnt; i++) {
12181 insn = func[i]->insnsi;
12182 for (j = 0; j < func[i]->len; j++, insn++) {
12183 if (bpf_pseudo_func(insn)) {
12184 subprog = insn[1].imm;
12185 insn[0].imm = (u32)(long)func[subprog]->bpf_func;
12186 insn[1].imm = ((u64)(long)func[subprog]->bpf_func) >> 32;
12187 continue;
12188 }
12189 if (!bpf_pseudo_call(insn))
12190 continue;
12191 subprog = insn->off;
12192 insn->imm = BPF_CAST_CALL(func[subprog]->bpf_func) -
12193 __bpf_call_base;
12194 }
12195
12196
12197
12198
12199
12200
12201
12202
12203
12204
12205
12206
12207 func[i]->aux->func = func;
12208 func[i]->aux->func_cnt = env->subprog_cnt;
12209 }
12210 for (i = 0; i < env->subprog_cnt; i++) {
12211 old_bpf_func = func[i]->bpf_func;
12212 tmp = bpf_int_jit_compile(func[i]);
12213 if (tmp != func[i] || func[i]->bpf_func != old_bpf_func) {
12214 verbose(env, "JIT doesn't support bpf-to-bpf calls\n");
12215 err = -ENOTSUPP;
12216 goto out_free;
12217 }
12218 cond_resched();
12219 }
12220
12221
12222
12223
12224 for (i = 0; i < env->subprog_cnt; i++) {
12225 bpf_prog_lock_ro(func[i]);
12226 bpf_prog_kallsyms_add(func[i]);
12227 }
12228
12229
12230
12231
12232
12233 for (i = 0, insn = prog->insnsi; i < prog->len; i++, insn++) {
12234 if (bpf_pseudo_func(insn)) {
12235 insn[0].imm = env->insn_aux_data[i].call_imm;
12236 insn[1].imm = find_subprog(env, i + insn[0].imm + 1);
12237 continue;
12238 }
12239 if (!bpf_pseudo_call(insn))
12240 continue;
12241 insn->off = env->insn_aux_data[i].call_imm;
12242 subprog = find_subprog(env, i + insn->off + 1);
12243 insn->imm = subprog;
12244 }
12245
12246 prog->jited = 1;
12247 prog->bpf_func = func[0]->bpf_func;
12248 prog->aux->func = func;
12249 prog->aux->func_cnt = env->subprog_cnt;
12250 bpf_prog_jit_attempt_done(prog);
12251 return 0;
12252out_free:
12253 for (i = 0; i < env->subprog_cnt; i++) {
12254 if (!func[i])
12255 continue;
12256
12257 for (j = 0; j < func[i]->aux->size_poke_tab; j++) {
12258 map_ptr = func[i]->aux->poke_tab[j].tail_call.map;
12259 map_ptr->ops->map_poke_untrack(map_ptr, func[i]->aux);
12260 }
12261 bpf_jit_free(func[i]);
12262 }
12263 kfree(func);
12264out_undo_insn:
12265
12266 prog->jit_requested = 0;
12267 for (i = 0, insn = prog->insnsi; i < prog->len; i++, insn++) {
12268 if (!bpf_pseudo_call(insn))
12269 continue;
12270 insn->off = 0;
12271 insn->imm = env->insn_aux_data[i].call_imm;
12272 }
12273 bpf_prog_jit_attempt_done(prog);
12274 return err;
12275}
12276
12277static int fixup_call_args(struct bpf_verifier_env *env)
12278{
12279#ifndef CONFIG_BPF_JIT_ALWAYS_ON
12280 struct bpf_prog *prog = env->prog;
12281 struct bpf_insn *insn = prog->insnsi;
12282 bool has_kfunc_call = bpf_prog_has_kfunc_call(prog);
12283 int i, depth;
12284#endif
12285 int err = 0;
12286
12287 if (env->prog->jit_requested &&
12288 !bpf_prog_is_dev_bound(env->prog->aux)) {
12289 err = jit_subprogs(env);
12290 if (err == 0)
12291 return 0;
12292 if (err == -EFAULT)
12293 return err;
12294 }
12295#ifndef CONFIG_BPF_JIT_ALWAYS_ON
12296 if (has_kfunc_call) {
12297 verbose(env, "calling kernel functions are not allowed in non-JITed programs\n");
12298 return -EINVAL;
12299 }
12300 if (env->subprog_cnt > 1 && env->prog->aux->tail_call_reachable) {
12301
12302
12303
12304 verbose(env, "tail_calls are not allowed in non-JITed programs with bpf-to-bpf calls\n");
12305 return -EINVAL;
12306 }
12307 for (i = 0; i < prog->len; i++, insn++) {
12308 if (bpf_pseudo_func(insn)) {
12309
12310
12311
12312 verbose(env, "callbacks are not allowed in non-JITed programs\n");
12313 return -EINVAL;
12314 }
12315
12316 if (!bpf_pseudo_call(insn))
12317 continue;
12318 depth = get_callee_stack_depth(env, insn, i);
12319 if (depth < 0)
12320 return depth;
12321 bpf_patch_call_args(insn, depth);
12322 }
12323 err = 0;
12324#endif
12325 return err;
12326}
12327
12328static int fixup_kfunc_call(struct bpf_verifier_env *env,
12329 struct bpf_insn *insn)
12330{
12331 const struct bpf_kfunc_desc *desc;
12332
12333
12334
12335
12336 desc = find_kfunc_desc(env->prog, insn->imm);
12337 if (!desc) {
12338 verbose(env, "verifier internal error: kernel function descriptor not found for func_id %u\n",
12339 insn->imm);
12340 return -EFAULT;
12341 }
12342
12343 insn->imm = desc->imm;
12344
12345 return 0;
12346}
12347
12348
12349
12350
12351static int do_misc_fixups(struct bpf_verifier_env *env)
12352{
12353 struct bpf_prog *prog = env->prog;
12354 bool expect_blinding = bpf_jit_blinding_enabled(prog);
12355 struct bpf_insn *insn = prog->insnsi;
12356 const struct bpf_func_proto *fn;
12357 const int insn_cnt = prog->len;
12358 const struct bpf_map_ops *ops;
12359 struct bpf_insn_aux_data *aux;
12360 struct bpf_insn insn_buf[16];
12361 struct bpf_prog *new_prog;
12362 struct bpf_map *map_ptr;
12363 int i, ret, cnt, delta = 0;
12364
12365 for (i = 0; i < insn_cnt; i++, insn++) {
12366
12367 if (insn->code == (BPF_ALU64 | BPF_MOD | BPF_X) ||
12368 insn->code == (BPF_ALU64 | BPF_DIV | BPF_X) ||
12369 insn->code == (BPF_ALU | BPF_MOD | BPF_X) ||
12370 insn->code == (BPF_ALU | BPF_DIV | BPF_X)) {
12371 bool is64 = BPF_CLASS(insn->code) == BPF_ALU64;
12372 bool isdiv = BPF_OP(insn->code) == BPF_DIV;
12373 struct bpf_insn *patchlet;
12374 struct bpf_insn chk_and_div[] = {
12375
12376 BPF_RAW_INSN((is64 ? BPF_JMP : BPF_JMP32) |
12377 BPF_JNE | BPF_K, insn->src_reg,
12378 0, 2, 0),
12379 BPF_ALU32_REG(BPF_XOR, insn->dst_reg, insn->dst_reg),
12380 BPF_JMP_IMM(BPF_JA, 0, 0, 1),
12381 *insn,
12382 };
12383 struct bpf_insn chk_and_mod[] = {
12384
12385 BPF_RAW_INSN((is64 ? BPF_JMP : BPF_JMP32) |
12386 BPF_JEQ | BPF_K, insn->src_reg,
12387 0, 1 + (is64 ? 0 : 1), 0),
12388 *insn,
12389 BPF_JMP_IMM(BPF_JA, 0, 0, 1),
12390 BPF_MOV32_REG(insn->dst_reg, insn->dst_reg),
12391 };
12392
12393 patchlet = isdiv ? chk_and_div : chk_and_mod;
12394 cnt = isdiv ? ARRAY_SIZE(chk_and_div) :
12395 ARRAY_SIZE(chk_and_mod) - (is64 ? 2 : 0);
12396
12397 new_prog = bpf_patch_insn_data(env, i + delta, patchlet, cnt);
12398 if (!new_prog)
12399 return -ENOMEM;
12400
12401 delta += cnt - 1;
12402 env->prog = prog = new_prog;
12403 insn = new_prog->insnsi + i + delta;
12404 continue;
12405 }
12406
12407
12408 if (BPF_CLASS(insn->code) == BPF_LD &&
12409 (BPF_MODE(insn->code) == BPF_ABS ||
12410 BPF_MODE(insn->code) == BPF_IND)) {
12411 cnt = env->ops->gen_ld_abs(insn, insn_buf);
12412 if (cnt == 0 || cnt >= ARRAY_SIZE(insn_buf)) {
12413 verbose(env, "bpf verifier is misconfigured\n");
12414 return -EINVAL;
12415 }
12416
12417 new_prog = bpf_patch_insn_data(env, i + delta, insn_buf, cnt);
12418 if (!new_prog)
12419 return -ENOMEM;
12420
12421 delta += cnt - 1;
12422 env->prog = prog = new_prog;
12423 insn = new_prog->insnsi + i + delta;
12424 continue;
12425 }
12426
12427
12428 if (insn->code == (BPF_ALU64 | BPF_ADD | BPF_X) ||
12429 insn->code == (BPF_ALU64 | BPF_SUB | BPF_X)) {
12430 const u8 code_add = BPF_ALU64 | BPF_ADD | BPF_X;
12431 const u8 code_sub = BPF_ALU64 | BPF_SUB | BPF_X;
12432 struct bpf_insn *patch = &insn_buf[0];
12433 bool issrc, isneg, isimm;
12434 u32 off_reg;
12435
12436 aux = &env->insn_aux_data[i + delta];
12437 if (!aux->alu_state ||
12438 aux->alu_state == BPF_ALU_NON_POINTER)
12439 continue;
12440
12441 isneg = aux->alu_state & BPF_ALU_NEG_VALUE;
12442 issrc = (aux->alu_state & BPF_ALU_SANITIZE) ==
12443 BPF_ALU_SANITIZE_SRC;
12444 isimm = aux->alu_state & BPF_ALU_IMMEDIATE;
12445
12446 off_reg = issrc ? insn->src_reg : insn->dst_reg;
12447 if (isimm) {
12448 *patch++ = BPF_MOV32_IMM(BPF_REG_AX, aux->alu_limit);
12449 } else {
12450 if (isneg)
12451 *patch++ = BPF_ALU64_IMM(BPF_MUL, off_reg, -1);
12452 *patch++ = BPF_MOV32_IMM(BPF_REG_AX, aux->alu_limit);
12453 *patch++ = BPF_ALU64_REG(BPF_SUB, BPF_REG_AX, off_reg);
12454 *patch++ = BPF_ALU64_REG(BPF_OR, BPF_REG_AX, off_reg);
12455 *patch++ = BPF_ALU64_IMM(BPF_NEG, BPF_REG_AX, 0);
12456 *patch++ = BPF_ALU64_IMM(BPF_ARSH, BPF_REG_AX, 63);
12457 *patch++ = BPF_ALU64_REG(BPF_AND, BPF_REG_AX, off_reg);
12458 }
12459 if (!issrc)
12460 *patch++ = BPF_MOV64_REG(insn->dst_reg, insn->src_reg);
12461 insn->src_reg = BPF_REG_AX;
12462 if (isneg)
12463 insn->code = insn->code == code_add ?
12464 code_sub : code_add;
12465 *patch++ = *insn;
12466 if (issrc && isneg && !isimm)
12467 *patch++ = BPF_ALU64_IMM(BPF_MUL, off_reg, -1);
12468 cnt = patch - insn_buf;
12469
12470 new_prog = bpf_patch_insn_data(env, i + delta, insn_buf, cnt);
12471 if (!new_prog)
12472 return -ENOMEM;
12473
12474 delta += cnt - 1;
12475 env->prog = prog = new_prog;
12476 insn = new_prog->insnsi + i + delta;
12477 continue;
12478 }
12479
12480 if (insn->code != (BPF_JMP | BPF_CALL))
12481 continue;
12482 if (insn->src_reg == BPF_PSEUDO_CALL)
12483 continue;
12484 if (insn->src_reg == BPF_PSEUDO_KFUNC_CALL) {
12485 ret = fixup_kfunc_call(env, insn);
12486 if (ret)
12487 return ret;
12488 continue;
12489 }
12490
12491 if (insn->imm == BPF_FUNC_get_route_realm)
12492 prog->dst_needed = 1;
12493 if (insn->imm == BPF_FUNC_get_prandom_u32)
12494 bpf_user_rnd_init_once();
12495 if (insn->imm == BPF_FUNC_override_return)
12496 prog->kprobe_override = 1;
12497 if (insn->imm == BPF_FUNC_tail_call) {
12498
12499
12500
12501
12502
12503 prog->cb_access = 1;
12504 if (!allow_tail_call_in_subprogs(env))
12505 prog->aux->stack_depth = MAX_BPF_STACK;
12506 prog->aux->max_pkt_offset = MAX_PACKET_OFF;
12507
12508
12509
12510
12511
12512
12513 insn->imm = 0;
12514 insn->code = BPF_JMP | BPF_TAIL_CALL;
12515
12516 aux = &env->insn_aux_data[i + delta];
12517 if (env->bpf_capable && !expect_blinding &&
12518 prog->jit_requested &&
12519 !bpf_map_key_poisoned(aux) &&
12520 !bpf_map_ptr_poisoned(aux) &&
12521 !bpf_map_ptr_unpriv(aux)) {
12522 struct bpf_jit_poke_descriptor desc = {
12523 .reason = BPF_POKE_REASON_TAIL_CALL,
12524 .tail_call.map = BPF_MAP_PTR(aux->map_ptr_state),
12525 .tail_call.key = bpf_map_key_immediate(aux),
12526 .insn_idx = i + delta,
12527 };
12528
12529 ret = bpf_jit_add_poke_descriptor(prog, &desc);
12530 if (ret < 0) {
12531 verbose(env, "adding tail call poke descriptor failed\n");
12532 return ret;
12533 }
12534
12535 insn->imm = ret + 1;
12536 continue;
12537 }
12538
12539 if (!bpf_map_ptr_unpriv(aux))
12540 continue;
12541
12542
12543
12544
12545
12546
12547
12548 if (bpf_map_ptr_poisoned(aux)) {
12549 verbose(env, "tail_call abusing map_ptr\n");
12550 return -EINVAL;
12551 }
12552
12553 map_ptr = BPF_MAP_PTR(aux->map_ptr_state);
12554 insn_buf[0] = BPF_JMP_IMM(BPF_JGE, BPF_REG_3,
12555 map_ptr->max_entries, 2);
12556 insn_buf[1] = BPF_ALU32_IMM(BPF_AND, BPF_REG_3,
12557 container_of(map_ptr,
12558 struct bpf_array,
12559 map)->index_mask);
12560 insn_buf[2] = *insn;
12561 cnt = 3;
12562 new_prog = bpf_patch_insn_data(env, i + delta, insn_buf, cnt);
12563 if (!new_prog)
12564 return -ENOMEM;
12565
12566 delta += cnt - 1;
12567 env->prog = prog = new_prog;
12568 insn = new_prog->insnsi + i + delta;
12569 continue;
12570 }
12571
12572
12573
12574
12575
12576 if (prog->jit_requested && BITS_PER_LONG == 64 &&
12577 (insn->imm == BPF_FUNC_map_lookup_elem ||
12578 insn->imm == BPF_FUNC_map_update_elem ||
12579 insn->imm == BPF_FUNC_map_delete_elem ||
12580 insn->imm == BPF_FUNC_map_push_elem ||
12581 insn->imm == BPF_FUNC_map_pop_elem ||
12582 insn->imm == BPF_FUNC_map_peek_elem ||
12583 insn->imm == BPF_FUNC_redirect_map)) {
12584 aux = &env->insn_aux_data[i + delta];
12585 if (bpf_map_ptr_poisoned(aux))
12586 goto patch_call_imm;
12587
12588 map_ptr = BPF_MAP_PTR(aux->map_ptr_state);
12589 ops = map_ptr->ops;
12590 if (insn->imm == BPF_FUNC_map_lookup_elem &&
12591 ops->map_gen_lookup) {
12592 cnt = ops->map_gen_lookup(map_ptr, insn_buf);
12593 if (cnt == -EOPNOTSUPP)
12594 goto patch_map_ops_generic;
12595 if (cnt <= 0 || cnt >= ARRAY_SIZE(insn_buf)) {
12596 verbose(env, "bpf verifier is misconfigured\n");
12597 return -EINVAL;
12598 }
12599
12600 new_prog = bpf_patch_insn_data(env, i + delta,
12601 insn_buf, cnt);
12602 if (!new_prog)
12603 return -ENOMEM;
12604
12605 delta += cnt - 1;
12606 env->prog = prog = new_prog;
12607 insn = new_prog->insnsi + i + delta;
12608 continue;
12609 }
12610
12611 BUILD_BUG_ON(!__same_type(ops->map_lookup_elem,
12612 (void *(*)(struct bpf_map *map, void *key))NULL));
12613 BUILD_BUG_ON(!__same_type(ops->map_delete_elem,
12614 (int (*)(struct bpf_map *map, void *key))NULL));
12615 BUILD_BUG_ON(!__same_type(ops->map_update_elem,
12616 (int (*)(struct bpf_map *map, void *key, void *value,
12617 u64 flags))NULL));
12618 BUILD_BUG_ON(!__same_type(ops->map_push_elem,
12619 (int (*)(struct bpf_map *map, void *value,
12620 u64 flags))NULL));
12621 BUILD_BUG_ON(!__same_type(ops->map_pop_elem,
12622 (int (*)(struct bpf_map *map, void *value))NULL));
12623 BUILD_BUG_ON(!__same_type(ops->map_peek_elem,
12624 (int (*)(struct bpf_map *map, void *value))NULL));
12625 BUILD_BUG_ON(!__same_type(ops->map_redirect,
12626 (int (*)(struct bpf_map *map, u32 ifindex, u64 flags))NULL));
12627
12628patch_map_ops_generic:
12629 switch (insn->imm) {
12630 case BPF_FUNC_map_lookup_elem:
12631 insn->imm = BPF_CAST_CALL(ops->map_lookup_elem) -
12632 __bpf_call_base;
12633 continue;
12634 case BPF_FUNC_map_update_elem:
12635 insn->imm = BPF_CAST_CALL(ops->map_update_elem) -
12636 __bpf_call_base;
12637 continue;
12638 case BPF_FUNC_map_delete_elem:
12639 insn->imm = BPF_CAST_CALL(ops->map_delete_elem) -
12640 __bpf_call_base;
12641 continue;
12642 case BPF_FUNC_map_push_elem:
12643 insn->imm = BPF_CAST_CALL(ops->map_push_elem) -
12644 __bpf_call_base;
12645 continue;
12646 case BPF_FUNC_map_pop_elem:
12647 insn->imm = BPF_CAST_CALL(ops->map_pop_elem) -
12648 __bpf_call_base;
12649 continue;
12650 case BPF_FUNC_map_peek_elem:
12651 insn->imm = BPF_CAST_CALL(ops->map_peek_elem) -
12652 __bpf_call_base;
12653 continue;
12654 case BPF_FUNC_redirect_map:
12655 insn->imm = BPF_CAST_CALL(ops->map_redirect) -
12656 __bpf_call_base;
12657 continue;
12658 }
12659
12660 goto patch_call_imm;
12661 }
12662
12663
12664 if (prog->jit_requested && BITS_PER_LONG == 64 &&
12665 insn->imm == BPF_FUNC_jiffies64) {
12666 struct bpf_insn ld_jiffies_addr[2] = {
12667 BPF_LD_IMM64(BPF_REG_0,
12668 (unsigned long)&jiffies),
12669 };
12670
12671 insn_buf[0] = ld_jiffies_addr[0];
12672 insn_buf[1] = ld_jiffies_addr[1];
12673 insn_buf[2] = BPF_LDX_MEM(BPF_DW, BPF_REG_0,
12674 BPF_REG_0, 0);
12675 cnt = 3;
12676
12677 new_prog = bpf_patch_insn_data(env, i + delta, insn_buf,
12678 cnt);
12679 if (!new_prog)
12680 return -ENOMEM;
12681
12682 delta += cnt - 1;
12683 env->prog = prog = new_prog;
12684 insn = new_prog->insnsi + i + delta;
12685 continue;
12686 }
12687
12688patch_call_imm:
12689 fn = env->ops->get_func_proto(insn->imm, env->prog);
12690
12691
12692
12693 if (!fn->func) {
12694 verbose(env,
12695 "kernel subsystem misconfigured func %s#%d\n",
12696 func_id_name(insn->imm), insn->imm);
12697 return -EFAULT;
12698 }
12699 insn->imm = fn->func - __bpf_call_base;
12700 }
12701
12702
12703 for (i = 0; i < prog->aux->size_poke_tab; i++) {
12704 map_ptr = prog->aux->poke_tab[i].tail_call.map;
12705 if (!map_ptr->ops->map_poke_track ||
12706 !map_ptr->ops->map_poke_untrack ||
12707 !map_ptr->ops->map_poke_run) {
12708 verbose(env, "bpf verifier is misconfigured\n");
12709 return -EINVAL;
12710 }
12711
12712 ret = map_ptr->ops->map_poke_track(map_ptr, prog->aux);
12713 if (ret < 0) {
12714 verbose(env, "tracking tail call prog failed\n");
12715 return ret;
12716 }
12717 }
12718
12719 sort_kfunc_descs_by_imm(env->prog);
12720
12721 return 0;
12722}
12723
12724static void free_states(struct bpf_verifier_env *env)
12725{
12726 struct bpf_verifier_state_list *sl, *sln;
12727 int i;
12728
12729 sl = env->free_list;
12730 while (sl) {
12731 sln = sl->next;
12732 free_verifier_state(&sl->state, false);
12733 kfree(sl);
12734 sl = sln;
12735 }
12736 env->free_list = NULL;
12737
12738 if (!env->explored_states)
12739 return;
12740
12741 for (i = 0; i < state_htab_size(env); i++) {
12742 sl = env->explored_states[i];
12743
12744 while (sl) {
12745 sln = sl->next;
12746 free_verifier_state(&sl->state, false);
12747 kfree(sl);
12748 sl = sln;
12749 }
12750 env->explored_states[i] = NULL;
12751 }
12752}
12753
12754
12755
12756
12757
12758
12759
12760
12761
12762
12763
12764
12765
12766
12767
12768static void sanitize_insn_aux_data(struct bpf_verifier_env *env)
12769{
12770 struct bpf_insn *insn = env->prog->insnsi;
12771 struct bpf_insn_aux_data *aux;
12772 int i, class;
12773
12774 for (i = 0; i < env->prog->len; i++) {
12775 class = BPF_CLASS(insn[i].code);
12776 if (class != BPF_LDX && class != BPF_STX)
12777 continue;
12778 aux = &env->insn_aux_data[i];
12779 if (aux->seen != env->pass_cnt)
12780 continue;
12781 memset(aux, 0, offsetof(typeof(*aux), orig_idx));
12782 }
12783}
12784
12785static int do_check_common(struct bpf_verifier_env *env, int subprog)
12786{
12787 bool pop_log = !(env->log.level & BPF_LOG_LEVEL2);
12788 struct bpf_verifier_state *state;
12789 struct bpf_reg_state *regs;
12790 int ret, i;
12791
12792 env->prev_linfo = NULL;
12793 env->pass_cnt++;
12794
12795 state = kzalloc(sizeof(struct bpf_verifier_state), GFP_KERNEL);
12796 if (!state)
12797 return -ENOMEM;
12798 state->curframe = 0;
12799 state->speculative = false;
12800 state->branches = 1;
12801 state->frame[0] = kzalloc(sizeof(struct bpf_func_state), GFP_KERNEL);
12802 if (!state->frame[0]) {
12803 kfree(state);
12804 return -ENOMEM;
12805 }
12806 env->cur_state = state;
12807 init_func_state(env, state->frame[0],
12808 BPF_MAIN_FUNC ,
12809 0 ,
12810 subprog);
12811
12812 regs = state->frame[state->curframe]->regs;
12813 if (subprog || env->prog->type == BPF_PROG_TYPE_EXT) {
12814 ret = btf_prepare_func_args(env, subprog, regs);
12815 if (ret)
12816 goto out;
12817 for (i = BPF_REG_1; i <= BPF_REG_5; i++) {
12818 if (regs[i].type == PTR_TO_CTX)
12819 mark_reg_known_zero(env, regs, i);
12820 else if (regs[i].type == SCALAR_VALUE)
12821 mark_reg_unknown(env, regs, i);
12822 else if (regs[i].type == PTR_TO_MEM_OR_NULL) {
12823 const u32 mem_size = regs[i].mem_size;
12824
12825 mark_reg_known_zero(env, regs, i);
12826 regs[i].mem_size = mem_size;
12827 regs[i].id = ++env->id_gen;
12828 }
12829 }
12830 } else {
12831
12832 regs[BPF_REG_1].type = PTR_TO_CTX;
12833 mark_reg_known_zero(env, regs, BPF_REG_1);
12834 ret = btf_check_subprog_arg_match(env, subprog, regs);
12835 if (ret == -EFAULT)
12836
12837
12838
12839
12840
12841
12842
12843
12844
12845 goto out;
12846 }
12847
12848 ret = do_check(env);
12849out:
12850
12851
12852
12853 if (env->cur_state) {
12854 free_verifier_state(env->cur_state, true);
12855 env->cur_state = NULL;
12856 }
12857 while (!pop_stack(env, NULL, NULL, false));
12858 if (!ret && pop_log)
12859 bpf_vlog_reset(&env->log, 0);
12860 free_states(env);
12861 if (ret)
12862
12863 sanitize_insn_aux_data(env);
12864 return ret;
12865}
12866
12867
12868
12869
12870
12871
12872
12873
12874
12875
12876
12877
12878
12879
12880
12881
12882
12883
12884static int do_check_subprogs(struct bpf_verifier_env *env)
12885{
12886 struct bpf_prog_aux *aux = env->prog->aux;
12887 int i, ret;
12888
12889 if (!aux->func_info)
12890 return 0;
12891
12892 for (i = 1; i < env->subprog_cnt; i++) {
12893 if (aux->func_info_aux[i].linkage != BTF_FUNC_GLOBAL)
12894 continue;
12895 env->insn_idx = env->subprog_info[i].start;
12896 WARN_ON_ONCE(env->insn_idx == 0);
12897 ret = do_check_common(env, i);
12898 if (ret) {
12899 return ret;
12900 } else if (env->log.level & BPF_LOG_LEVEL) {
12901 verbose(env,
12902 "Func#%d is safe for any args that match its prototype\n",
12903 i);
12904 }
12905 }
12906 return 0;
12907}
12908
12909static int do_check_main(struct bpf_verifier_env *env)
12910{
12911 int ret;
12912
12913 env->insn_idx = 0;
12914 ret = do_check_common(env, 0);
12915 if (!ret)
12916 env->prog->aux->stack_depth = env->subprog_info[0].stack_depth;
12917 return ret;
12918}
12919
12920
12921static void print_verification_stats(struct bpf_verifier_env *env)
12922{
12923 int i;
12924
12925 if (env->log.level & BPF_LOG_STATS) {
12926 verbose(env, "verification time %lld usec\n",
12927 div_u64(env->verification_time, 1000));
12928 verbose(env, "stack depth ");
12929 for (i = 0; i < env->subprog_cnt; i++) {
12930 u32 depth = env->subprog_info[i].stack_depth;
12931
12932 verbose(env, "%d", depth);
12933 if (i + 1 < env->subprog_cnt)
12934 verbose(env, "+");
12935 }
12936 verbose(env, "\n");
12937 }
12938 verbose(env, "processed %d insns (limit %d) max_states_per_insn %d "
12939 "total_states %d peak_states %d mark_read %d\n",
12940 env->insn_processed, BPF_COMPLEXITY_LIMIT_INSNS,
12941 env->max_states_per_insn, env->total_states,
12942 env->peak_states, env->longest_mark_read_walk);
12943}
12944
12945static int check_struct_ops_btf_id(struct bpf_verifier_env *env)
12946{
12947 const struct btf_type *t, *func_proto;
12948 const struct bpf_struct_ops *st_ops;
12949 const struct btf_member *member;
12950 struct bpf_prog *prog = env->prog;
12951 u32 btf_id, member_idx;
12952 const char *mname;
12953
12954 if (!prog->gpl_compatible) {
12955 verbose(env, "struct ops programs must have a GPL compatible license\n");
12956 return -EINVAL;
12957 }
12958
12959 btf_id = prog->aux->attach_btf_id;
12960 st_ops = bpf_struct_ops_find(btf_id);
12961 if (!st_ops) {
12962 verbose(env, "attach_btf_id %u is not a supported struct\n",
12963 btf_id);
12964 return -ENOTSUPP;
12965 }
12966
12967 t = st_ops->type;
12968 member_idx = prog->expected_attach_type;
12969 if (member_idx >= btf_type_vlen(t)) {
12970 verbose(env, "attach to invalid member idx %u of struct %s\n",
12971 member_idx, st_ops->name);
12972 return -EINVAL;
12973 }
12974
12975 member = &btf_type_member(t)[member_idx];
12976 mname = btf_name_by_offset(btf_vmlinux, member->name_off);
12977 func_proto = btf_type_resolve_func_ptr(btf_vmlinux, member->type,
12978 NULL);
12979 if (!func_proto) {
12980 verbose(env, "attach to invalid member %s(@idx %u) of struct %s\n",
12981 mname, member_idx, st_ops->name);
12982 return -EINVAL;
12983 }
12984
12985 if (st_ops->check_member) {
12986 int err = st_ops->check_member(t, member);
12987
12988 if (err) {
12989 verbose(env, "attach to unsupported member %s of struct %s\n",
12990 mname, st_ops->name);
12991 return err;
12992 }
12993 }
12994
12995 prog->aux->attach_func_proto = func_proto;
12996 prog->aux->attach_func_name = mname;
12997 env->ops = st_ops->verifier_ops;
12998
12999 return 0;
13000}
13001#define SECURITY_PREFIX "security_"
13002
13003static int check_attach_modify_return(unsigned long addr, const char *func_name)
13004{
13005 if (within_error_injection_list(addr) ||
13006 !strncmp(SECURITY_PREFIX, func_name, sizeof(SECURITY_PREFIX) - 1))
13007 return 0;
13008
13009 return -EINVAL;
13010}
13011
13012
13013
13014
13015BTF_SET_START(btf_non_sleepable_error_inject)
13016
13017
13018
13019BTF_ID(func, __add_to_page_cache_locked)
13020BTF_ID(func, should_fail_alloc_page)
13021BTF_ID(func, should_failslab)
13022BTF_SET_END(btf_non_sleepable_error_inject)
13023
13024static int check_non_sleepable_error_inject(u32 btf_id)
13025{
13026 return btf_id_set_contains(&btf_non_sleepable_error_inject, btf_id);
13027}
13028
13029int bpf_check_attach_target(struct bpf_verifier_log *log,
13030 const struct bpf_prog *prog,
13031 const struct bpf_prog *tgt_prog,
13032 u32 btf_id,
13033 struct bpf_attach_target_info *tgt_info)
13034{
13035 bool prog_extension = prog->type == BPF_PROG_TYPE_EXT;
13036 const char prefix[] = "btf_trace_";
13037 int ret = 0, subprog = -1, i;
13038 const struct btf_type *t;
13039 bool conservative = true;
13040 const char *tname;
13041 struct btf *btf;
13042 long addr = 0;
13043
13044 if (!btf_id) {
13045 bpf_log(log, "Tracing programs must provide btf_id\n");
13046 return -EINVAL;
13047 }
13048 btf = tgt_prog ? tgt_prog->aux->btf : prog->aux->attach_btf;
13049 if (!btf) {
13050 bpf_log(log,
13051 "FENTRY/FEXIT program can only be attached to another program annotated with BTF\n");
13052 return -EINVAL;
13053 }
13054 t = btf_type_by_id(btf, btf_id);
13055 if (!t) {
13056 bpf_log(log, "attach_btf_id %u is invalid\n", btf_id);
13057 return -EINVAL;
13058 }
13059 tname = btf_name_by_offset(btf, t->name_off);
13060 if (!tname) {
13061 bpf_log(log, "attach_btf_id %u doesn't have a name\n", btf_id);
13062 return -EINVAL;
13063 }
13064 if (tgt_prog) {
13065 struct bpf_prog_aux *aux = tgt_prog->aux;
13066
13067 for (i = 0; i < aux->func_info_cnt; i++)
13068 if (aux->func_info[i].type_id == btf_id) {
13069 subprog = i;
13070 break;
13071 }
13072 if (subprog == -1) {
13073 bpf_log(log, "Subprog %s doesn't exist\n", tname);
13074 return -EINVAL;
13075 }
13076 conservative = aux->func_info_aux[subprog].unreliable;
13077 if (prog_extension) {
13078 if (conservative) {
13079 bpf_log(log,
13080 "Cannot replace static functions\n");
13081 return -EINVAL;
13082 }
13083 if (!prog->jit_requested) {
13084 bpf_log(log,
13085 "Extension programs should be JITed\n");
13086 return -EINVAL;
13087 }
13088 }
13089 if (!tgt_prog->jited) {
13090 bpf_log(log, "Can attach to only JITed progs\n");
13091 return -EINVAL;
13092 }
13093 if (tgt_prog->type == prog->type) {
13094
13095
13096
13097
13098 bpf_log(log, "Cannot recursively attach\n");
13099 return -EINVAL;
13100 }
13101 if (tgt_prog->type == BPF_PROG_TYPE_TRACING &&
13102 prog_extension &&
13103 (tgt_prog->expected_attach_type == BPF_TRACE_FENTRY ||
13104 tgt_prog->expected_attach_type == BPF_TRACE_FEXIT)) {
13105
13106
13107
13108
13109
13110
13111
13112
13113
13114
13115
13116
13117
13118
13119
13120 bpf_log(log, "Cannot extend fentry/fexit\n");
13121 return -EINVAL;
13122 }
13123 } else {
13124 if (prog_extension) {
13125 bpf_log(log, "Cannot replace kernel functions\n");
13126 return -EINVAL;
13127 }
13128 }
13129
13130 switch (prog->expected_attach_type) {
13131 case BPF_TRACE_RAW_TP:
13132 if (tgt_prog) {
13133 bpf_log(log,
13134 "Only FENTRY/FEXIT progs are attachable to another BPF prog\n");
13135 return -EINVAL;
13136 }
13137 if (!btf_type_is_typedef(t)) {
13138 bpf_log(log, "attach_btf_id %u is not a typedef\n",
13139 btf_id);
13140 return -EINVAL;
13141 }
13142 if (strncmp(prefix, tname, sizeof(prefix) - 1)) {
13143 bpf_log(log, "attach_btf_id %u points to wrong type name %s\n",
13144 btf_id, tname);
13145 return -EINVAL;
13146 }
13147 tname += sizeof(prefix) - 1;
13148 t = btf_type_by_id(btf, t->type);
13149 if (!btf_type_is_ptr(t))
13150
13151 return -EINVAL;
13152 t = btf_type_by_id(btf, t->type);
13153 if (!btf_type_is_func_proto(t))
13154
13155 return -EINVAL;
13156
13157 break;
13158 case BPF_TRACE_ITER:
13159 if (!btf_type_is_func(t)) {
13160 bpf_log(log, "attach_btf_id %u is not a function\n",
13161 btf_id);
13162 return -EINVAL;
13163 }
13164 t = btf_type_by_id(btf, t->type);
13165 if (!btf_type_is_func_proto(t))
13166 return -EINVAL;
13167 ret = btf_distill_func_proto(log, btf, t, tname, &tgt_info->fmodel);
13168 if (ret)
13169 return ret;
13170 break;
13171 default:
13172 if (!prog_extension)
13173 return -EINVAL;
13174 fallthrough;
13175 case BPF_MODIFY_RETURN:
13176 case BPF_LSM_MAC:
13177 case BPF_TRACE_FENTRY:
13178 case BPF_TRACE_FEXIT:
13179 if (!btf_type_is_func(t)) {
13180 bpf_log(log, "attach_btf_id %u is not a function\n",
13181 btf_id);
13182 return -EINVAL;
13183 }
13184 if (prog_extension &&
13185 btf_check_type_match(log, prog, btf, t))
13186 return -EINVAL;
13187 t = btf_type_by_id(btf, t->type);
13188 if (!btf_type_is_func_proto(t))
13189 return -EINVAL;
13190
13191 if ((prog->aux->saved_dst_prog_type || prog->aux->saved_dst_attach_type) &&
13192 (!tgt_prog || prog->aux->saved_dst_prog_type != tgt_prog->type ||
13193 prog->aux->saved_dst_attach_type != tgt_prog->expected_attach_type))
13194 return -EINVAL;
13195
13196 if (tgt_prog && conservative)
13197 t = NULL;
13198
13199 ret = btf_distill_func_proto(log, btf, t, tname, &tgt_info->fmodel);
13200 if (ret < 0)
13201 return ret;
13202
13203 if (tgt_prog) {
13204 if (subprog == 0)
13205 addr = (long) tgt_prog->bpf_func;
13206 else
13207 addr = (long) tgt_prog->aux->func[subprog]->bpf_func;
13208 } else {
13209 addr = kallsyms_lookup_name(tname);
13210 if (!addr) {
13211 bpf_log(log,
13212 "The address of function %s cannot be found\n",
13213 tname);
13214 return -ENOENT;
13215 }
13216 }
13217
13218 if (prog->aux->sleepable) {
13219 ret = -EINVAL;
13220 switch (prog->type) {
13221 case BPF_PROG_TYPE_TRACING:
13222
13223
13224
13225 if (!check_non_sleepable_error_inject(btf_id) &&
13226 within_error_injection_list(addr))
13227 ret = 0;
13228 break;
13229 case BPF_PROG_TYPE_LSM:
13230
13231
13232
13233 if (bpf_lsm_is_sleepable_hook(btf_id))
13234 ret = 0;
13235 break;
13236 default:
13237 break;
13238 }
13239 if (ret) {
13240 bpf_log(log, "%s is not sleepable\n", tname);
13241 return ret;
13242 }
13243 } else if (prog->expected_attach_type == BPF_MODIFY_RETURN) {
13244 if (tgt_prog) {
13245 bpf_log(log, "can't modify return codes of BPF programs\n");
13246 return -EINVAL;
13247 }
13248 ret = check_attach_modify_return(addr, tname);
13249 if (ret) {
13250 bpf_log(log, "%s() is not modifiable\n", tname);
13251 return ret;
13252 }
13253 }
13254
13255 break;
13256 }
13257 tgt_info->tgt_addr = addr;
13258 tgt_info->tgt_name = tname;
13259 tgt_info->tgt_type = t;
13260 return 0;
13261}
13262
13263BTF_SET_START(btf_id_deny)
13264BTF_ID_UNUSED
13265#ifdef CONFIG_SMP
13266BTF_ID(func, migrate_disable)
13267BTF_ID(func, migrate_enable)
13268#endif
13269#if !defined CONFIG_PREEMPT_RCU && !defined CONFIG_TINY_RCU
13270BTF_ID(func, rcu_read_unlock_strict)
13271#endif
13272BTF_SET_END(btf_id_deny)
13273
13274static int check_attach_btf_id(struct bpf_verifier_env *env)
13275{
13276 struct bpf_prog *prog = env->prog;
13277 struct bpf_prog *tgt_prog = prog->aux->dst_prog;
13278 struct bpf_attach_target_info tgt_info = {};
13279 u32 btf_id = prog->aux->attach_btf_id;
13280 struct bpf_trampoline *tr;
13281 int ret;
13282 u64 key;
13283
13284 if (prog->aux->sleepable && prog->type != BPF_PROG_TYPE_TRACING &&
13285 prog->type != BPF_PROG_TYPE_LSM) {
13286 verbose(env, "Only fentry/fexit/fmod_ret and lsm programs can be sleepable\n");
13287 return -EINVAL;
13288 }
13289
13290 if (prog->type == BPF_PROG_TYPE_STRUCT_OPS)
13291 return check_struct_ops_btf_id(env);
13292
13293 if (prog->type != BPF_PROG_TYPE_TRACING &&
13294 prog->type != BPF_PROG_TYPE_LSM &&
13295 prog->type != BPF_PROG_TYPE_EXT)
13296 return 0;
13297
13298 ret = bpf_check_attach_target(&env->log, prog, tgt_prog, btf_id, &tgt_info);
13299 if (ret)
13300 return ret;
13301
13302 if (tgt_prog && prog->type == BPF_PROG_TYPE_EXT) {
13303
13304
13305
13306
13307 env->ops = bpf_verifier_ops[tgt_prog->type];
13308 prog->expected_attach_type = tgt_prog->expected_attach_type;
13309 }
13310
13311
13312 prog->aux->attach_func_proto = tgt_info.tgt_type;
13313 prog->aux->attach_func_name = tgt_info.tgt_name;
13314
13315 if (tgt_prog) {
13316 prog->aux->saved_dst_prog_type = tgt_prog->type;
13317 prog->aux->saved_dst_attach_type = tgt_prog->expected_attach_type;
13318 }
13319
13320 if (prog->expected_attach_type == BPF_TRACE_RAW_TP) {
13321 prog->aux->attach_btf_trace = true;
13322 return 0;
13323 } else if (prog->expected_attach_type == BPF_TRACE_ITER) {
13324 if (!bpf_iter_prog_supported(prog))
13325 return -EINVAL;
13326 return 0;
13327 }
13328
13329 if (prog->type == BPF_PROG_TYPE_LSM) {
13330 ret = bpf_lsm_verify_prog(&env->log, prog);
13331 if (ret < 0)
13332 return ret;
13333 } else if (prog->type == BPF_PROG_TYPE_TRACING &&
13334 btf_id_set_contains(&btf_id_deny, btf_id)) {
13335 return -EINVAL;
13336 }
13337
13338 key = bpf_trampoline_compute_key(tgt_prog, prog->aux->attach_btf, btf_id);
13339 tr = bpf_trampoline_get(key, &tgt_info);
13340 if (!tr)
13341 return -ENOMEM;
13342
13343 prog->aux->dst_trampoline = tr;
13344 return 0;
13345}
13346
13347struct btf *bpf_get_btf_vmlinux(void)
13348{
13349 if (!btf_vmlinux && IS_ENABLED(CONFIG_DEBUG_INFO_BTF)) {
13350 mutex_lock(&bpf_verifier_lock);
13351 if (!btf_vmlinux)
13352 btf_vmlinux = btf_parse_vmlinux();
13353 mutex_unlock(&bpf_verifier_lock);
13354 }
13355 return btf_vmlinux;
13356}
13357
13358int bpf_check(struct bpf_prog **prog, union bpf_attr *attr,
13359 union bpf_attr __user *uattr)
13360{
13361 u64 start_time = ktime_get_ns();
13362 struct bpf_verifier_env *env;
13363 struct bpf_verifier_log *log;
13364 int i, len, ret = -EINVAL;
13365 bool is_priv;
13366
13367
13368 if (ARRAY_SIZE(bpf_verifier_ops) == 0)
13369 return -EINVAL;
13370
13371
13372
13373
13374 env = kzalloc(sizeof(struct bpf_verifier_env), GFP_KERNEL);
13375 if (!env)
13376 return -ENOMEM;
13377 log = &env->log;
13378
13379 len = (*prog)->len;
13380 env->insn_aux_data =
13381 vzalloc(array_size(sizeof(struct bpf_insn_aux_data), len));
13382 ret = -ENOMEM;
13383 if (!env->insn_aux_data)
13384 goto err_free_env;
13385 for (i = 0; i < len; i++)
13386 env->insn_aux_data[i].orig_idx = i;
13387 env->prog = *prog;
13388 env->ops = bpf_verifier_ops[env->prog->type];
13389 is_priv = bpf_capable();
13390
13391 bpf_get_btf_vmlinux();
13392
13393
13394 if (!is_priv)
13395 mutex_lock(&bpf_verifier_lock);
13396
13397 if (attr->log_level || attr->log_buf || attr->log_size) {
13398
13399
13400
13401 log->level = attr->log_level;
13402 log->ubuf = (char __user *) (unsigned long) attr->log_buf;
13403 log->len_total = attr->log_size;
13404
13405 ret = -EINVAL;
13406
13407 if (log->len_total < 128 || log->len_total > UINT_MAX >> 2 ||
13408 !log->level || !log->ubuf || log->level & ~BPF_LOG_MASK)
13409 goto err_unlock;
13410 }
13411
13412 if (IS_ERR(btf_vmlinux)) {
13413
13414 verbose(env, "in-kernel BTF is malformed\n");
13415 ret = PTR_ERR(btf_vmlinux);
13416 goto skip_full_check;
13417 }
13418
13419 env->strict_alignment = !!(attr->prog_flags & BPF_F_STRICT_ALIGNMENT);
13420 if (!IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS))
13421 env->strict_alignment = true;
13422 if (attr->prog_flags & BPF_F_ANY_ALIGNMENT)
13423 env->strict_alignment = false;
13424
13425 env->allow_ptr_leaks = bpf_allow_ptr_leaks();
13426 env->allow_uninit_stack = bpf_allow_uninit_stack();
13427 env->allow_ptr_to_map_access = bpf_allow_ptr_to_map_access();
13428 env->bypass_spec_v1 = bpf_bypass_spec_v1();
13429 env->bypass_spec_v4 = bpf_bypass_spec_v4();
13430 env->bpf_capable = bpf_capable();
13431
13432 if (is_priv)
13433 env->test_state_freq = attr->prog_flags & BPF_F_TEST_STATE_FREQ;
13434
13435 env->explored_states = kvcalloc(state_htab_size(env),
13436 sizeof(struct bpf_verifier_state_list *),
13437 GFP_USER);
13438 ret = -ENOMEM;
13439 if (!env->explored_states)
13440 goto skip_full_check;
13441
13442 ret = add_subprog_and_kfunc(env);
13443 if (ret < 0)
13444 goto skip_full_check;
13445
13446 ret = check_subprogs(env);
13447 if (ret < 0)
13448 goto skip_full_check;
13449
13450 ret = check_btf_info(env, attr, uattr);
13451 if (ret < 0)
13452 goto skip_full_check;
13453
13454 ret = check_attach_btf_id(env);
13455 if (ret)
13456 goto skip_full_check;
13457
13458 ret = resolve_pseudo_ldimm64(env);
13459 if (ret < 0)
13460 goto skip_full_check;
13461
13462 if (bpf_prog_is_dev_bound(env->prog->aux)) {
13463 ret = bpf_prog_offload_verifier_prep(env->prog);
13464 if (ret)
13465 goto skip_full_check;
13466 }
13467
13468 ret = check_cfg(env);
13469 if (ret < 0)
13470 goto skip_full_check;
13471
13472 ret = do_check_subprogs(env);
13473 ret = ret ?: do_check_main(env);
13474
13475 if (ret == 0 && bpf_prog_is_dev_bound(env->prog->aux))
13476 ret = bpf_prog_offload_finalize(env);
13477
13478skip_full_check:
13479 kvfree(env->explored_states);
13480
13481 if (ret == 0)
13482 ret = check_max_stack_depth(env);
13483
13484
13485 if (is_priv) {
13486 if (ret == 0)
13487 opt_hard_wire_dead_code_branches(env);
13488 if (ret == 0)
13489 ret = opt_remove_dead_code(env);
13490 if (ret == 0)
13491 ret = opt_remove_nops(env);
13492 } else {
13493 if (ret == 0)
13494 sanitize_dead_code(env);
13495 }
13496
13497 if (ret == 0)
13498
13499 ret = convert_ctx_accesses(env);
13500
13501 if (ret == 0)
13502 ret = do_misc_fixups(env);
13503
13504
13505
13506
13507 if (ret == 0 && !bpf_prog_is_dev_bound(env->prog->aux)) {
13508 ret = opt_subreg_zext_lo32_rnd_hi32(env, attr);
13509 env->prog->aux->verifier_zext = bpf_jit_needs_zext() ? !ret
13510 : false;
13511 }
13512
13513 if (ret == 0)
13514 ret = fixup_call_args(env);
13515
13516 env->verification_time = ktime_get_ns() - start_time;
13517 print_verification_stats(env);
13518
13519 if (log->level && bpf_verifier_log_full(log))
13520 ret = -ENOSPC;
13521 if (log->level && !log->ubuf) {
13522 ret = -EFAULT;
13523 goto err_release_maps;
13524 }
13525
13526 if (ret)
13527 goto err_release_maps;
13528
13529 if (env->used_map_cnt) {
13530
13531 env->prog->aux->used_maps = kmalloc_array(env->used_map_cnt,
13532 sizeof(env->used_maps[0]),
13533 GFP_KERNEL);
13534
13535 if (!env->prog->aux->used_maps) {
13536 ret = -ENOMEM;
13537 goto err_release_maps;
13538 }
13539
13540 memcpy(env->prog->aux->used_maps, env->used_maps,
13541 sizeof(env->used_maps[0]) * env->used_map_cnt);
13542 env->prog->aux->used_map_cnt = env->used_map_cnt;
13543 }
13544 if (env->used_btf_cnt) {
13545
13546 env->prog->aux->used_btfs = kmalloc_array(env->used_btf_cnt,
13547 sizeof(env->used_btfs[0]),
13548 GFP_KERNEL);
13549 if (!env->prog->aux->used_btfs) {
13550 ret = -ENOMEM;
13551 goto err_release_maps;
13552 }
13553
13554 memcpy(env->prog->aux->used_btfs, env->used_btfs,
13555 sizeof(env->used_btfs[0]) * env->used_btf_cnt);
13556 env->prog->aux->used_btf_cnt = env->used_btf_cnt;
13557 }
13558 if (env->used_map_cnt || env->used_btf_cnt) {
13559
13560
13561
13562 convert_pseudo_ld_imm64(env);
13563 }
13564
13565 adjust_btf_func(env);
13566
13567err_release_maps:
13568 if (!env->prog->aux->used_maps)
13569
13570
13571
13572 release_maps(env);
13573 if (!env->prog->aux->used_btfs)
13574 release_btfs(env);
13575
13576
13577
13578
13579 if (env->prog->type == BPF_PROG_TYPE_EXT)
13580 env->prog->expected_attach_type = 0;
13581
13582 *prog = env->prog;
13583err_unlock:
13584 if (!is_priv)
13585 mutex_unlock(&bpf_verifier_lock);
13586 vfree(env->insn_aux_data);
13587err_free_env:
13588 kfree(env);
13589 return ret;
13590}
13591