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 --- |