72 lines
2.2 KiB
Rust
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");
|
|
}
|