From f54abc78a22e706f5ced065a831598cfb6164546 Mon Sep 17 00:00:00 2001 From: LI Qing Date: Mon, 1 Jun 2020 07:04:52 +0000 Subject: [PATCH] Support to execute a symlink file --- deps/sefs | 2 +- src/libos/src/fs/fs_view.rs | 27 ++++++++++++++++++++++++--- src/libos/src/process/do_spawn/mod.rs | 2 +- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/deps/sefs b/deps/sefs index b3565f22..1d173f10 160000 --- a/deps/sefs +++ b/deps/sefs @@ -1 +1 @@ -Subproject commit b3565f22b547dac487b46a1fb4d6c8c5d1b3162e +Subproject commit 1d173f103626d4771e120456f8960a7ff3157583 diff --git a/src/libos/src/fs/fs_view.rs b/src/libos/src/fs/fs_view.rs index a5ea8940..c9b8444f 100644 --- a/src/libos/src/fs/fs_view.rs +++ b/src/libos/src/fs/fs_view.rs @@ -80,16 +80,37 @@ impl FsView { /// Lookup INode from the cwd of the process pub fn lookup_inode(&self, path: &str) -> Result> { - debug!("lookup_inode: cwd: {:?}, path: {:?}", self.cwd(), path); + self.lookup_inode_follow_with_max_times(path, 0) + } + + /// Lookup INode from the cwd of the process, follow symlinks + pub fn lookup_inode_follow(&self, path: &str) -> Result> { + // Linux uses 40 as the upper limit for resolving symbolic links, + // so Occlum use it as a reasonable value + const MAX_SYMLINKS: usize = 40; + self.lookup_inode_follow_with_max_times(path, MAX_SYMLINKS) + } + + fn lookup_inode_follow_with_max_times( + &self, + path: &str, + max_times: usize, + ) -> Result> { + debug!( + "lookup_inode_follow_with_max_times: cwd: {:?}, path: {:?}, max_times: {}", + self.cwd(), + path, + max_times + ); if path.len() > 0 && path.as_bytes()[0] == b'/' { // absolute path let abs_path = path.trim_start_matches('/'); - let inode = ROOT_INODE.lookup(abs_path)?; + let inode = ROOT_INODE.lookup_follow(abs_path, max_times)?; Ok(inode) } else { // relative path let cwd = self.cwd().trim_start_matches('/'); - let inode = ROOT_INODE.lookup(cwd)?.lookup(path)?; + let inode = ROOT_INODE.lookup(cwd)?.lookup_follow(path, max_times)?; Ok(inode) } } diff --git a/src/libos/src/process/do_spawn/mod.rs b/src/libos/src/process/do_spawn/mod.rs index 0b8095dc..e8460032 100644 --- a/src/libos/src/process/do_spawn/mod.rs +++ b/src/libos/src/process/do_spawn/mod.rs @@ -206,7 +206,7 @@ fn load_elf_to_vec(elf_path: &str, current_ref: &ThreadRef) -> Result> { .fs() .lock() .unwrap() - .lookup_inode(elf_path) + .lookup_inode_follow(elf_path) .map_err(|e| errno!(e.errno(), "cannot find the ELF"))?; let file_mode = { let info = inode.metadata()?;