From e380142853f2468a76a48a8c0036b1c46f977da9 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 11 Jan 2020 10:36:54 +0100 Subject: [PATCH] Kernel: Pass a parameter struct to rename() --- Kernel/Process.cpp | 17 +++++++++++------ Kernel/Process.h | 2 +- Kernel/Syscall.h | 5 +++++ Libraries/LibC/stdio.cpp | 7 ++++++- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 4b6c062ed4..9bdd497d6c 100644 --- a/Kernel/Process.cpp +++ b/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)) + if (!validate_read_typed(user_params)) return -EFAULT; - if (!validate_read_str(newpath)) - return -EFAULT; - return VFS::the().rename(StringView(oldpath), StringView(newpath), current_directory()); + Syscall::SC_rename_params params; + copy_from_user(¶ms, 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) diff --git a/Kernel/Process.h b/Kernel/Process.h index dc21932cb3..50f36ee6e4 100644 --- a/Kernel/Process.h +++ b/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); diff --git a/Kernel/Syscall.h b/Kernel/Syscall.h index b2e2c39d8f..57899c3883 100644 --- a/Kernel/Syscall.h +++ b/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(); diff --git a/Libraries/LibC/stdio.cpp b/Libraries/LibC/stdio.cpp index 5f93aba2bb..5a28d90325 100644 --- a/Libraries/LibC/stdio.cpp +++ b/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, ¶ms); __RETURN_WITH_ERRNO(rc, rc, -1); }