diff --git a/bpf/aya-bpf/src/helpers.rs b/bpf/aya-bpf/src/helpers.rs index 1b7ea5b4..868c5c2d 100644 --- a/bpf/aya-bpf/src/helpers.rs +++ b/bpf/aya-bpf/src/helpers.rs @@ -364,6 +364,45 @@ pub unsafe fn bpf_probe_read_kernel_str(src: *const u8, dest: &mut [u8]) -> Resu Ok(len as usize) } +/// Write bytes to the _user space_ pointer `src` and store them as a `T`. +/// +/// # Examples +/// +/// ```no_run +/// # #![allow(dead_code)] +/// # use aya_bpf::{ +/// # cty::{c_int, c_long}, +/// # helpers::bpf_probe_write_user, +/// # programs::ProbeContext, +/// # }; +/// fn try_test(ctx: ProbeContext) -> Result<(), c_long> { +/// let retp: *mut c_int = ctx.arg(0).ok_or(1)?; +/// let val: i32 = 1; +/// // Write the value to the userspace pointer. +/// unsafe { bpf_probe_write_user(retp, &val as *const i32)? }; +/// +/// Ok::<(), c_long>(()) +/// } +/// ``` +/// +/// # Errors +/// +/// On failure, this function returns a negative value wrapped in an `Err`. +#[allow(clippy::fn_to_numeric_cast_with_truncation)] +#[inline] +pub unsafe fn bpf_probe_write_user(dst: *mut T, src: *const T) -> Result<(), c_long> { + let ret = gen::bpf_probe_write_user( + dst as *mut c_void, + src as *const c_void, + mem::size_of::() as u32, + ); + if ret < 0 { + return Err(ret); + } + + Ok(()) +} + /// Read the `comm` field associated with the current task struct /// as a `[c_char; 16]`. ///