diff --git a/aya/src/maps/mod.rs b/aya/src/maps/mod.rs index 27c4c7f2..f5c7072f 100644 --- a/aya/src/maps/mod.rs +++ b/aya/src/maps/mod.rs @@ -560,10 +560,7 @@ impl MapData { io_error, })? as RawFd; - let info = bpf_map_get_info_by_fd(fd).map_err(|io_error| SyscallError { - call: "BPF_MAP_GET_INFO_BY_FD", - io_error, - })?; + let info = bpf_map_get_info_by_fd(fd)?; Ok(MapData { obj: parse_map_info(info, PinningType::ByName), @@ -579,10 +576,7 @@ impl MapData { /// This API is intended for cases where you have received a valid BPF FD from some other means. /// For example, you received an FD over Unix Domain Socket. pub fn from_fd(fd: RawFd) -> Result { - let info = bpf_map_get_info_by_fd(fd).map_err(|io_error| SyscallError { - call: "BPF_OBJ_GET", - io_error, - })?; + let info = bpf_map_get_info_by_fd(fd)?; Ok(MapData { obj: parse_map_info(info, PinningType::None), diff --git a/aya/src/programs/extension.rs b/aya/src/programs/extension.rs index d40221f7..60453c40 100644 --- a/aya/src/programs/extension.rs +++ b/aya/src/programs/extension.rs @@ -151,10 +151,7 @@ impl Extension { /// with the name `func_name` within that BTF object. fn get_btf_info(prog_fd: i32, func_name: &str) -> Result<(RawFd, u32), ProgramError> { // retrieve program information - let info = sys::bpf_prog_get_info_by_fd(prog_fd).map_err(|io_error| SyscallError { - call: "bpf_prog_get_info_by_fd", - io_error, - })?; + let info = sys::bpf_prog_get_info_by_fd(prog_fd)?; // btf_id refers to the ID of the program btf that was loaded with bpf(BPF_BTF_LOAD) if info.btf_id == 0 { diff --git a/aya/src/programs/kprobe.rs b/aya/src/programs/kprobe.rs index 48bcf532..a0923a67 100644 --- a/aya/src/programs/kprobe.rs +++ b/aya/src/programs/kprobe.rs @@ -10,7 +10,7 @@ use crate::{ probe::{attach, ProbeKind}, FdLink, LinkError, ProgramData, ProgramError, }, - sys::{bpf_link_get_info_by_fd, SyscallError}, + sys::bpf_link_get_info_by_fd, VerifierLogLevel, }; @@ -137,10 +137,7 @@ impl TryFrom for KProbeLink { type Error = LinkError; fn try_from(fd_link: FdLink) -> Result { - let info = bpf_link_get_info_by_fd(fd_link.fd).map_err(|io_error| SyscallError { - call: "BPF_OBJ_GET_INFO_BY_FD", - io_error, - })?; + let info = bpf_link_get_info_by_fd(fd_link.fd)?; if info.type_ == (bpf_link_type::BPF_LINK_TYPE_KPROBE_MULTI as u32) { return Ok(KProbeLink::new(PerfLinkInner::FdLink(fd_link))); } diff --git a/aya/src/programs/lirc_mode2.rs b/aya/src/programs/lirc_mode2.rs index f97b404e..e39bbf1a 100644 --- a/aya/src/programs/lirc_mode2.rs +++ b/aya/src/programs/lirc_mode2.rs @@ -99,11 +99,7 @@ impl LircMode2 { let mut prog_fds = Vec::with_capacity(prog_ids.len()); for id in prog_ids { - let fd = bpf_prog_get_fd_by_id(id).map_err(|io_error| SyscallError { - call: "bpf_prog_get_fd_by_id", - io_error, - })?; - + let fd = bpf_prog_get_fd_by_id(id)?; prog_fds.push(fd); } @@ -137,13 +133,7 @@ impl LircLink { pub fn info(&self) -> Result { bpf_prog_get_info_by_fd(self.prog_fd) .map(ProgramInfo) - .map_err(|io_error| { - SyscallError { - call: "bpf_prog_get_info_by_fd", - io_error, - } - .into() - }) + .map_err(Into::into) } } diff --git a/aya/src/programs/mod.rs b/aya/src/programs/mod.rs index 20eac41f..a257427b 100644 --- a/aya/src/programs/mod.rs +++ b/aya/src/programs/mod.rs @@ -487,11 +487,7 @@ impl ProgramData { io_error, })? as RawFd; - let info = bpf_prog_get_info_by_fd(fd).map_err(|io_error| SyscallError { - call: "bpf_prog_get_info_by_fd", - io_error, - })?; - + let info = bpf_prog_get_info_by_fd(fd)?; let name = ProgramInfo(info).name_as_str().map(|s| s.to_string()); ProgramData::from_bpf_prog_info(name, fd, path.as_ref(), info, verifier_log_level) } @@ -945,10 +941,8 @@ impl ProgramInfo { /// /// The returned fd must be closed when no longer needed. pub fn fd(&self) -> Result { - let fd = bpf_prog_get_fd_by_id(self.0.id).map_err(|io_error| SyscallError { - call: "bpf_prog_get_fd_by_id", - io_error, - })?; + let Self(info) = self; + let fd = bpf_prog_get_fd_by_id(info.id)?; Ok(fd.into_raw_fd()) } @@ -960,10 +954,7 @@ impl ProgramInfo { io_error, })? as RawFd; - let info = bpf_prog_get_info_by_fd(fd).map_err(|io_error| SyscallError { - call: "bpf_prog_get_info_by_fd", - io_error, - })?; + let info = bpf_prog_get_info_by_fd(fd)?; unsafe { libc::close(fd); } @@ -998,17 +989,11 @@ pub fn loaded_programs() -> impl Iterator for PerfEventLink { type Error = LinkError; fn try_from(fd_link: FdLink) -> Result { - let info = bpf_link_get_info_by_fd(fd_link.fd).map_err(|io_error| SyscallError { - call: "BPF_OBJ_GET_INFO_BY_FD", - io_error, - })?; + let info = bpf_link_get_info_by_fd(fd_link.fd)?; if info.type_ == (bpf_link_type::BPF_LINK_TYPE_PERF_EVENT as u32) { return Ok(PerfEventLink::new(PerfLinkInner::FdLink(fd_link))); } diff --git a/aya/src/programs/trace_point.rs b/aya/src/programs/trace_point.rs index 2970dc86..f52594d8 100644 --- a/aya/src/programs/trace_point.rs +++ b/aya/src/programs/trace_point.rs @@ -131,10 +131,7 @@ impl TryFrom for TracePointLink { type Error = LinkError; fn try_from(fd_link: FdLink) -> Result { - let info = bpf_link_get_info_by_fd(fd_link.fd).map_err(|io_error| SyscallError { - call: "BPF_OBJ_GET_INFO_BY_FD", - io_error, - })?; + let info = bpf_link_get_info_by_fd(fd_link.fd)?; if info.type_ == (bpf_link_type::BPF_LINK_TYPE_TRACING as u32) { return Ok(TracePointLink::new(PerfLinkInner::FdLink(fd_link))); } diff --git a/aya/src/programs/uprobe.rs b/aya/src/programs/uprobe.rs index c52e8101..c67a124d 100644 --- a/aya/src/programs/uprobe.rs +++ b/aya/src/programs/uprobe.rs @@ -21,7 +21,7 @@ use crate::{ probe::{attach, ProbeKind}, FdLink, LinkError, ProgramData, ProgramError, }, - sys::{bpf_link_get_info_by_fd, SyscallError}, + sys::bpf_link_get_info_by_fd, VerifierLogLevel, }; @@ -177,10 +177,7 @@ impl TryFrom for UProbeLink { type Error = LinkError; fn try_from(fd_link: FdLink) -> Result { - let info = bpf_link_get_info_by_fd(fd_link.fd).map_err(|io_error| SyscallError { - call: "BPF_OBJ_GET_INFO_BY_FD", - io_error, - })?; + let info = bpf_link_get_info_by_fd(fd_link.fd)?; if info.type_ == (bpf_link_type::BPF_LINK_TYPE_TRACING as u32) { return Ok(UProbeLink::new(PerfLinkInner::FdLink(fd_link))); } diff --git a/aya/src/programs/xdp.rs b/aya/src/programs/xdp.rs index 5a90e028..3542e97a 100644 --- a/aya/src/programs/xdp.rs +++ b/aya/src/programs/xdp.rs @@ -279,10 +279,7 @@ impl TryFrom for XdpLink { fn try_from(fd_link: FdLink) -> Result { // unwrap of fd_link.fd will not panic since it's only None when being dropped. - let info = bpf_link_get_info_by_fd(fd_link.fd).map_err(|io_error| SyscallError { - call: "BPF_OBJ_GET_INFO_BY_FD", - io_error, - })?; + let info = bpf_link_get_info_by_fd(fd_link.fd)?; if info.type_ == (bpf_link_type::BPF_LINK_TYPE_XDP as u32) { return Ok(XdpLink::new(XdpLinkInner::FdLink(fd_link))); } diff --git a/aya/src/sys/bpf.rs b/aya/src/sys/bpf.rs index e4a4becc..908e2169 100644 --- a/aya/src/sys/bpf.rs +++ b/aya/src/sys/bpf.rs @@ -460,57 +460,57 @@ pub(crate) fn bpf_prog_query( ret } -pub(crate) fn bpf_prog_get_fd_by_id(prog_id: u32) -> Result { +pub(crate) fn bpf_prog_get_fd_by_id(prog_id: u32) -> Result { let mut attr = unsafe { mem::zeroed::() }; attr.__bindgen_anon_6.__bindgen_anon_1.prog_id = prog_id; // SAFETY: BPF_PROG_GET_FD_BY_ID returns a new file descriptor. - unsafe { fd_sys_bpf(bpf_cmd::BPF_PROG_GET_FD_BY_ID, &mut attr).map_err(|(_, e)| e) } + unsafe { fd_sys_bpf(bpf_cmd::BPF_PROG_GET_FD_BY_ID, &mut attr) }.map_err(|(code, io_error)| { + assert_eq!(code, -1); + SyscallError { + call: "bpf_prog_get_fd_by_id", + io_error, + } + }) } -pub(crate) fn bpf_prog_get_info_by_fd(prog_fd: RawFd) -> Result { +fn bpf_obj_get_info_by_fd(fd: BorrowedFd<'_>) -> Result { let mut attr = unsafe { mem::zeroed::() }; // info gets entirely populated by the kernel let info = MaybeUninit::zeroed(); - attr.info.bpf_fd = prog_fd as u32; + attr.info.bpf_fd = fd.as_raw_fd() as u32; attr.info.info = &info as *const _ as u64; - attr.info.info_len = mem::size_of::() as u32; + attr.info.info_len = mem::size_of_val(&info) as u32; match sys_bpf(bpf_cmd::BPF_OBJ_GET_INFO_BY_FD, &mut attr) { - Ok(_) => Ok(unsafe { info.assume_init() }), - Err((_, err)) => Err(err), + Ok(code) => { + assert_eq!(code, 0); + Ok(unsafe { info.assume_init() }) + } + Err((code, io_error)) => { + assert_eq!(code, -1); + Err(SyscallError { + call: "bpf_obj_get_info_by_fd", + io_error, + }) + } } } -pub(crate) fn bpf_map_get_info_by_fd(prog_fd: RawFd) -> Result { - let mut attr = unsafe { mem::zeroed::() }; - // info gets entirely populated by the kernel - let info = MaybeUninit::zeroed(); - - attr.info.bpf_fd = prog_fd as u32; - attr.info.info = info.as_ptr() as *const _ as u64; - attr.info.info_len = mem::size_of::() as u32; - - match sys_bpf(bpf_cmd::BPF_OBJ_GET_INFO_BY_FD, &mut attr) { - Ok(_) => Ok(unsafe { info.assume_init() }), - Err((_, err)) => Err(err), - } +pub(crate) fn bpf_prog_get_info_by_fd(fd: RawFd) -> Result { + let fd = unsafe { BorrowedFd::borrow_raw(fd) }; + bpf_obj_get_info_by_fd::(fd) } -pub(crate) fn bpf_link_get_info_by_fd(link_fd: RawFd) -> Result { - let mut attr = unsafe { mem::zeroed::() }; - // info gets entirely populated by the kernel - let info = unsafe { MaybeUninit::zeroed().assume_init() }; - - attr.info.bpf_fd = link_fd as u32; - attr.info.info = &info as *const _ as u64; - attr.info.info_len = mem::size_of::() as u32; +pub(crate) fn bpf_map_get_info_by_fd(fd: RawFd) -> Result { + let fd = unsafe { BorrowedFd::borrow_raw(fd) }; + bpf_obj_get_info_by_fd::(fd) +} - match sys_bpf(bpf_cmd::BPF_OBJ_GET_INFO_BY_FD, &mut attr) { - Ok(_) => Ok(info), - Err((_, err)) => Err(err), - } +pub(crate) fn bpf_link_get_info_by_fd(fd: RawFd) -> Result { + let fd = unsafe { BorrowedFd::borrow_raw(fd) }; + bpf_obj_get_info_by_fd::(fd) } pub(crate) fn btf_obj_get_info_by_fd(