From b010b0f028409272bf65238834ed625693c0cb09 Mon Sep 17 00:00:00 2001 From: Tamir Duberstein Date: Mon, 3 Feb 2025 20:24:37 -0500 Subject: [PATCH] Avoid raw slice construction The safety requirements of this transmutation are simpler. --- aya/src/bpf.rs | 2 -- aya/src/sys/bpf.rs | 36 +++++++++++++++--------------------- 2 files changed, 15 insertions(+), 23 deletions(-) diff --git a/aya/src/bpf.rs b/aya/src/bpf.rs index 9239ceac..d95797aa 100644 --- a/aya/src/bpf.rs +++ b/aya/src/bpf.rs @@ -40,8 +40,6 @@ use crate::{ util::{bytes_of, bytes_of_slice, nr_cpus, page_size}, }; -pub(crate) const BPF_OBJ_NAME_LEN: usize = 16; - pub(crate) const PERF_EVENT_IOC_ENABLE: c_int = AYA_PERF_EVENT_IOC_ENABLE; pub(crate) const PERF_EVENT_IOC_DISABLE: c_int = AYA_PERF_EVENT_IOC_DISABLE; pub(crate) const PERF_EVENT_IOC_SET_BPF: c_int = AYA_PERF_EVENT_IOC_SET_BPF; diff --git a/aya/src/sys/bpf.rs b/aya/src/sys/bpf.rs index 8d5567b2..81619e9d 100644 --- a/aya/src/sys/bpf.rs +++ b/aya/src/sys/bpf.rs @@ -4,7 +4,6 @@ use std::{ io, iter, mem::{self, MaybeUninit}, os::fd::{AsFd as _, AsRawFd as _, BorrowedFd, FromRawFd as _, RawFd}, - slice, }; use assert_matches::assert_matches; @@ -29,7 +28,7 @@ use crate::{ programs::links::LinkRef, sys::{syscall, SysResult, Syscall, SyscallError}, util::KernelVersion, - Btf, Pod, VerifierLogLevel, BPF_OBJ_NAME_LEN, FEATURES, + Btf, Pod, VerifierLogLevel, FEATURES, }; pub(crate) fn bpf_create_iter(link_fd: BorrowedFd<'_>) -> SysResult { @@ -95,9 +94,10 @@ pub(crate) fn bpf_create_map( // older kernels for compatibility if kernel_version >= KernelVersion::new(4, 15, 0) { // u.map_name is 16 bytes max and must be NULL terminated - let name_len = cmp::min(name.to_bytes().len(), BPF_OBJ_NAME_LEN - 1); - u.map_name[..name_len] - .copy_from_slice(unsafe { slice::from_raw_parts(name.as_ptr(), name_len) }); + let name_bytes = name.to_bytes_with_nul(); + let len = cmp::min(name_bytes.len(), u.map_name.len()); + u.map_name[..len] + .copy_from_slice(unsafe { mem::transmute::<&[u8], &[c_char]>(&name_bytes[..len]) }); } // SAFETY: BPF_MAP_CREATE returns a new file descriptor. @@ -148,14 +148,11 @@ pub(crate) fn bpf_load_program( let u = unsafe { &mut attr.__bindgen_anon_3 }; - if let Some(prog_name) = &aya_attr.name { - let mut name: [c_char; 16] = [0; 16]; - let name_bytes = prog_name.to_bytes(); - let len = cmp::min(name.len(), name_bytes.len()); - name[..len].copy_from_slice(unsafe { - slice::from_raw_parts(name_bytes.as_ptr() as *const c_char, len) - }); - u.prog_name = name; + if let Some(name) = &aya_attr.name { + let name_bytes = name.to_bytes(); + let len = cmp::min(name_bytes.len(), u.prog_name.len()); + u.prog_name[..len] + .copy_from_slice(unsafe { mem::transmute::<&[u8], &[c_char]>(&name_bytes[..len]) }); } u.prog_flags = aya_attr.flags; @@ -735,14 +732,11 @@ pub(crate) fn bpf_btf_get_fd_by_id(id: u32) -> Result bool { let mut attr = unsafe { mem::zeroed::() }; let u = unsafe { &mut attr.__bindgen_anon_3 }; - let mut name: [c_char; 16] = [0; 16]; - let cstring = CString::new("aya_name_check").unwrap(); - let name_bytes = cstring.to_bytes(); - let len = cmp::min(name.len(), name_bytes.len()); - name[..len].copy_from_slice(unsafe { - slice::from_raw_parts(name_bytes.as_ptr() as *const c_char, len) - }); - u.prog_name = name; + let name = c"aya_name_check"; + let name_bytes = name.to_bytes(); + let len = cmp::min(name_bytes.len(), u.prog_name.len()); + u.prog_name[..len] + .copy_from_slice(unsafe { mem::transmute::<&[u8], &[c_char]>(&name_bytes[..len]) }); // The fields conforming an encoded basic instruction are stored in the following order: // opcode:8 src_reg:4 dst_reg:4 offset:16 imm:32 - In little-endian BPF.