sys: bpf_prog_get_fd_by_id returns OwnedFd

reviewable/pr688/r1
Tamir Duberstein 2 years ago
parent 5ebaf5f393
commit 6dc961ac53
No known key found for this signature in database

@ -101,12 +101,12 @@ impl LircMode2 {
io_error, io_error,
})?; })?;
prog_fds.push(fd as RawFd); prog_fds.push(fd);
} }
Ok(prog_fds Ok(prog_fds
.into_iter() .into_iter()
.map(|prog_fd| LircLink::new(prog_fd, target_fd.as_raw_fd())) .map(|prog_fd| LircLink::new(prog_fd.as_raw_fd(), target_fd.as_raw_fd()))
.collect()) .collect())
} }
} }

@ -955,7 +955,7 @@ impl ProgramInfo {
call: "bpf_prog_get_fd_by_id", call: "bpf_prog_get_fd_by_id",
io_error, io_error,
})?; })?;
Ok(fd as RawFd) Ok(fd.as_raw_fd())
} }
/// Loads a program from a pinned path in bpffs. /// Loads a program from a pinned path in bpffs.
@ -1003,14 +1003,12 @@ impl Iterator for ProgramsIter {
io_error, io_error,
}) })
.and_then(|fd| { .and_then(|fd| {
let info = bpf_prog_get_info_by_fd(fd) bpf_prog_get_info_by_fd(fd.as_raw_fd())
.map_err(|io_error| ProgramError::SyscallError { .map_err(|io_error| ProgramError::SyscallError {
call: "bpf_prog_get_info_by_fd", call: "bpf_prog_get_info_by_fd",
io_error, io_error,
}) })
.map(ProgramInfo); .map(ProgramInfo)
unsafe { libc::close(fd) };
info
}), }),
) )
} }

@ -3,7 +3,7 @@ use std::{
ffi::{CStr, CString}, ffi::{CStr, CString},
io, io,
mem::{self, MaybeUninit}, mem::{self, MaybeUninit},
os::unix::io::RawFd, os::fd::{FromRawFd as _, OwnedFd, RawFd},
slice, slice,
}; };
@ -460,13 +460,21 @@ pub(crate) fn bpf_prog_query(
ret ret
} }
pub(crate) fn bpf_prog_get_fd_by_id(prog_id: u32) -> Result<RawFd, io::Error> { pub(crate) fn bpf_prog_get_fd_by_id(prog_id: u32) -> Result<OwnedFd, io::Error> {
let mut attr = unsafe { mem::zeroed::<bpf_attr>() }; let mut attr = unsafe { mem::zeroed::<bpf_attr>() };
attr.__bindgen_anon_6.__bindgen_anon_1.prog_id = prog_id; attr.__bindgen_anon_6.__bindgen_anon_1.prog_id = prog_id;
match sys_bpf(bpf_cmd::BPF_PROG_GET_FD_BY_ID, &attr) { match sys_bpf(bpf_cmd::BPF_PROG_GET_FD_BY_ID, &attr) {
Ok(v) => Ok(v as RawFd), Ok(v) => {
let v = v.try_into().map_err(|std::num::TryFromIntError { .. }| {
io::Error::new(
io::ErrorKind::InvalidData,
format!("bpf_prog_get_fd_by_id: invalid fd returned: {}", v),
)
})?;
Ok(unsafe { OwnedFd::from_raw_fd(v) })
}
Err((_, err)) => Err(err), Err((_, err)) => Err(err),
} }
} }

Loading…
Cancel
Save