From e8786f57573631333b5afe6c36e545f75fa10f4a Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Thu, 2 May 2024 02:42:56 +0900 Subject: [PATCH] fix: handle "." in path lookup (#55) --- lib/virtual_adapter.debug.wasm | Bin 231333 -> 231497 bytes lib/virtual_adapter.wasm | Bin 196481 -> 196645 bytes tests/cases/fs-preopen-read.toml | 16 ++++++++++++++++ virtual-adapter/src/io.rs | 10 ++++++++-- 4 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 tests/cases/fs-preopen-read.toml diff --git a/lib/virtual_adapter.debug.wasm b/lib/virtual_adapter.debug.wasm index 976eacba2af8852f21ea511618cec2fb4add55ee..80d433882620422f5e173d18f39be69e11ea6cf7 100755 GIT binary patch delta 15486 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

`3tdSN+RqP-%V)vcxiewe$Sl#j{0pZ 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 delta 15538 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 y2CkE~=d6}_z3z>AuTMVjzCkJ22M7X2SPMHUPI delta 13386 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 CV<<}i diff --git a/tests/cases/fs-preopen-read.toml b/tests/cases/fs-preopen-read.toml new file mode 100644 index 0000000..f9802ed --- /dev/null +++ b/tests/cases/fs-preopen-read.toml @@ -0,0 +1,16 @@ +component = "file-read" + +host-fs-path = "/mydir" + +[virt-opts.stdio] +stdin = "allow" +stdout = "allow" +stderr = "allow" + +[virt-opts.fs.preopens."/mydir".dir] +"file1.txt" = { source = "inner contents1" } +"file2.txt" = { source = "inner contents2" } +"echo.txt" = { source = "inner contents echo" } + +[expect] +file-read = "echo.txtfile1.txtfile2.txt" diff --git a/virtual-adapter/src/io.rs b/virtual-adapter/src/io.rs index a6b4c00..84c6f38 100644 --- a/virtual-adapter/src/io.rs +++ b/virtual-adapter/src/io.rs @@ -280,11 +280,17 @@ impl StaticIndexEntry { let static_index = Io::static_index(); Ok(&static_index[self.idx() + child_offset..self.idx() + child_offset + child_list_len]) } - fn dir_lookup(&self, path: &str) -> Result<&'static StaticIndexEntry, ErrorCode> { + fn dir_lookup(&self, path: &str) -> Result<&StaticIndexEntry, ErrorCode> { assert!(path.len() > 0); let (first_part, rem) = match path.find('/') { Some(idx) => (&path[0..idx], &path[idx + 1..]), - None => (path, ""), + None => { + if path == "." { + return Ok(self); + } else { + (path, "") + } + } }; let child_list = self.child_list()?; if let Ok(child_idx) = child_list.binary_search_by(|entry| entry.name().cmp(first_part)) {