bpf_iter.c (c37fe6aff89cb0d842993fe2f69e48bf3ebe0ab0) bpf_iter.c (af2ac3e13e45752af03c8a933f9b6e18841b128b)
1// SPDX-License-Identifier: GPL-2.0-only
2/* Copyright (c) 2020 Facebook */
3
4#include <linux/fs.h>
5#include <linux/anon_inodes.h>
6#include <linux/filter.h>
7#include <linux/bpf.h>
8

--- 459 unchanged lines hidden (view full) ---

468 .fill_link_info = bpf_iter_link_fill_link_info,
469};
470
471bool bpf_link_is_iter(struct bpf_link *link)
472{
473 return link->ops == &bpf_iter_link_lops;
474}
475
1// SPDX-License-Identifier: GPL-2.0-only
2/* Copyright (c) 2020 Facebook */
3
4#include <linux/fs.h>
5#include <linux/anon_inodes.h>
6#include <linux/filter.h>
7#include <linux/bpf.h>
8

--- 459 unchanged lines hidden (view full) ---

468 .fill_link_info = bpf_iter_link_fill_link_info,
469};
470
471bool bpf_link_is_iter(struct bpf_link *link)
472{
473 return link->ops == &bpf_iter_link_lops;
474}
475
476int bpf_iter_link_attach(const union bpf_attr *attr, struct bpf_prog *prog)
476int bpf_iter_link_attach(const union bpf_attr *attr, bpfptr_t uattr,
477 struct bpf_prog *prog)
477{
478{
478 union bpf_iter_link_info __user *ulinfo;
479 struct bpf_link_primer link_primer;
480 struct bpf_iter_target_info *tinfo;
481 union bpf_iter_link_info linfo;
482 struct bpf_iter_link *link;
483 u32 prog_btf_id, linfo_len;
484 bool existed = false;
479 struct bpf_link_primer link_primer;
480 struct bpf_iter_target_info *tinfo;
481 union bpf_iter_link_info linfo;
482 struct bpf_iter_link *link;
483 u32 prog_btf_id, linfo_len;
484 bool existed = false;
485 bpfptr_t ulinfo;
485 int err;
486
487 if (attr->link_create.target_fd || attr->link_create.flags)
488 return -EINVAL;
489
490 memset(&linfo, 0, sizeof(union bpf_iter_link_info));
491
486 int err;
487
488 if (attr->link_create.target_fd || attr->link_create.flags)
489 return -EINVAL;
490
491 memset(&linfo, 0, sizeof(union bpf_iter_link_info));
492
492 ulinfo = u64_to_user_ptr(attr->link_create.iter_info);
493 ulinfo = make_bpfptr(attr->link_create.iter_info, uattr.is_kernel);
493 linfo_len = attr->link_create.iter_info_len;
494 linfo_len = attr->link_create.iter_info_len;
494 if (!ulinfo ^ !linfo_len)
495 if (bpfptr_is_null(ulinfo) ^ !linfo_len)
495 return -EINVAL;
496
496 return -EINVAL;
497
497 if (ulinfo) {
498 if (!bpfptr_is_null(ulinfo)) {
498 err = bpf_check_uarg_tail_zero(ulinfo, sizeof(linfo),
499 linfo_len);
500 if (err)
501 return err;
502 linfo_len = min_t(u32, linfo_len, sizeof(linfo));
499 err = bpf_check_uarg_tail_zero(ulinfo, sizeof(linfo),
500 linfo_len);
501 if (err)
502 return err;
503 linfo_len = min_t(u32, linfo_len, sizeof(linfo));
503 if (copy_from_user(&linfo, ulinfo, linfo_len))
504 if (copy_from_bpfptr(&linfo, ulinfo, linfo_len))
504 return -EFAULT;
505 }
506
507 prog_btf_id = prog->aux->attach_btf_id;
508 mutex_lock(&targets_mutex);
509 list_for_each_entry(tinfo, &targets, list) {
510 if (tinfo->btf_id == prog_btf_id) {
511 existed = true;

--- 182 unchanged lines hidden ---
505 return -EFAULT;
506 }
507
508 prog_btf_id = prog->aux->attach_btf_id;
509 mutex_lock(&targets_mutex);
510 list_for_each_entry(tinfo, &targets, list) {
511 if (tinfo->btf_id == prog_btf_id) {
512 existed = true;

--- 182 unchanged lines hidden ---