From 09bac3d4b5c9acc43e28da05eb4ca5f66a473fcb Mon Sep 17 00:00:00 2001 From: "Hui, Chunyang" Date: Wed, 7 Apr 2021 07:47:22 +0000 Subject: [PATCH] Fix panic for non-specified exec file path This commit can prevent panic when user input: occlum run /bin --- src/libos/src/process/do_spawn/exec_loader.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/libos/src/process/do_spawn/exec_loader.rs b/src/libos/src/process/do_spawn/exec_loader.rs index f5e7cbad..9abf5303 100644 --- a/src/libos/src/process/do_spawn/exec_loader.rs +++ b/src/libos/src/process/do_spawn/exec_loader.rs @@ -2,7 +2,7 @@ use super::super::elf_file::*; use super::ThreadRef; use crate::fs::{FileMode, INodeExt}; use crate::prelude::*; -use rcore_fs::vfs::INode; +use rcore_fs::vfs::{FileType, INode, Metadata}; use std::ffi::CString; /// Load an ELF file header or a script's interpreter header into a vector. @@ -79,6 +79,13 @@ pub fn load_file_hdr_to_vec( .unwrap() .lookup_inode(file_path) .map_err(|e| errno!(e.errno(), "cannot find the file"))?; + + // Make sure the final file to exec is not a directory + let metadata = inode.metadata()?; + if metadata.type_ != FileType::File { + return_errno!(EACCES, "it is not a regular file"); + } + let file_mode = { let info = inode.metadata()?; FileMode::from_bits_truncate(info.mode)