1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-28 09:25:06 +00:00

Kernel: Pass a parameter struct to rename()

This commit is contained in:
Andreas Kling 2020-01-11 10:36:54 +01:00
parent 46830a0c32
commit e380142853
4 changed files with 23 additions and 8 deletions

View file

@ -3476,14 +3476,19 @@ int Process::sys$donate(int tid)
return 0; 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_typed(user_params))
if (!validate_read_str(oldpath))
return -EFAULT; return -EFAULT;
if (!validate_read_str(newpath)) Syscall::SC_rename_params params;
return -EFAULT; copy_from_user(&params, user_params);
return VFS::the().rename(StringView(oldpath), StringView(newpath), current_directory()); 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) int Process::sys$ftruncate(int fd, off_t length)

View file

@ -204,7 +204,7 @@ public:
int sys$detach_thread(int tid); int sys$detach_thread(int tid);
int sys$set_thread_name(int tid, const char* buffer, int buffer_size); 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$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$systrace(pid_t);
int sys$mknod(const Syscall::SC_mknod_params*); int sys$mknod(const Syscall::SC_mknod_params*);
int sys$create_shared_buffer(int, void** buffer); int sys$create_shared_buffer(int, void** buffer);

View file

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

View file

@ -510,7 +510,12 @@ int fclose(FILE* stream)
int rename(const char* oldpath, const char* newpath) 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); __RETURN_WITH_ERRNO(rc, rc, -1);
} }