Bladeren bron

aya: extracting program and map names with the same function

Adam Preuss 1 jaar geleden
bovenliggende
commit
15faca8b2e
3 gewijzigde bestanden met toevoegingen van 13 en 24 verwijderingen
  1. 2 12
      aya/src/maps/mod.rs
  2. 2 12
      aya/src/programs/mod.rs
  3. 9 0
      aya/src/util.rs

+ 2 - 12
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, 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 map as a &str. If the name is not valid unicode, None is returned.

+ 2 - 12
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.

+ 9 - 0
aya/src/util.rs

@@ -364,6 +364,15 @@ pub(crate) fn bytes_of_slice<T: Pod>(val: &[T]) -> &[u8] {
     unsafe { slice::from_raw_parts(val.as_ptr().cast(), size) }
 }
 
+pub(crate) fn bytes_of_bpf_name(bpf_name: &[core::ffi::c_char; 16]) -> &[u8] {
+    let length = bpf_name
+        .iter()
+        .rposition(|ch| *ch != 0)
+        .map(|pos| pos + 1)
+        .unwrap_or(0);
+    unsafe { std::slice::from_raw_parts(bpf_name.as_ptr() as *const _, length) }
+}
+
 #[cfg(test)]
 mod tests {
     use assert_matches::assert_matches;