From fb3e2f7f9d06b22c7fe44eccefc2ce94ad322ed0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alessandro=C2=A0Decina?= Date: Wed, 9 Jun 2021 12:17:35 +0000 Subject: [PATCH] aya: programs: fix detaching programs attached with bpf_prog_attach --- aya/src/programs/mod.rs | 20 ++++++++++++++++++-- aya/src/programs/sk_msg.rs | 8 +++----- aya/src/programs/sk_skb.rs | 8 +++----- aya/src/programs/sock_ops.rs | 8 +++----- aya/src/sys/bpf.rs | 6 +++--- 5 files changed, 30 insertions(+), 20 deletions(-) diff --git a/aya/src/programs/mod.rs b/aya/src/programs/mod.rs index 9b02b7f4..9a6efd36 100644 --- a/aya/src/programs/mod.rs +++ b/aya/src/programs/mod.rs @@ -56,7 +56,7 @@ mod trace_point; mod uprobe; mod xdp; -use libc::{close, ENOSPC}; +use libc::{close, dup, ENOSPC}; use std::{cell::RefCell, cmp, convert::TryFrom, ffi::CStr, io, os::unix::io::RawFd, rc::Rc}; use thiserror::Error; @@ -397,10 +397,26 @@ struct ProgAttachLink { attach_type: bpf_attach_type, } +impl ProgAttachLink { + pub(crate) fn new( + prog_fd: RawFd, + target_fd: RawFd, + attach_type: bpf_attach_type, + ) -> ProgAttachLink { + ProgAttachLink { + prog_fd: Some(prog_fd), + target_fd: Some(unsafe { dup(target_fd) }), + attach_type, + } + } +} + impl Link for ProgAttachLink { fn detach(&mut self) -> Result<(), ProgramError> { if let Some(prog_fd) = self.prog_fd.take() { - let _ = bpf_prog_detach(prog_fd, self.target_fd.take().unwrap(), self.attach_type); + let target_fd = self.target_fd.take().unwrap(); + let _ = bpf_prog_detach(prog_fd, target_fd, self.attach_type); + unsafe { close(target_fd) }; Ok(()) } else { Err(ProgramError::AlreadyDetached) diff --git a/aya/src/programs/sk_msg.rs b/aya/src/programs/sk_msg.rs index f4b8731d..ceaee543 100644 --- a/aya/src/programs/sk_msg.rs +++ b/aya/src/programs/sk_msg.rs @@ -42,10 +42,8 @@ impl SkMsg { io_error, } })?; - Ok(self.data.link(ProgAttachLink { - prog_fd: Some(prog_fd), - target_fd: Some(map_fd), - attach_type: BPF_SK_MSG_VERDICT, - })) + Ok(self + .data + .link(ProgAttachLink::new(prog_fd, map_fd, BPF_SK_MSG_VERDICT))) } } diff --git a/aya/src/programs/sk_skb.rs b/aya/src/programs/sk_skb.rs index 7c55b7f0..35efaf20 100644 --- a/aya/src/programs/sk_skb.rs +++ b/aya/src/programs/sk_skb.rs @@ -48,10 +48,8 @@ impl SkSkb { io_error, } })?; - Ok(self.data.link(ProgAttachLink { - prog_fd: Some(prog_fd), - target_fd: Some(map_fd), - attach_type, - })) + Ok(self + .data + .link(ProgAttachLink::new(prog_fd, map_fd, attach_type))) } } diff --git a/aya/src/programs/sock_ops.rs b/aya/src/programs/sock_ops.rs index d9ba8741..9bc505bf 100644 --- a/aya/src/programs/sock_ops.rs +++ b/aya/src/programs/sock_ops.rs @@ -35,10 +35,8 @@ impl SockOps { io_error, } })?; - Ok(self.data.link(ProgAttachLink { - prog_fd: Some(prog_fd), - target_fd: Some(cgroup_fd), - attach_type: BPF_CGROUP_SOCK_OPS, - })) + Ok(self + .data + .link(ProgAttachLink::new(prog_fd, cgroup_fd, BPF_CGROUP_SOCK_OPS))) } } diff --git a/aya/src/sys/bpf.rs b/aya/src/sys/bpf.rs index cfa56e21..28dd4626 100644 --- a/aya/src/sys/bpf.rs +++ b/aya/src/sys/bpf.rs @@ -238,13 +238,13 @@ pub(crate) fn bpf_link_create( pub(crate) fn bpf_prog_attach( prog_fd: RawFd, - map_fd: RawFd, + target_fd: RawFd, attach_type: bpf_attach_type, ) -> SysResult { let mut attr = unsafe { mem::zeroed::() }; attr.__bindgen_anon_5.attach_bpf_fd = prog_fd as u32; - attr.__bindgen_anon_5.target_fd = map_fd as u32; + attr.__bindgen_anon_5.target_fd = target_fd as u32; attr.__bindgen_anon_5.attach_type = attach_type as u32; sys_bpf(bpf_cmd::BPF_PROG_ATTACH, &attr) @@ -261,7 +261,7 @@ pub(crate) fn bpf_prog_detach( attr.__bindgen_anon_5.target_fd = map_fd as u32; attr.__bindgen_anon_5.attach_type = attach_type as u32; - sys_bpf(bpf_cmd::BPF_PROG_ATTACH, &attr) + sys_bpf(bpf_cmd::BPF_PROG_DETACH, &attr) } fn sys_bpf<'a>(cmd: bpf_cmd, attr: &'a bpf_attr) -> SysResult {