diff --git a/src/agent/onefuzz/src/monitor.rs b/src/agent/onefuzz/src/monitor.rs index 2a4fe456b..eb5f96bb8 100644 --- a/src/agent/onefuzz/src/monitor.rs +++ b/src/agent/onefuzz/src/monitor.rs @@ -40,6 +40,13 @@ impl DirectoryMonitor { // Canonicalize so we can compare the watched dir to paths in the events. self.dir = fs::canonicalize(&self.dir).await?; + // Make sure we are watching a directory. + // + // This check will pass for symlinks to directories. + if !fs::metadata(&self.dir).await?.is_dir() { + bail!("monitored path is not a directory: {}", self.dir.display()); + } + // Initialize the watcher. self.watcher.watch(&self.dir, RecursiveMode::NonRecursive)?; diff --git a/src/agent/onefuzz/src/monitor/tests.rs b/src/agent/onefuzz/src/monitor/tests.rs index c932ec053..5d1594cbe 100644 --- a/src/agent/onefuzz/src/monitor/tests.rs +++ b/src/agent/onefuzz/src/monitor/tests.rs @@ -37,6 +37,20 @@ timed_test!(test_monitor_nonexistent_path, async move { Ok(()) }); +timed_test!(test_monitor_file, async move { + let dir = tempdir()?; + + // Create a file to erroneously watch. + let file_path = dir.path().join("some-file.txt"); + tokio::fs::write(&file_path, "aaaaaa").await?; + + let mut monitor = DirectoryMonitor::new(&file_path)?; + + assert!(monitor.start().await.is_err()); + + Ok(()) +}); + timed_test!(test_monitor_dir, async move { let dir = tempdir()?; let mut monitor = DirectoryMonitor::new(dir.path())?;