From 55833537f1156ffdba6747379a911ad3ed2e771b Mon Sep 17 00:00:00 2001 From: LoGin Date: Sat, 29 Mar 2025 23:46:55 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Delf=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E5=99=A8=E5=9C=A8=E8=AF=BB=E5=8F=96=E8=A7=A3=E9=87=8A=E5=99=A8?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E6=97=B6=E7=9A=84=E8=B6=8A=E7=95=8C=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20(#1124)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: longjin --- kernel/src/libs/elf.rs | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/kernel/src/libs/elf.rs b/kernel/src/libs/elf.rs index 7cbfdb91..f1c660c6 100644 --- a/kernel/src/libs/elf.rs +++ b/kernel/src/libs/elf.rs @@ -558,14 +558,26 @@ impl BinaryLoader for ElfLoader { if seg.p_filesz > 4096 || seg.p_filesz < 2 { return Err(ExecError::NotExecutable); } - - let interpreter_ptr = unsafe { - core::slice::from_raw_parts( - seg.p_offset as *const u8, + let mut buffer = vec![0; seg.p_filesz.try_into().unwrap()]; + let r = param + .file_mut() + .pread( + seg.p_offset.try_into().unwrap(), seg.p_filesz.try_into().unwrap(), + buffer.as_mut_slice(), ) - }; - let _interpreter_path = core::str::from_utf8(interpreter_ptr).map_err(|e| { + .map_err(|e| { + log::error!("Failed to load interpreter :{:?}", e); + return ExecError::NotSupported; + })?; + if r != seg.p_filesz.try_into().unwrap() { + log::error!("Failed to load interpreter "); + return Err(ExecError::NotSupported); + } + let _interpreter_path = core::str::from_utf8( + &buffer[0..TryInto::::try_into(seg.p_filesz).unwrap() - 1], // + ) + .map_err(|e| { ExecError::Other(format!( "Failed to parse the path of dynamic linker with error {}", e