summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-12-08 19:43:31 +0100
committerAnton Kling <anton@kling.gg>2024-12-08 19:43:31 +0100
commita7ef3d06f74c8131b04b41cdf902e3c59f61769f (patch)
treebfb97ac76b6ceb4282e5c55e5827c8f1c1eebf02 /kernel
parent3918a0e92f47f0998fadbc19f0a567e985445407 (diff)
vfs: Force truncation even without permissions
O_TRUNC as a mode does not seem to imply write permissions but we still wish to truncate the file before giving back a file descriptor. Therefore the kernel can now override any permission checks if it wishes to do a truncation while still using the "ordinary path".
Diffstat (limited to 'kernel')
-rw-r--r--kernel/cpu/syscall.c2
-rw-r--r--kernel/fs/vfs.c6
-rw-r--r--kernel/fs/vfs.h2
3 files changed, 5 insertions, 5 deletions
diff --git a/kernel/cpu/syscall.c b/kernel/cpu/syscall.c
index 284a80d..a78e63e 100644
--- a/kernel/cpu/syscall.c
+++ b/kernel/cpu/syscall.c
@@ -152,7 +152,7 @@ int syscall_fstat(int fd, struct stat *buf) {
}
int syscall_ftruncate(int fd, size_t length) {
- return vfs_ftruncate(fd, length);
+ return vfs_ftruncate(fd, length, 0);
}
char *syscall_getcwd(char *buf, size_t size) {
diff --git a/kernel/fs/vfs.c b/kernel/fs/vfs.c
index c06c71f..3b912ce 100644
--- a/kernel/fs/vfs.c
+++ b/kernel/fs/vfs.c
@@ -289,7 +289,7 @@ int vfs_open(const char *file, int flags, int mode) {
// FIXME: Maybe it is sometimes a TTY?
int rc = vfs_create_fd(flags, mode, 0 /*is_tty*/, inode, NULL);
if (flags & O_TRUNC) {
- vfs_ftruncate(rc, 0);
+ vfs_ftruncate(rc, 0, 1);
}
return rc;
}
@@ -488,12 +488,12 @@ int vfs_dup2(int org_fd, int new_fd) {
return 1;
}
-int vfs_ftruncate(int fd, size_t length) {
+int vfs_ftruncate(int fd, size_t length, int force_truncate) {
vfs_fd_t *fd_ptr = get_vfs_fd(fd, NULL);
if (!fd_ptr) {
return -EBADF;
}
- if (!(fd_ptr->flags & O_READ)) {
+ if (!(fd_ptr->flags & O_WRITE) && !force_truncate) {
return -EINVAL;
}
vfs_inode_t *inode = fd_ptr->inode;
diff --git a/kernel/fs/vfs.h b/kernel/fs/vfs.h
index cb1c885..98220d3 100644
--- a/kernel/fs/vfs.h
+++ b/kernel/fs/vfs.h
@@ -86,7 +86,7 @@ vfs_inode_t *vfs_internal_open(const char *file);
int vfs_mkdir(const char *path, int mode);
int vfs_create_fd(int flags, int mode, int is_tty, vfs_inode_t *inode,
vfs_fd_t **fd);
-int vfs_ftruncate(int fd, size_t length);
+int vfs_ftruncate(int fd, size_t length, int force_truncate);
int vfs_chdir(const char *path);
int vfs_fstat(int fd, struct stat *buf);
vfs_inode_t *vfs_create_inode(