summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-06-25 19:20:03 +0200
committerAnton Kling <anton@kling.gg>2024-06-25 19:20:03 +0200
commitedac853e8935164113bda594865cd48c91893d11 (patch)
treeadcc40c27a658c7601c410f3e49fbc762544979b /kernel
parent31743482bbdceeb2a0e52ae430ce1afad853e7e9 (diff)
VFS: dup2 fixes
Diffstat (limited to 'kernel')
-rw-r--r--kernel/fs/vfs.c4
-rw-r--r--kernel/lib/relist.c3
2 files changed, 5 insertions, 2 deletions
diff --git a/kernel/fs/vfs.c b/kernel/fs/vfs.c
index 7c97cb2..ffecc5d 100644
--- a/kernel/fs/vfs.c
+++ b/kernel/fs/vfs.c
@@ -412,6 +412,10 @@ vfs_vm_object_t *vfs_get_vm_object(int fd, u64 length, u64 offset) {
}
int vfs_dup2(int org_fd, int new_fd) {
+ if (org_fd == new_fd) {
+ return -EINVAL;
+ }
+
vfs_fd_t *orig;
if (!relist_get(&current_task->file_descriptors, org_fd, (void **)&orig,
NULL)) {
diff --git a/kernel/lib/relist.c b/kernel/lib/relist.c
index 2e45429..5c03ab2 100644
--- a/kernel/lib/relist.c
+++ b/kernel/lib/relist.c
@@ -129,8 +129,7 @@ int relist_set(struct relist *list, u32 index, void *value) {
assert(0);
return 0;
}
- int is_used = (list->bitmap[index / 64] & ((u64)1 << (index % 64)));
- assert(is_used);
+ list->bitmap[index / 64] |= ((u64)1 << (index % 64));
list->entries[index] = value;
return 1;
}