int bpf_obj_get_user(const char __user *pathname) { enum bpf_type type = BPF_TYPE_UNSPEC; struct filename *pname; int ret = -ENOENT; void *raw; pname = getname(pathname); if (IS_ERR(pname)) return PTR_ERR(pname); raw = bpf_obj_do_get(pname, &type); if (IS_ERR(raw)) { ret = PTR_ERR(raw); goto out; } if (type == BPF_TYPE_PROG) ret = bpf_prog_new_fd(raw); else if (type == BPF_TYPE_MAP) ret = bpf_map_new_fd(raw); else goto out; if (ret < 0) bpf_any_put(raw, type); out: putname(pname); return ret; }
int bpf_obj_get_user(const char __user *pathname, int flags) { enum bpf_type type = BPF_TYPE_UNSPEC; struct filename *pname; int ret = -ENOENT; int f_flags; void *raw; f_flags = bpf_get_file_flag(flags); if (f_flags < 0) return f_flags; pname = getname(pathname); if (IS_ERR(pname)) return PTR_ERR(pname); raw = bpf_obj_do_get(pname, &type, f_flags); if (IS_ERR(raw)) { ret = PTR_ERR(raw); goto out; } if (type == BPF_TYPE_PROG) ret = bpf_prog_new_fd(raw); else if (type == BPF_TYPE_MAP) ret = bpf_map_new_fd(raw, f_flags); else goto out; if (ret < 0) { bpf_any_put(raw, type); } else if (trace_bpf_obj_get_prog_enabled() || trace_bpf_obj_get_map_enabled()) { if (type == BPF_TYPE_PROG) trace_bpf_obj_get_prog(raw, ret, pname); if (type == BPF_TYPE_MAP) trace_bpf_obj_get_map(raw, ret, pname); } out: putname(pname); return ret; }