Эх сурвалжийг харах

fix(getcwd): do not copy to user directly

greatbridf 3 сар өмнө
parent
commit
255b3636d7

+ 7 - 3
src/kernel/syscall/procops.rs

@@ -1,13 +1,14 @@
 use alloc::borrow::ToOwned;
 use alloc::ffi::CString;
 use arch::{ExtendedContext, InterruptContext};
-use bindings::{EINVAL, ENOENT, ENOTDIR, ESRCH};
+use bindings::{EINVAL, ENOENT, ENOTDIR, ERANGE, ESRCH};
 use bitflags::bitflags;
 
 use crate::elf::ParsedElf32;
 use crate::io::Buffer;
 use crate::kernel::constants::{PR_GET_NAME, PR_SET_NAME, SIG_BLOCK, SIG_SETMASK, SIG_UNBLOCK};
-use crate::kernel::mem::VAddr;
+use crate::kernel::mem::phys::PhysPtr;
+use crate::kernel::mem::{Page, PageBuffer, VAddr};
 use crate::kernel::task::{
     ProcessList, Scheduler, Signal, SignalAction, Thread, UserDescriptor, WaitObject, WaitType,
 };
@@ -33,9 +34,12 @@ fn do_umask(mask: u32) -> KResult<u32> {
 
 fn do_getcwd(buffer: *mut u8, bufsize: usize) -> KResult<usize> {
     let context = FsContext::get_current();
-    let mut buffer = UserBuffer::new(buffer, bufsize)?;
+    let mut user_buffer = UserBuffer::new(buffer, bufsize)?;
 
+    let page = Page::alloc_one();
+    let mut buffer = PageBuffer::new(page.clone());
     context.cwd.lock().get_path(&context, &mut buffer)?;
+    user_buffer.fill(page.as_cached().as_slice(page.len()))?.ok_or(ERANGE)?;
 
     Ok(buffer.wrote())
 }