mirror of https://github.com/aya-rs/aya
ebpf: Call `bpf_probe_read` on `*const T` BTF arguments
It's necessary to call `bpf_probe_read` not only for pointers retrieved from `PtRegs`, but also from BTF arguments. `bpf_probe_read` might return an error, so the return type of `.arg()` methods in contexts handling BTF arguments changes from `T` to `Option<T>`. `None` is returned when `bpf_probe_read` call is not successful. Fixes: #542reviewable/pr543/r1
parent
0b58d3eb6d
commit
cbb2602c69
@ -0,0 +1,33 @@
|
|||||||
|
#![no_std]
|
||||||
|
#![no_main]
|
||||||
|
|
||||||
|
use aya_bpf::{
|
||||||
|
cty::{c_long, c_longlong},
|
||||||
|
macros::{fentry, kprobe},
|
||||||
|
programs::{FEntryContext, ProbeContext},
|
||||||
|
};
|
||||||
|
|
||||||
|
#[kprobe]
|
||||||
|
pub fn kprobe_vfs_write(ctx: ProbeContext) {
|
||||||
|
let _ = try_kprobe_vfs_write(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn try_kprobe_vfs_write(ctx: ProbeContext) -> Result<(), c_long> {
|
||||||
|
let _pos: *const c_longlong = ctx.arg(3).ok_or(1)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[fentry]
|
||||||
|
pub fn fentry_vfs_write(ctx: FEntryContext) {
|
||||||
|
let _ = try_fentry_vfs_write(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn try_fentry_vfs_write(ctx: FEntryContext) -> Result<(), c_long> {
|
||||||
|
let _pos: *const c_longlong = unsafe { ctx.arg(3).ok_or(1)? };
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[panic_handler]
|
||||||
|
fn panic(_info: &core::panic::PanicInfo) -> ! {
|
||||||
|
unsafe { core::hint::unreachable_unchecked() }
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
use aya::{
|
||||||
|
include_bytes_aligned,
|
||||||
|
programs::{FEntry, KProbe},
|
||||||
|
Bpf, Btf,
|
||||||
|
};
|
||||||
|
|
||||||
|
use super::{integration_test, IntegrationTest};
|
||||||
|
|
||||||
|
#[integration_test]
|
||||||
|
fn kprobe_args() {
|
||||||
|
let bytes = include_bytes_aligned!("../../../../target/bpfel-unknown-none/debug/args");
|
||||||
|
let mut bpf = Bpf::load(bytes).unwrap();
|
||||||
|
let kprobe_vfs_write: &mut KProbe = bpf
|
||||||
|
.program_mut("kprobe_vfs_write")
|
||||||
|
.unwrap()
|
||||||
|
.try_into()
|
||||||
|
.unwrap();
|
||||||
|
kprobe_vfs_write.load().unwrap();
|
||||||
|
kprobe_vfs_write.attach("vfs_write", 0).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[integration_test]
|
||||||
|
fn fentry_args() {
|
||||||
|
let bytes = include_bytes_aligned!("../../../../target/bpfel-unknown-none/debug/args");
|
||||||
|
let mut bpf = Bpf::load(bytes).unwrap();
|
||||||
|
let fentry_vfs_write: &mut FEntry = bpf
|
||||||
|
.program_mut("fentry_vfs_write")
|
||||||
|
.unwrap()
|
||||||
|
.try_into()
|
||||||
|
.unwrap();
|
||||||
|
let btf = Btf::from_sys_fs().unwrap();
|
||||||
|
fentry_vfs_write.load("vfs_write", &btf).unwrap();
|
||||||
|
fentry_vfs_write.attach().unwrap();
|
||||||
|
}
|
Loading…
Reference in New Issue