fix read_events if extra metadata is filled into read buffer

This commit is contained in:
guochao 2025-04-03 14:03:43 +00:00
parent 936bc7c43d
commit c07a87309d
2 changed files with 26 additions and 6 deletions

View File

@ -45,7 +45,7 @@ struct Args {
#[clap(long, short, default_values_t=default_providers())] #[clap(long, short, default_values_t=default_providers())]
providers: Vec<String>, providers: Vec<String>,
#[clap(long, short)] #[clap(long, short, default_values_t=default_init_flags())]
init_flags: Vec<String>, init_flags: Vec<String>,
#[clap(long, short, default_values_t=default_event_f_flags())] #[clap(long, short, default_values_t=default_event_f_flags())]
event_f_flags: Vec<String>, event_f_flags: Vec<String>,
@ -61,6 +61,13 @@ fn default_providers() -> Vec<String> {
vec!["tee".to_string()] vec!["tee".to_string()]
} }
fn default_init_flags() -> Vec<String> {
vec!["FAN_CLASS_NOTIF", "FAN_REPORT_FID"]
.iter()
.map(|s| s.to_string())
.collect()
}
fn default_event_f_flags() -> Vec<String> { fn default_event_f_flags() -> Vec<String> {
vec!["O_RDWR", "O_LARGEFILE"] vec!["O_RDWR", "O_LARGEFILE"]
.iter() .iter()

View File

@ -91,17 +91,30 @@ impl Fanotify {
} }
let nread = nread as usize; let nread = nread as usize;
let mut offset = 0; let mut offset = 0;
// #define FAN_EVENT_OK(meta, len) \
// ((long)(len) => (long)FAN_EVENT_METADATA_LEN) && // rest buffer can contain a metadata struct
// (long)(meta) ->event_len >= (long)FAN_FAN_EVENT_METADATA_LEN && // struct contains valid size (not implemented)
// (long)(meta) ->event_len <= (long)(len) // struct does not read over buffer boundary (not implemented)
while offset + EVENT_SIZE <= nread { while offset + EVENT_SIZE <= nread {
let mut event: MaybeUninit<libc::fanotify_event_metadata> = MaybeUninit::uninit(); let mut uninited: MaybeUninit<libc::fanotify_event_metadata> = MaybeUninit::uninit();
std::ptr::copy( std::ptr::copy(
buffer.as_ptr().add(offset), buffer.as_ptr().add(offset),
event.as_mut_ptr().cast(), uninited.as_mut_ptr().cast(),
EVENT_SIZE, EVENT_SIZE,
); );
let event = uninited.assume_init();
result.push(Event(event.assume_init())); // #define FAN_EVENT_NEXT(meta, len) ((len) -= (meta)->event_len, (struct fanotify_event_metadata*)(((char*)(meta)) + (meta) -> event_len)
// meta = FAN_EVENT_NEXT(meta, len) translate to:
offset += EVENT_SIZE; // len -= meta->event_len; // shrink rest length
// , // comma operator, evaluate first express, but not using its result
//
// meta = (struct fanotify_event_metadata*) ( // cast pointer back to metadata type
// ((char*)(meta)) // discard metadata type to increase pointer by 1
// + (meta) -> event_len // add event_len to move to next
// );
offset += event.event_len as usize;
result.push(Event(event));
} }
} }