@@ -8610,7 +8610,8 @@ static int process_spin_lock(struct bpf_verifier_env *env, int regno, int flags)
86108610
86118611/* Check if @regno is a pointer to a specific field in a map value */
86128612static int check_map_field_pointer(struct bpf_verifier_env *env, u32 regno,
8613- enum btf_field_type field_type)
8613+ enum btf_field_type field_type,
8614+ struct bpf_map_desc *map_desc)
86148615{
86158616 struct bpf_reg_state *reg = reg_state(env, regno);
86168617 bool is_const = tnum_is_const(reg->var_off);
@@ -8653,72 +8654,23 @@ static int check_map_field_pointer(struct bpf_verifier_env *env, u32 regno,
86538654 val + reg->off, struct_name, field_off);
86548655 return -EINVAL;
86558656 }
8657+ if (map_desc->ptr) {
8658+ verifier_bug(env, "Two map pointers in a %s helper", struct_name);
8659+ return -EFAULT;
8660+ }
8661+ map_desc->uid = reg->map_uid;
8662+ map_desc->ptr = map;
86568663 return 0;
86578664}
86588665
86598666static int process_timer_func(struct bpf_verifier_env *env, int regno,
86608667 struct bpf_call_arg_meta *meta)
86618668{
8662- struct bpf_reg_state *reg = reg_state(env, regno);
8663- struct bpf_map *map = reg->map_ptr;
8664- int err;
8665-
8666- err = check_map_field_pointer(env, regno, BPF_TIMER);
8667- if (err)
8668- return err;
8669-
8670- if (meta->map.ptr) {
8671- verifier_bug(env, "Two map pointers in a timer helper");
8672- return -EFAULT;
8673- }
86748669 if (IS_ENABLED(CONFIG_PREEMPT_RT)) {
86758670 verbose(env, "bpf_timer cannot be used for PREEMPT_RT.\n");
86768671 return -EOPNOTSUPP;
86778672 }
8678- meta->map.uid = reg->map_uid;
8679- meta->map.ptr = map;
8680- return 0;
8681- }
8682-
8683- static int process_wq_func(struct bpf_verifier_env *env, int regno,
8684- struct bpf_kfunc_call_arg_meta *meta)
8685- {
8686- struct bpf_reg_state *reg = reg_state(env, regno);
8687- struct bpf_map *map = reg->map_ptr;
8688- int err;
8689-
8690- err = check_map_field_pointer(env, regno, BPF_WORKQUEUE);
8691- if (err)
8692- return err;
8693-
8694- if (meta->map.ptr) {
8695- verifier_bug(env, "Two map pointers in a bpf_wq helper");
8696- return -EFAULT;
8697- }
8698-
8699- meta->map.uid = reg->map_uid;
8700- meta->map.ptr = map;
8701- return 0;
8702- }
8703-
8704- static int process_task_work_func(struct bpf_verifier_env *env, int regno,
8705- struct bpf_kfunc_call_arg_meta *meta)
8706- {
8707- struct bpf_reg_state *reg = reg_state(env, regno);
8708- struct bpf_map *map = reg->map_ptr;
8709- int err;
8710-
8711- err = check_map_field_pointer(env, regno, BPF_TASK_WORK);
8712- if (err)
8713- return err;
8714-
8715- if (meta->map.ptr) {
8716- verifier_bug(env, "Two map pointers in a bpf_task_work helper");
8717- return -EFAULT;
8718- }
8719- meta->map.uid = reg->map_uid;
8720- meta->map.ptr = map;
8721- return 0;
8673+ return check_map_field_pointer(env, regno, BPF_TIMER, &meta->map);
87228674}
87238675
87248676static int process_kptr_func(struct bpf_verifier_env *env, int regno,
@@ -13754,7 +13706,7 @@ static int check_kfunc_args(struct bpf_verifier_env *env, struct bpf_kfunc_call_
1375413706 verbose(env, "arg#%d doesn't point to a map value\n", i);
1375513707 return -EINVAL;
1375613708 }
13757- ret = process_wq_func (env, regno, meta);
13709+ ret = check_map_field_pointer (env, regno, BPF_WORKQUEUE, & meta->map );
1375813710 if (ret < 0)
1375913711 return ret;
1376013712 break;
@@ -13763,7 +13715,7 @@ static int check_kfunc_args(struct bpf_verifier_env *env, struct bpf_kfunc_call_
1376313715 verbose(env, "arg#%d doesn't point to a map value\n", i);
1376413716 return -EINVAL;
1376513717 }
13766- ret = process_task_work_func (env, regno, meta);
13718+ ret = check_map_field_pointer (env, regno, BPF_TASK_WORK, & meta->map );
1376713719 if (ret < 0)
1376813720 return ret;
1376913721 break;
0 commit comments