浏览代码

Kernel: Pass a parameter struct to chown()

Andreas Kling 5 年之前
父节点
当前提交
6536a80aa9
共有 4 个文件被更改,包括 21 次插入6 次删除
  1. 8 4
      Kernel/Process.cpp
  2. 1 1
      Kernel/Process.h
  3. 6 0
      Kernel/Syscall.h
  4. 6 1
      Libraries/LibC/unistd.cpp

+ 8 - 4
Kernel/Process.cpp

@@ -2640,12 +2640,16 @@ int Process::sys$fchown(int fd, uid_t uid, gid_t gid)
     return description->chown(uid, gid);
     return description->chown(uid, gid);
 }
 }
 
 
-int Process::sys$chown(const char* pathname, uid_t uid, gid_t gid)
+int Process::sys$chown(const Syscall::SC_chown_params* user_params)
 {
 {
-    SmapDisabler disabler;
-    if (!validate_read_str(pathname))
+    if (!validate_read_typed(user_params))
         return -EFAULT;
         return -EFAULT;
-    return VFS::the().chown(StringView(pathname), uid, gid, current_directory());
+    Syscall::SC_chown_params params;
+    copy_from_user(&params, user_params, sizeof(params));
+    auto path = get_syscall_path_argument(params.path.characters, params.path.length);
+    if (path.is_error())
+        return path.error();
+    return VFS::the().chown(path.value(), params.uid, params.gid, current_directory());
 }
 }
 
 
 void Process::finalize()
 void Process::finalize()

+ 1 - 1
Kernel/Process.h

@@ -183,7 +183,7 @@ public:
     int sys$umount(const char* mountpoint, size_t mountpoint_length);
     int sys$umount(const char* mountpoint, size_t mountpoint_length);
     int sys$chmod(const char* pathname, size_t path_length, mode_t);
     int sys$chmod(const char* pathname, size_t path_length, mode_t);
     int sys$fchmod(int fd, mode_t);
     int sys$fchmod(int fd, mode_t);
-    int sys$chown(const char* pathname, uid_t, gid_t);
+    int sys$chown(const Syscall::SC_chown_params*);
     int sys$fchown(int fd, uid_t, gid_t);
     int sys$fchown(int fd, uid_t, gid_t);
     int sys$socket(int domain, int type, int protocol);
     int sys$socket(int domain, int type, int protocol);
     int sys$bind(int sockfd, const sockaddr* addr, socklen_t);
     int sys$bind(int sockfd, const sockaddr* addr, socklen_t);

+ 6 - 0
Kernel/Syscall.h

@@ -333,6 +333,12 @@ struct SC_link_params {
     StringArgument new_path;
     StringArgument new_path;
 };
 };
 
 
+struct SC_chown_params {
+     StringArgument path;
+     u32 uid;
+     u32 gid;
+};
+
 void initialize();
 void initialize();
 int sync();
 int sync();
 
 

+ 6 - 1
Libraries/LibC/unistd.cpp

@@ -27,7 +27,12 @@ int systrace(pid_t pid)
 
 
 int chown(const char* pathname, uid_t uid, gid_t gid)
 int chown(const char* pathname, uid_t uid, gid_t gid)
 {
 {
-    int rc = syscall(SC_chown, pathname, uid, gid);
+    if (!pathname) {
+        errno = EFAULT;
+        return -1;
+    }
+    Syscall::SC_chown_params params { { pathname, strlen(pathname) }, uid, gid };
+    int rc = syscall(SC_chown, &params);
     __RETURN_WITH_ERRNO(rc, rc, -1);
     __RETURN_WITH_ERRNO(rc, rc, -1);
 }
 }