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

fix(syscall): make getcwd return buf length filled

greatbridf 9 сар өмнө
parent
commit
4ec085b55c

+ 1 - 1
include/kernel/syscall.hpp

@@ -79,7 +79,7 @@ uid_t do_getuid();
 uid_t do_geteuid();
 gid_t do_getgid();
 pid_t do_gettid();
-char __user* do_getcwd(char __user* buf, size_t buf_size);
+int do_getcwd(char __user* buf, size_t buf_size);
 uintptr_t do_brk(uintptr_t addr);
 int do_umask(mode_t mask);
 int do_kill(pid_t pid, int sig);

+ 8 - 5
src/kernel/syscall/procops.cc

@@ -139,14 +139,17 @@ int kernel::syscall::do_waitpid(pid_t waitpid, int __user* arg1, int options)
     return -EINVAL;
 }
 
-char __user* kernel::syscall::do_getcwd(char __user* buf, size_t buf_size)
+int kernel::syscall::do_getcwd(char __user* buf, size_t buf_size)
 {
-    // TODO: use copy_to_user
     auto path = current_process->pwd.full_path();
-    strncpy(buf, path.c_str(), buf_size);
-    buf[buf_size - 1] = 0;
 
-    return buf;
+    int len = std::min(buf_size-1, path.size());
+
+    // TODO: use copy_to_user
+    strncpy(buf, path.c_str(), len);
+    buf[len] = 0;
+
+    return len;
 }
 
 pid_t kernel::syscall::do_setsid()