mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 15:40:19 +00:00
Kernel: Have the open() syscall take an explicit path length parameter.
Instead of computing the path length inside the syscall handler, let the caller do that work. This allows us to implement to new variants of open() and creat(), called open_with_path_length() and creat_with_path_length(). These are suitable for use with e.g StringView.
This commit is contained in:
parent
fc4022d173
commit
c110cf193d
Notes:
sideshowbarker
2024-07-19 13:21:47 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/c110cf193d3
9 changed files with 40 additions and 9 deletions
|
@ -13,7 +13,7 @@ namespace AK {
|
||||||
MappedFile::MappedFile(const StringView& file_name)
|
MappedFile::MappedFile(const StringView& file_name)
|
||||||
{
|
{
|
||||||
m_size = PAGE_SIZE;
|
m_size = PAGE_SIZE;
|
||||||
m_fd = open(String(file_name).characters(), O_RDONLY | O_CLOEXEC);
|
m_fd = open_with_path_length(file_name.characters_without_null_termination(), file_name.length(), O_RDONLY | O_CLOEXEC, 0);
|
||||||
|
|
||||||
if (m_fd != -1) {
|
if (m_fd != -1) {
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
|
|
@ -1127,12 +1127,18 @@ int Process::number_of_open_file_descriptors() const
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Process::sys$open(const char* path, int options, mode_t mode)
|
int Process::sys$open(const Syscall::SC_open_params* params)
|
||||||
{
|
{
|
||||||
|
if (!validate_read_typed(params))
|
||||||
|
return -EFAULT;
|
||||||
|
auto* path = params->path;
|
||||||
|
auto path_length = params->path_length;
|
||||||
|
auto options = params->options;
|
||||||
|
auto mode = params->mode;
|
||||||
#ifdef DEBUG_IO
|
#ifdef DEBUG_IO
|
||||||
dbgprintf("%s(%u) sys$open(\"%s\")\n", name().characters(), pid(), path);
|
dbgprintf("%s(%u) sys$open(\"%s\")\n", name().characters(), pid(), path);
|
||||||
#endif
|
#endif
|
||||||
if (!validate_read_str(path))
|
if (!validate_read(path, path_length))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
int fd = alloc_fd();
|
int fd = alloc_fd();
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
|
|
|
@ -118,7 +118,7 @@ public:
|
||||||
pid_t sys$getpid();
|
pid_t sys$getpid();
|
||||||
pid_t sys$getppid();
|
pid_t sys$getppid();
|
||||||
mode_t sys$umask(mode_t);
|
mode_t sys$umask(mode_t);
|
||||||
int sys$open(const char* path, int options, mode_t mode = 0);
|
int sys$open(const Syscall::SC_open_params*);
|
||||||
int sys$close(int fd);
|
int sys$close(int fd);
|
||||||
ssize_t sys$read(int fd, u8*, ssize_t);
|
ssize_t sys$read(int fd, u8*, ssize_t);
|
||||||
ssize_t sys$write(int fd, const u8*, ssize_t);
|
ssize_t sys$write(int fd, const u8*, ssize_t);
|
||||||
|
|
|
@ -85,7 +85,7 @@ static u32 handle(RegisterDump& regs, u32 function, u32 arg1, u32 arg2, u32 arg3
|
||||||
case Syscall::SC_getcwd:
|
case Syscall::SC_getcwd:
|
||||||
return current->process().sys$getcwd((char*)arg1, (size_t)arg2);
|
return current->process().sys$getcwd((char*)arg1, (size_t)arg2);
|
||||||
case Syscall::SC_open:
|
case Syscall::SC_open:
|
||||||
return current->process().sys$open((const char*)arg1, (int)arg2, (mode_t)arg3);
|
return current->process().sys$open((const SC_open_params*)arg1);
|
||||||
case Syscall::SC_write:
|
case Syscall::SC_write:
|
||||||
return current->process().sys$write((int)arg1, (const u8*)arg2, (ssize_t)arg3);
|
return current->process().sys$write((int)arg1, (const u8*)arg2, (ssize_t)arg3);
|
||||||
case Syscall::SC_close:
|
case Syscall::SC_close:
|
||||||
|
|
|
@ -148,6 +148,13 @@ struct SC_mmap_params {
|
||||||
const char* name { nullptr };
|
const char* name { nullptr };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct SC_open_params {
|
||||||
|
const char* path;
|
||||||
|
int path_length;
|
||||||
|
int options;
|
||||||
|
u16 mode;
|
||||||
|
};
|
||||||
|
|
||||||
struct SC_select_params {
|
struct SC_select_params {
|
||||||
int nfds;
|
int nfds;
|
||||||
fd_set* readfds;
|
fd_set* readfds;
|
||||||
|
|
|
@ -166,13 +166,29 @@ int creat(const char* path, mode_t mode)
|
||||||
return open(path, O_CREAT | O_WRONLY | O_TRUNC, mode);
|
return open(path, O_CREAT | O_WRONLY | O_TRUNC, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int creat_with_path_length(const char* path, size_t path_length, mode_t mode)
|
||||||
|
{
|
||||||
|
return open_with_path_length(path, path_length, O_CREAT | O_WRONLY | O_TRUNC, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
int open_with_path_length(const char* path, size_t path_length, int options, mode_t mode)
|
||||||
|
{
|
||||||
|
if (path_length > INT32_MAX) {
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
Syscall::SC_open_params params { path, (int)path_length, options, mode };
|
||||||
|
int rc = syscall(SC_open, ¶ms);
|
||||||
|
__RETURN_WITH_ERRNO(rc, rc, -1);
|
||||||
|
}
|
||||||
|
|
||||||
int open(const char* path, int options, ...)
|
int open(const char* path, int options, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, options);
|
va_start(ap, options);
|
||||||
int rc = syscall(SC_open, path, options, (mode_t)va_arg(ap, unsigned));
|
auto mode = (mode_t)va_arg(ap, unsigned);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
__RETURN_WITH_ERRNO(rc, rc, -1);
|
return open_with_path_length(path, strlen(path), options, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t read(int fd, void* buf, size_t count)
|
ssize_t read(int fd, void* buf, size_t count)
|
||||||
|
|
|
@ -55,6 +55,8 @@ pid_t tcgetpgrp(int fd);
|
||||||
int tcsetpgrp(int fd, pid_t pgid);
|
int tcsetpgrp(int fd, pid_t pgid);
|
||||||
int creat(const char* path, mode_t);
|
int creat(const char* path, mode_t);
|
||||||
int open(const char* path, int options, ...);
|
int open(const char* path, int options, ...);
|
||||||
|
int creat_with_path_length(const char* path, size_t path_length, mode_t);
|
||||||
|
int open_with_path_length(const char* path, size_t path_length, int options, mode_t);
|
||||||
ssize_t read(int fd, void* buf, size_t count);
|
ssize_t read(int fd, void* buf, size_t count);
|
||||||
ssize_t write(int fd, const void* buf, size_t count);
|
ssize_t write(int fd, const void* buf, size_t count);
|
||||||
int close(int fd);
|
int close(int fd);
|
||||||
|
|
|
@ -844,7 +844,7 @@ void GTextEditor::Line::truncate(int length)
|
||||||
|
|
||||||
bool GTextEditor::write_to_file(const StringView& path)
|
bool GTextEditor::write_to_file(const StringView& path)
|
||||||
{
|
{
|
||||||
int fd = open(String(path).characters(), O_WRONLY | O_CREAT | O_TRUNC, 0666);
|
int fd = open_with_path_length(path.characters_without_null_termination(), path.length(), O_WRONLY | O_CREAT | O_TRUNC, 0666);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
perror("open");
|
perror("open");
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -127,7 +127,7 @@ RefPtr<Font> Font::load_from_file(const StringView& path)
|
||||||
|
|
||||||
bool Font::write_to_file(const StringView& path)
|
bool Font::write_to_file(const StringView& path)
|
||||||
{
|
{
|
||||||
int fd = creat(String(path).characters(), 0644);
|
int fd = creat_with_path_length(path.characters_without_null_termination(), path.length(), 0644);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
perror("open");
|
perror("open");
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in a new issue