Files
2026-07-13 13:13:07 +08:00

72 lines
2.2 KiB
Rust

//! Verifies the read_file non-regular-file fix: reading a directory or an
//! unbounded special file must return a CLEAN error and NOT poison the agent
//! connection (previously a dir read bricked the machine; /dev/zero hung).
use smolvm::embedded::{EmbeddedRuntime, MachineSpec};
use smolvm::VmResources;
use std::time::Duration;
fn main() {
let rt = EmbeddedRuntime::new().expect("runtime");
let name = "readfile-fix-test";
let _ = rt.create_machine(MachineSpec {
name: name.into(),
mounts: vec![],
ports: vec![],
resources: VmResources {
cpus: 1,
memory_mib: 512,
network: false,
..Default::default()
},
persistent: false,
});
rt.start_machine(name).expect("start");
let echo = |label: &str| match rt.exec(
name,
vec!["echo".into(), label.into()],
vec![],
None,
Some(Duration::from_secs(10)),
) {
Ok((code, out, _)) => println!(
" {label}: HEALTHY exit={code} out={:?}",
String::from_utf8_lossy(&out).trim()
),
Err(e) => println!(" {label}: POISONED → {e}"),
};
echo("before");
match rt.read_file(name, "/tmp") {
Ok(b) => println!("readFile(/tmp dir): UNEXPECTED ok ({} bytes)", b.len()),
Err(e) => println!("readFile(/tmp dir): clean error → {e}"),
}
echo("after-dir");
match rt.read_file(name, "/dev/zero") {
Ok(b) => println!("readFile(/dev/zero): UNEXPECTED ok ({} bytes)", b.len()),
Err(e) => println!("readFile(/dev/zero): clean error → {e}"),
}
echo("after-devzero");
// sanity: a real file still reads
let _ = rt.exec(
name,
vec![
"sh".into(),
"-c".into(),
"echo content > /tmp/real.txt".into(),
],
vec![],
None,
None,
);
match rt.read_file(name, "/tmp/real.txt") {
Ok(b) => println!(
"readFile(/tmp/real.txt): ok → {:?}",
String::from_utf8_lossy(&b).trim()
),
Err(e) => println!("readFile(/tmp/real.txt): UNEXPECTED error → {e}"),
}
rt.delete_machine(name).expect("delete");
}