From 46aa14f61ca6479b73f303683521b42766d9cf27 Mon Sep 17 00:00:00 2001 From: Philippe Antoine Date: Fri, 2 Oct 2026 14:30:10 +0200 Subject: [PATCH] datasets: do not accept char devices Such as /dev/zero Ticket: 9106 --- rust/src/detect/datasets.rs | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/rust/src/detect/datasets.rs b/rust/src/detect/datasets.rs index 7baa914632..66fa9c2855 100644 --- a/rust/src/detect/datasets.rs +++ b/rust/src/detect/datasets.rs @@ -278,14 +278,22 @@ fn read_or_create_file

(filename: P, fmode: &str) -> io::Result, { - let file: File = if fmode == "r" { - File::open(filename)? + let mut opts = OpenOptions::new(); + if fmode == "r" { + opts.read(true); } else { - OpenOptions::new() - .append(true) - .create(true) - .read(true) - .open(filename)? + opts.append(true).create(true).read(true); }; + #[cfg(unix)] + { + use std::os::unix::fs::OpenOptionsExt; + opts.custom_flags(libc::O_NONBLOCK); + } + let file = opts.open(filename)?; + let metadata = file.metadata()?; + if !metadata.file_type().is_file() { + return Err(io::Error::other("Can only read from a regular file")); + } + Ok(io::BufReader::new(file).lines()) }