mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 22:37:35 +00:00
Kernel: Pass characters+length to link()
This commit is contained in:
parent
416c7ac2b5
commit
485443bfca
5 changed files with 35 additions and 7 deletions
|
@ -1564,6 +1564,15 @@ bool Process::validate(const Syscall::MutableBufferArgument<DataType, SizeType>&
|
||||||
return validate_write(buffer.data, buffer.size);
|
return validate_write(buffer.data, buffer.size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String Process::validate_and_copy_string_from_user(const Syscall::StringArgument& string) const
|
||||||
|
{
|
||||||
|
if (!validate_read(string.characters, string.length))
|
||||||
|
return {};
|
||||||
|
SmapDisabler disabler;
|
||||||
|
size_t length = strnlen(string.characters, string.length);
|
||||||
|
return String(string.characters, length);
|
||||||
|
}
|
||||||
|
|
||||||
int Process::sys$readlink(const Syscall::SC_readlink_params* user_params)
|
int Process::sys$readlink(const Syscall::SC_readlink_params* user_params)
|
||||||
{
|
{
|
||||||
if (!validate_read_typed(user_params))
|
if (!validate_read_typed(user_params))
|
||||||
|
@ -2548,14 +2557,17 @@ Custody& Process::current_directory()
|
||||||
return *m_cwd;
|
return *m_cwd;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Process::sys$link(const char* old_path, const char* new_path)
|
int Process::sys$link(const Syscall::SC_link_params* user_params)
|
||||||
{
|
{
|
||||||
SmapDisabler disabler;
|
if (!validate_read_typed(user_params))
|
||||||
if (!validate_read_str(old_path))
|
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if (!validate_read_str(new_path))
|
Syscall::SC_link_params params;
|
||||||
|
copy_from_user(¶ms, user_params, sizeof(params));
|
||||||
|
auto old_path = validate_and_copy_string_from_user(params.old_path);
|
||||||
|
auto new_path = validate_and_copy_string_from_user(params.new_path);
|
||||||
|
if (old_path.is_null() || new_path.is_null())
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return VFS::the().link(StringView(old_path), StringView(new_path), current_directory());
|
return VFS::the().link(old_path, new_path, current_directory());
|
||||||
}
|
}
|
||||||
|
|
||||||
int Process::sys$unlink(const char* user_path, size_t path_length)
|
int Process::sys$unlink(const char* user_path, size_t path_length)
|
||||||
|
|
|
@ -175,7 +175,7 @@ public:
|
||||||
int sys$mkdir(const char* pathname, size_t path_length, mode_t mode);
|
int sys$mkdir(const char* pathname, size_t path_length, mode_t mode);
|
||||||
clock_t sys$times(tms*);
|
clock_t sys$times(tms*);
|
||||||
int sys$utime(const char* pathname, size_t path_length, const struct utimbuf*);
|
int sys$utime(const char* pathname, size_t path_length, const struct utimbuf*);
|
||||||
int sys$link(const char* old_path, const char* new_path);
|
int sys$link(const Syscall::SC_link_params*);
|
||||||
int sys$unlink(const char* pathname, size_t path_length);
|
int sys$unlink(const char* pathname, size_t path_length);
|
||||||
int sys$symlink(const char* target, const char* linkpath);
|
int sys$symlink(const char* target, const char* linkpath);
|
||||||
int sys$rmdir(const char* pathname, size_t path_length);
|
int sys$rmdir(const char* pathname, size_t path_length);
|
||||||
|
@ -263,6 +263,8 @@ public:
|
||||||
template<typename DataType, typename SizeType>
|
template<typename DataType, typename SizeType>
|
||||||
bool validate(const Syscall::MutableBufferArgument<DataType, SizeType>&);
|
bool validate(const Syscall::MutableBufferArgument<DataType, SizeType>&);
|
||||||
|
|
||||||
|
String validate_and_copy_string_from_user(const Syscall::StringArgument&) const;
|
||||||
|
|
||||||
Custody& current_directory();
|
Custody& current_directory();
|
||||||
Custody* executable() { return m_executable.ptr(); }
|
Custody* executable() { return m_executable.ptr(); }
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,10 @@ namespace AK {
|
||||||
class String;
|
class String;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace Syscall {
|
||||||
|
struct StringArgument;
|
||||||
|
}
|
||||||
|
|
||||||
AK::String copy_string_from_user(const char*, size_t);
|
AK::String copy_string_from_user(const char*, size_t);
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
|
@ -327,6 +327,11 @@ struct SC_readlink_params {
|
||||||
MutableBufferArgument<char, size_t> buffer;
|
MutableBufferArgument<char, size_t> buffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct SC_link_params {
|
||||||
|
StringArgument old_path;
|
||||||
|
StringArgument new_path;
|
||||||
|
};
|
||||||
|
|
||||||
void initialize();
|
void initialize();
|
||||||
int sync();
|
int sync();
|
||||||
|
|
||||||
|
|
|
@ -339,7 +339,12 @@ off_t lseek(int fd, off_t offset, int whence)
|
||||||
|
|
||||||
int link(const char* old_path, const char* new_path)
|
int link(const char* old_path, const char* new_path)
|
||||||
{
|
{
|
||||||
int rc = syscall(SC_link, old_path, new_path);
|
if (!old_path || !new_path) {
|
||||||
|
errno = EFAULT;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
Syscall::SC_link_params params { { old_path, strlen(old_path) }, { new_path, strlen(new_path) } };
|
||||||
|
int rc = syscall(SC_link, ¶ms);
|
||||||
__RETURN_WITH_ERRNO(rc, rc, -1);
|
__RETURN_WITH_ERRNO(rc, rc, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue