浏览代码

Kernel: Pass a parameter struct to rename()

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

+ 11 - 6
Kernel/Process.cpp

@@ -3476,14 +3476,19 @@ int Process::sys$donate(int tid)
     return 0;
 }
 
-int Process::sys$rename(const char* oldpath, const char* newpath)
+int Process::sys$rename(const Syscall::SC_rename_params* user_params)
 {
-    SmapDisabler disabler;
-    if (!validate_read_str(oldpath))
-        return -EFAULT;
-    if (!validate_read_str(newpath))
+    if (!validate_read_typed(user_params))
         return -EFAULT;
-    return VFS::the().rename(StringView(oldpath), StringView(newpath), current_directory());
+    Syscall::SC_rename_params params;
+    copy_from_user(&params, user_params);
+    auto old_path = get_syscall_path_argument(params.old_path.characters, params.old_path.length);
+    if (old_path.is_error())
+        return old_path.error();
+    auto new_path = get_syscall_path_argument(params.new_path.characters, params.new_path.length);
+    if (new_path.is_error())
+        return new_path.error();
+    return VFS::the().rename(old_path.value(), new_path.value(), current_directory());
 }
 
 int Process::sys$ftruncate(int fd, off_t length)

+ 1 - 1
Kernel/Process.h

@@ -204,7 +204,7 @@ public:
     int sys$detach_thread(int tid);
     int sys$set_thread_name(int tid, const char* buffer, int buffer_size);
     int sys$get_thread_name(int tid, char* buffer, int buffer_size);
-    int sys$rename(const char* oldpath, const char* newpath);
+    int sys$rename(const Syscall::SC_rename_params*);
     int sys$systrace(pid_t);
     int sys$mknod(const Syscall::SC_mknod_params*);
     int sys$create_shared_buffer(int, void** buffer);

+ 5 - 0
Kernel/Syscall.h

@@ -350,6 +350,11 @@ struct SC_symlink_params {
     StringArgument linkpath;
 };
 
+struct SC_rename_params {
+    StringArgument old_path;
+    StringArgument new_path;
+};
+
 void initialize();
 int sync();
 

+ 6 - 1
Libraries/LibC/stdio.cpp

@@ -510,7 +510,12 @@ int fclose(FILE* stream)
 
 int rename(const char* oldpath, const char* newpath)
 {
-    int rc = syscall(SC_rename, oldpath, newpath);
+    if (!oldpath || !newpath) {
+        errno = EFAULT;
+        return -1;
+    }
+    Syscall::SC_rename_params params { { oldpath, strlen(oldpath) }, { newpath, strlen(newpath) } };
+    int rc = syscall(SC_rename, &params);
     __RETURN_WITH_ERRNO(rc, rc, -1);
 }