|
@@ -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<T>(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::<T>() as u32,
|
|
|
+ );
|
|
|
+ if ret < 0 {
|
|
|
+ return Err(ret);
|
|
|
+ }
|
|
|
+
|
|
|
+ Ok(())
|
|
|
+}
|
|
|
+
|
|
|
/// Read the `comm` field associated with the current task struct
|
|
|
/// as a `[c_char; 16]`.
|
|
|
///
|