diff --git a/aya/src/maps/mod.rs b/aya/src/maps/mod.rs index 56d14de1..276719fc 100644 --- a/aya/src/maps/mod.rs +++ b/aya/src/maps/mod.rs @@ -73,7 +73,7 @@ use crate::{ bpf_map_get_info_by_fd, bpf_map_get_next_key, bpf_map_update_elem_ptr, bpf_pin_object, iter_map_ids, SyscallError, }, - util::{nr_cpus, KernelVersion}, + util::{bytes_of_bpf_name, nr_cpus, KernelVersion}, PinningType, Pod, }; @@ -927,17 +927,7 @@ impl MapInfo { /// The name of the map. pub fn name(&self) -> &[u8] { - let length = self - .0 - .name - .iter() - .rposition(|ch| *ch != 0) - .map(|pos| pos + 1) - .unwrap_or(0); - - // The name field is defined as [std::os::raw::c_char; 16]. c_char may be signed or - // unsigned depending on the platform; that's why we're using from_raw_parts here. - unsafe { std::slice::from_raw_parts(self.0.name.as_ptr() as *const _, length) } + bytes_of_bpf_name(&self.0.name) } /// The name of the map as a &str. If the name is not valid unicode, None is returned. diff --git a/aya/src/programs/mod.rs b/aya/src/programs/mod.rs index 64da0fdf..fcbbce86 100644 --- a/aya/src/programs/mod.rs +++ b/aya/src/programs/mod.rs @@ -117,7 +117,7 @@ use crate::{ bpf_prog_query, iter_link_ids, iter_prog_ids, retry_with_verifier_logs, BpfLoadProgramAttrs, SyscallError, }, - util::KernelVersion, + util::{bytes_of_bpf_name, KernelVersion}, VerifierLogLevel, }; @@ -1002,17 +1002,7 @@ impl ProgramInfo { /// The name of the program as was provided when it was load. This is limited to 16 bytes pub fn name(&self) -> &[u8] { - let length = self - .0 - .name - .iter() - .rposition(|ch| *ch != 0) - .map(|pos| pos + 1) - .unwrap_or(0); - - // The name field is defined as [std::os::raw::c_char; 16]. c_char may be signed or - // unsigned depending on the platform; that's why we're using from_raw_parts here - unsafe { std::slice::from_raw_parts(self.0.name.as_ptr() as *const _, length) } + bytes_of_bpf_name(&self.0.name) } /// The name of the program as a &str. If the name was not valid unicode, None is returned. diff --git a/aya/src/util.rs b/aya/src/util.rs index 3184dae4..481f224a 100644 --- a/aya/src/util.rs +++ b/aya/src/util.rs @@ -364,6 +364,18 @@ pub(crate) fn bytes_of_slice(val: &[T]) -> &[u8] { unsafe { slice::from_raw_parts(val.as_ptr().cast(), size) } } +pub(crate) fn bytes_of_bpf_name(bpf_name: &[i8]) -> &[u8] { + let length = bpf_name + .iter() + .rposition(|ch| *ch != 0) + .map(|pos| pos + 1) + .unwrap_or(0); + + // The name field is defined as [std::os::raw::c_char; 16]. c_char may be signed or + // unsigned depending on the platform; that's why we're using from_raw_parts here + unsafe { std::slice::from_raw_parts(bpf_name.as_ptr() as *const _, length) } +} + #[cfg(test)] mod tests { use assert_matches::assert_matches;