Skip to content

Commit ae90f6a

Browse files
committed
Merge tag 'bpf-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf
Pull bpf fixes from Daniel Borkmann: - Fix an out-of-bounds read in bpf_link_show_fdinfo for BPF sockmap link file descriptors (Hou Tao) - Fix BPF arm64 JIT's address emission with tag-based KASAN enabled reserving not enough size (Peter Collingbourne) - Fix BPF verifier do_misc_fixups patching for inlining of the bpf_get_branch_snapshot BPF helper (Andrii Nakryiko) - Fix a BPF verifier bug and reject BPF program write attempts into read-only marked BPF maps (Daniel Borkmann) - Fix perf_event_detach_bpf_prog error handling by removing an invalid check which would skip BPF program release (Jiri Olsa) - Fix memory leak when parsing mount options for the BPF filesystem (Hou Tao) * tag 'bpf-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf: bpf: Check validity of link->type in bpf_link_show_fdinfo() bpf: Add the missing BPF_LINK_TYPE invocation for sockmap bpf: fix do_misc_fixups() for bpf_get_branch_snapshot() bpf,perf: Fix perf_event_detach_bpf_prog error handling selftests/bpf: Add test for passing in uninit mtu_len selftests/bpf: Add test for writes to .rodata bpf: Remove MEM_UNINIT from skb/xdp MTU helpers bpf: Fix overloading of MEM_UNINIT's meaning bpf: Add MEM_WRITE attribute bpf: Preserve param->string when parsing mount options bpf, arm64: Fix address emission with tag-based KASAN enabled
2 parents d44cd82 + d5fb316 commit ae90f6a

File tree

15 files changed

+167
-90
lines changed

15 files changed

+167
-90
lines changed

arch/arm64/net/bpf_jit_comp.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2220,7 +2220,11 @@ static int prepare_trampoline(struct jit_ctx *ctx, struct bpf_tramp_image *im,
22202220
emit(A64_STR64I(A64_R(20), A64_SP, regs_off + 8), ctx);
22212221

22222222
if (flags & BPF_TRAMP_F_CALL_ORIG) {
2223-
emit_a64_mov_i64(A64_R(0), (const u64)im, ctx);
2223+
/* for the first pass, assume the worst case */
2224+
if (!ctx->image)
2225+
ctx->idx += 4;
2226+
else
2227+
emit_a64_mov_i64(A64_R(0), (const u64)im, ctx);
22242228
emit_call((const u64)__bpf_tramp_enter, ctx);
22252229
}
22262230

@@ -2264,7 +2268,11 @@ static int prepare_trampoline(struct jit_ctx *ctx, struct bpf_tramp_image *im,
22642268

22652269
if (flags & BPF_TRAMP_F_CALL_ORIG) {
22662270
im->ip_epilogue = ctx->ro_image + ctx->idx;
2267-
emit_a64_mov_i64(A64_R(0), (const u64)im, ctx);
2271+
/* for the first pass, assume the worst case */
2272+
if (!ctx->image)
2273+
ctx->idx += 4;
2274+
else
2275+
emit_a64_mov_i64(A64_R(0), (const u64)im, ctx);
22682276
emit_call((const u64)__bpf_tramp_exit, ctx);
22692277
}
22702278

include/linux/bpf.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,7 @@ enum bpf_type_flag {
635635
*/
636636
PTR_UNTRUSTED = BIT(6 + BPF_BASE_TYPE_BITS),
637637

638+
/* MEM can be uninitialized. */
638639
MEM_UNINIT = BIT(7 + BPF_BASE_TYPE_BITS),
639640

640641
/* DYNPTR points to memory local to the bpf program. */
@@ -700,6 +701,13 @@ enum bpf_type_flag {
700701
*/
701702
MEM_ALIGNED = BIT(17 + BPF_BASE_TYPE_BITS),
702703

704+
/* MEM is being written to, often combined with MEM_UNINIT. Non-presence
705+
* of MEM_WRITE means that MEM is only being read. MEM_WRITE without the
706+
* MEM_UNINIT means that memory needs to be initialized since it is also
707+
* read.
708+
*/
709+
MEM_WRITE = BIT(18 + BPF_BASE_TYPE_BITS),
710+
703711
__BPF_TYPE_FLAG_MAX,
704712
__BPF_TYPE_LAST_FLAG = __BPF_TYPE_FLAG_MAX - 1,
705713
};
@@ -758,10 +766,10 @@ enum bpf_arg_type {
758766
ARG_PTR_TO_SOCKET_OR_NULL = PTR_MAYBE_NULL | ARG_PTR_TO_SOCKET,
759767
ARG_PTR_TO_STACK_OR_NULL = PTR_MAYBE_NULL | ARG_PTR_TO_STACK,
760768
ARG_PTR_TO_BTF_ID_OR_NULL = PTR_MAYBE_NULL | ARG_PTR_TO_BTF_ID,
761-
/* pointer to memory does not need to be initialized, helper function must fill
762-
* all bytes or clear them in error case.
769+
/* Pointer to memory does not need to be initialized, since helper function
770+
* fills all bytes or clears them in error case.
763771
*/
764-
ARG_PTR_TO_UNINIT_MEM = MEM_UNINIT | ARG_PTR_TO_MEM,
772+
ARG_PTR_TO_UNINIT_MEM = MEM_UNINIT | MEM_WRITE | ARG_PTR_TO_MEM,
765773
/* Pointer to valid memory of size known at compile time. */
766774
ARG_PTR_TO_FIXED_SIZE_MEM = MEM_FIXED_SIZE | ARG_PTR_TO_MEM,
767775

include/linux/bpf_types.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ BPF_LINK_TYPE(BPF_LINK_TYPE_XDP, xdp)
146146
BPF_LINK_TYPE(BPF_LINK_TYPE_NETFILTER, netfilter)
147147
BPF_LINK_TYPE(BPF_LINK_TYPE_TCX, tcx)
148148
BPF_LINK_TYPE(BPF_LINK_TYPE_NETKIT, netkit)
149+
BPF_LINK_TYPE(BPF_LINK_TYPE_SOCKMAP, sockmap)
149150
#endif
150151
#ifdef CONFIG_PERF_EVENTS
151152
BPF_LINK_TYPE(BPF_LINK_TYPE_PERF_EVENT, perf)

include/uapi/linux/bpf.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1121,6 +1121,9 @@ enum bpf_attach_type {
11211121

11221122
#define MAX_BPF_ATTACH_TYPE __MAX_BPF_ATTACH_TYPE
11231123

1124+
/* Add BPF_LINK_TYPE(type, name) in bpf_types.h to keep bpf_link_type_strs[]
1125+
* in sync with the definitions below.
1126+
*/
11241127
enum bpf_link_type {
11251128
BPF_LINK_TYPE_UNSPEC = 0,
11261129
BPF_LINK_TYPE_RAW_TRACEPOINT = 1,

kernel/bpf/helpers.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ const struct bpf_func_proto bpf_map_pop_elem_proto = {
111111
.gpl_only = false,
112112
.ret_type = RET_INTEGER,
113113
.arg1_type = ARG_CONST_MAP_PTR,
114-
.arg2_type = ARG_PTR_TO_MAP_VALUE | MEM_UNINIT,
114+
.arg2_type = ARG_PTR_TO_MAP_VALUE | MEM_UNINIT | MEM_WRITE,
115115
};
116116

117117
BPF_CALL_2(bpf_map_peek_elem, struct bpf_map *, map, void *, value)
@@ -124,7 +124,7 @@ const struct bpf_func_proto bpf_map_peek_elem_proto = {
124124
.gpl_only = false,
125125
.ret_type = RET_INTEGER,
126126
.arg1_type = ARG_CONST_MAP_PTR,
127-
.arg2_type = ARG_PTR_TO_MAP_VALUE | MEM_UNINIT,
127+
.arg2_type = ARG_PTR_TO_MAP_VALUE | MEM_UNINIT | MEM_WRITE,
128128
};
129129

130130
BPF_CALL_3(bpf_map_lookup_percpu_elem, struct bpf_map *, map, void *, key, u32, cpu)
@@ -538,7 +538,7 @@ const struct bpf_func_proto bpf_strtol_proto = {
538538
.arg1_type = ARG_PTR_TO_MEM | MEM_RDONLY,
539539
.arg2_type = ARG_CONST_SIZE,
540540
.arg3_type = ARG_ANYTHING,
541-
.arg4_type = ARG_PTR_TO_FIXED_SIZE_MEM | MEM_UNINIT | MEM_ALIGNED,
541+
.arg4_type = ARG_PTR_TO_FIXED_SIZE_MEM | MEM_UNINIT | MEM_WRITE | MEM_ALIGNED,
542542
.arg4_size = sizeof(s64),
543543
};
544544

@@ -566,7 +566,7 @@ const struct bpf_func_proto bpf_strtoul_proto = {
566566
.arg1_type = ARG_PTR_TO_MEM | MEM_RDONLY,
567567
.arg2_type = ARG_CONST_SIZE,
568568
.arg3_type = ARG_ANYTHING,
569-
.arg4_type = ARG_PTR_TO_FIXED_SIZE_MEM | MEM_UNINIT | MEM_ALIGNED,
569+
.arg4_type = ARG_PTR_TO_FIXED_SIZE_MEM | MEM_UNINIT | MEM_WRITE | MEM_ALIGNED,
570570
.arg4_size = sizeof(u64),
571571
};
572572

@@ -1742,7 +1742,7 @@ static const struct bpf_func_proto bpf_dynptr_from_mem_proto = {
17421742
.arg1_type = ARG_PTR_TO_UNINIT_MEM,
17431743
.arg2_type = ARG_CONST_SIZE_OR_ZERO,
17441744
.arg3_type = ARG_ANYTHING,
1745-
.arg4_type = ARG_PTR_TO_DYNPTR | DYNPTR_TYPE_LOCAL | MEM_UNINIT,
1745+
.arg4_type = ARG_PTR_TO_DYNPTR | DYNPTR_TYPE_LOCAL | MEM_UNINIT | MEM_WRITE,
17461746
};
17471747

17481748
BPF_CALL_5(bpf_dynptr_read, void *, dst, u32, len, const struct bpf_dynptr_kern *, src,

kernel/bpf/inode.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -880,7 +880,7 @@ static int bpf_parse_param(struct fs_context *fc, struct fs_parameter *param)
880880
const struct btf_type *enum_t;
881881
const char *enum_pfx;
882882
u64 *delegate_msk, msk = 0;
883-
char *p;
883+
char *p, *str;
884884
int val;
885885

886886
/* ignore errors, fallback to hex */
@@ -911,7 +911,8 @@ static int bpf_parse_param(struct fs_context *fc, struct fs_parameter *param)
911911
return -EINVAL;
912912
}
913913

914-
while ((p = strsep(&param->string, ":"))) {
914+
str = param->string;
915+
while ((p = strsep(&str, ":"))) {
915916
if (strcmp(p, "any") == 0) {
916917
msk |= ~0ULL;
917918
} else if (find_btf_enum_const(info.btf, enum_t, enum_pfx, p, &val)) {

kernel/bpf/ringbuf.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -632,7 +632,7 @@ const struct bpf_func_proto bpf_ringbuf_reserve_dynptr_proto = {
632632
.arg1_type = ARG_CONST_MAP_PTR,
633633
.arg2_type = ARG_ANYTHING,
634634
.arg3_type = ARG_ANYTHING,
635-
.arg4_type = ARG_PTR_TO_DYNPTR | DYNPTR_TYPE_RINGBUF | MEM_UNINIT,
635+
.arg4_type = ARG_PTR_TO_DYNPTR | DYNPTR_TYPE_RINGBUF | MEM_UNINIT | MEM_WRITE,
636636
};
637637

638638
BPF_CALL_2(bpf_ringbuf_submit_dynptr, struct bpf_dynptr_kern *, ptr, u64, flags)

kernel/bpf/syscall.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3069,13 +3069,17 @@ static void bpf_link_show_fdinfo(struct seq_file *m, struct file *filp)
30693069
{
30703070
const struct bpf_link *link = filp->private_data;
30713071
const struct bpf_prog *prog = link->prog;
3072+
enum bpf_link_type type = link->type;
30723073
char prog_tag[sizeof(prog->tag) * 2 + 1] = { };
30733074

3074-
seq_printf(m,
3075-
"link_type:\t%s\n"
3076-
"link_id:\t%u\n",
3077-
bpf_link_type_strs[link->type],
3078-
link->id);
3075+
if (type < ARRAY_SIZE(bpf_link_type_strs) && bpf_link_type_strs[type]) {
3076+
seq_printf(m, "link_type:\t%s\n", bpf_link_type_strs[type]);
3077+
} else {
3078+
WARN_ONCE(1, "missing BPF_LINK_TYPE(...) for link type %u\n", type);
3079+
seq_printf(m, "link_type:\t<%u>\n", type);
3080+
}
3081+
seq_printf(m, "link_id:\t%u\n", link->id);
3082+
30793083
if (prog) {
30803084
bin2hex(prog_tag, prog->tag, sizeof(prog->tag));
30813085
seq_printf(m,
@@ -5892,7 +5896,7 @@ static const struct bpf_func_proto bpf_kallsyms_lookup_name_proto = {
58925896
.arg1_type = ARG_PTR_TO_MEM,
58935897
.arg2_type = ARG_CONST_SIZE_OR_ZERO,
58945898
.arg3_type = ARG_ANYTHING,
5895-
.arg4_type = ARG_PTR_TO_FIXED_SIZE_MEM | MEM_UNINIT | MEM_ALIGNED,
5899+
.arg4_type = ARG_PTR_TO_FIXED_SIZE_MEM | MEM_UNINIT | MEM_WRITE | MEM_ALIGNED,
58965900
.arg4_size = sizeof(u64),
58975901
};
58985902

kernel/bpf/verifier.c

Lines changed: 36 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -7438,7 +7438,8 @@ static int check_stack_range_initialized(
74387438
}
74397439

74407440
static int check_helper_mem_access(struct bpf_verifier_env *env, int regno,
7441-
int access_size, bool zero_size_allowed,
7441+
int access_size, enum bpf_access_type access_type,
7442+
bool zero_size_allowed,
74427443
struct bpf_call_arg_meta *meta)
74437444
{
74447445
struct bpf_reg_state *regs = cur_regs(env), *reg = &regs[regno];
@@ -7450,23 +7451,21 @@ static int check_helper_mem_access(struct bpf_verifier_env *env, int regno,
74507451
return check_packet_access(env, regno, reg->off, access_size,
74517452
zero_size_allowed);
74527453
case PTR_TO_MAP_KEY:
7453-
if (meta && meta->raw_mode) {
7454+
if (access_type == BPF_WRITE) {
74547455
verbose(env, "R%d cannot write into %s\n", regno,
74557456
reg_type_str(env, reg->type));
74567457
return -EACCES;
74577458
}
74587459
return check_mem_region_access(env, regno, reg->off, access_size,
74597460
reg->map_ptr->key_size, false);
74607461
case PTR_TO_MAP_VALUE:
7461-
if (check_map_access_type(env, regno, reg->off, access_size,
7462-
meta && meta->raw_mode ? BPF_WRITE :
7463-
BPF_READ))
7462+
if (check_map_access_type(env, regno, reg->off, access_size, access_type))
74647463
return -EACCES;
74657464
return check_map_access(env, regno, reg->off, access_size,
74667465
zero_size_allowed, ACCESS_HELPER);
74677466
case PTR_TO_MEM:
74687467
if (type_is_rdonly_mem(reg->type)) {
7469-
if (meta && meta->raw_mode) {
7468+
if (access_type == BPF_WRITE) {
74707469
verbose(env, "R%d cannot write into %s\n", regno,
74717470
reg_type_str(env, reg->type));
74727471
return -EACCES;
@@ -7477,7 +7476,7 @@ static int check_helper_mem_access(struct bpf_verifier_env *env, int regno,
74777476
zero_size_allowed);
74787477
case PTR_TO_BUF:
74797478
if (type_is_rdonly_mem(reg->type)) {
7480-
if (meta && meta->raw_mode) {
7479+
if (access_type == BPF_WRITE) {
74817480
verbose(env, "R%d cannot write into %s\n", regno,
74827481
reg_type_str(env, reg->type));
74837482
return -EACCES;
@@ -7505,15 +7504,14 @@ static int check_helper_mem_access(struct bpf_verifier_env *env, int regno,
75057504
* Dynamically check it now.
75067505
*/
75077506
if (!env->ops->convert_ctx_access) {
7508-
enum bpf_access_type atype = meta && meta->raw_mode ? BPF_WRITE : BPF_READ;
75097507
int offset = access_size - 1;
75107508

75117509
/* Allow zero-byte read from PTR_TO_CTX */
75127510
if (access_size == 0)
75137511
return zero_size_allowed ? 0 : -EACCES;
75147512

75157513
return check_mem_access(env, env->insn_idx, regno, offset, BPF_B,
7516-
atype, -1, false, false);
7514+
access_type, -1, false, false);
75177515
}
75187516

75197517
fallthrough;
@@ -7538,6 +7536,7 @@ static int check_helper_mem_access(struct bpf_verifier_env *env, int regno,
75387536
*/
75397537
static int check_mem_size_reg(struct bpf_verifier_env *env,
75407538
struct bpf_reg_state *reg, u32 regno,
7539+
enum bpf_access_type access_type,
75417540
bool zero_size_allowed,
75427541
struct bpf_call_arg_meta *meta)
75437542
{
@@ -7553,15 +7552,12 @@ static int check_mem_size_reg(struct bpf_verifier_env *env,
75537552
*/
75547553
meta->msize_max_value = reg->umax_value;
75557554

7556-
/* The register is SCALAR_VALUE; the access check
7557-
* happens using its boundaries.
7555+
/* The register is SCALAR_VALUE; the access check happens using
7556+
* its boundaries. For unprivileged variable accesses, disable
7557+
* raw mode so that the program is required to initialize all
7558+
* the memory that the helper could just partially fill up.
75587559
*/
75597560
if (!tnum_is_const(reg->var_off))
7560-
/* For unprivileged variable accesses, disable raw
7561-
* mode so that the program is required to
7562-
* initialize all the memory that the helper could
7563-
* just partially fill up.
7564-
*/
75657561
meta = NULL;
75667562

75677563
if (reg->smin_value < 0) {
@@ -7581,9 +7577,8 @@ static int check_mem_size_reg(struct bpf_verifier_env *env,
75817577
regno);
75827578
return -EACCES;
75837579
}
7584-
err = check_helper_mem_access(env, regno - 1,
7585-
reg->umax_value,
7586-
zero_size_allowed, meta);
7580+
err = check_helper_mem_access(env, regno - 1, reg->umax_value,
7581+
access_type, zero_size_allowed, meta);
75877582
if (!err)
75887583
err = mark_chain_precision(env, regno);
75897584
return err;
@@ -7594,13 +7589,11 @@ static int check_mem_reg(struct bpf_verifier_env *env, struct bpf_reg_state *reg
75947589
{
75957590
bool may_be_null = type_may_be_null(reg->type);
75967591
struct bpf_reg_state saved_reg;
7597-
struct bpf_call_arg_meta meta;
75987592
int err;
75997593

76007594
if (register_is_null(reg))
76017595
return 0;
76027596

7603-
memset(&meta, 0, sizeof(meta));
76047597
/* Assuming that the register contains a value check if the memory
76057598
* access is safe. Temporarily save and restore the register's state as
76067599
* the conversion shouldn't be visible to a caller.
@@ -7610,10 +7603,8 @@ static int check_mem_reg(struct bpf_verifier_env *env, struct bpf_reg_state *reg
76107603
mark_ptr_not_null_reg(reg);
76117604
}
76127605

7613-
err = check_helper_mem_access(env, regno, mem_size, true, &meta);
7614-
/* Check access for BPF_WRITE */
7615-
meta.raw_mode = true;
7616-
err = err ?: check_helper_mem_access(env, regno, mem_size, true, &meta);
7606+
err = check_helper_mem_access(env, regno, mem_size, BPF_READ, true, NULL);
7607+
err = err ?: check_helper_mem_access(env, regno, mem_size, BPF_WRITE, true, NULL);
76177608

76187609
if (may_be_null)
76197610
*reg = saved_reg;
@@ -7639,13 +7630,12 @@ static int check_kfunc_mem_size_reg(struct bpf_verifier_env *env, struct bpf_reg
76397630
mark_ptr_not_null_reg(mem_reg);
76407631
}
76417632

7642-
err = check_mem_size_reg(env, reg, regno, true, &meta);
7643-
/* Check access for BPF_WRITE */
7644-
meta.raw_mode = true;
7645-
err = err ?: check_mem_size_reg(env, reg, regno, true, &meta);
7633+
err = check_mem_size_reg(env, reg, regno, BPF_READ, true, &meta);
7634+
err = err ?: check_mem_size_reg(env, reg, regno, BPF_WRITE, true, &meta);
76467635

76477636
if (may_be_null)
76487637
*mem_reg = saved_reg;
7638+
76497639
return err;
76507640
}
76517641

@@ -8948,9 +8938,8 @@ static int check_func_arg(struct bpf_verifier_env *env, u32 arg,
89488938
verbose(env, "invalid map_ptr to access map->key\n");
89498939
return -EACCES;
89508940
}
8951-
err = check_helper_mem_access(env, regno,
8952-
meta->map_ptr->key_size, false,
8953-
NULL);
8941+
err = check_helper_mem_access(env, regno, meta->map_ptr->key_size,
8942+
BPF_READ, false, NULL);
89548943
break;
89558944
case ARG_PTR_TO_MAP_VALUE:
89568945
if (type_may_be_null(arg_type) && register_is_null(reg))
@@ -8965,9 +8954,9 @@ static int check_func_arg(struct bpf_verifier_env *env, u32 arg,
89658954
return -EACCES;
89668955
}
89678956
meta->raw_mode = arg_type & MEM_UNINIT;
8968-
err = check_helper_mem_access(env, regno,
8969-
meta->map_ptr->value_size, false,
8970-
meta);
8957+
err = check_helper_mem_access(env, regno, meta->map_ptr->value_size,
8958+
arg_type & MEM_WRITE ? BPF_WRITE : BPF_READ,
8959+
false, meta);
89718960
break;
89728961
case ARG_PTR_TO_PERCPU_BTF_ID:
89738962
if (!reg->btf_id) {
@@ -9009,18 +8998,26 @@ static int check_func_arg(struct bpf_verifier_env *env, u32 arg,
90098998
*/
90108999
meta->raw_mode = arg_type & MEM_UNINIT;
90119000
if (arg_type & MEM_FIXED_SIZE) {
9012-
err = check_helper_mem_access(env, regno, fn->arg_size[arg], false, meta);
9001+
err = check_helper_mem_access(env, regno, fn->arg_size[arg],
9002+
arg_type & MEM_WRITE ? BPF_WRITE : BPF_READ,
9003+
false, meta);
90139004
if (err)
90149005
return err;
90159006
if (arg_type & MEM_ALIGNED)
90169007
err = check_ptr_alignment(env, reg, 0, fn->arg_size[arg], true);
90179008
}
90189009
break;
90199010
case ARG_CONST_SIZE:
9020-
err = check_mem_size_reg(env, reg, regno, false, meta);
9011+
err = check_mem_size_reg(env, reg, regno,
9012+
fn->arg_type[arg - 1] & MEM_WRITE ?
9013+
BPF_WRITE : BPF_READ,
9014+
false, meta);
90219015
break;
90229016
case ARG_CONST_SIZE_OR_ZERO:
9023-
err = check_mem_size_reg(env, reg, regno, true, meta);
9017+
err = check_mem_size_reg(env, reg, regno,
9018+
fn->arg_type[arg - 1] & MEM_WRITE ?
9019+
BPF_WRITE : BPF_READ,
9020+
true, meta);
90249021
break;
90259022
case ARG_PTR_TO_DYNPTR:
90269023
err = process_dynptr_func(env, regno, insn_idx, arg_type, 0);
@@ -21213,7 +21210,7 @@ static int do_misc_fixups(struct bpf_verifier_env *env)
2121321210
delta += cnt - 1;
2121421211
env->prog = prog = new_prog;
2121521212
insn = new_prog->insnsi + i + delta;
21216-
continue;
21213+
goto next_insn;
2121721214
}
2121821215

2121921216
/* Implement bpf_kptr_xchg inline */

0 commit comments

Comments
 (0)