diff options
author | Anton Kling <anton@kling.gg> | 2024-06-25 19:20:03 +0200 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2024-06-25 19:20:03 +0200 |
commit | edac853e8935164113bda594865cd48c91893d11 (patch) | |
tree | adcc40c27a658c7601c410f3e49fbc762544979b | |
parent | 31743482bbdceeb2a0e52ae430ce1afad853e7e9 (diff) |
VFS: dup2 fixes
-rw-r--r-- | kernel/fs/vfs.c | 4 | ||||
-rw-r--r-- | kernel/lib/relist.c | 3 | ||||
-rw-r--r-- | userland/windowserver/ws.c | 7 |
3 files changed, 9 insertions, 5 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(¤t_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; } diff --git a/userland/windowserver/ws.c b/userland/windowserver/ws.c index 7a1b7d6..ff341a0 100644 --- a/userland/windowserver/ws.c +++ b/userland/windowserver/ws.c @@ -686,13 +686,14 @@ void draw(void) { } int main(void) { - open("/dev/serial", O_WRITE, 0); - open("/dev/serial", O_WRITE, 0); + int serial_fd = open("/dev/serial", O_WRITE, 0); + dup2(serial_fd, 1); + serial_fd = 1; // Start a terminal by default. This is just to make it easier for me // to test the system. int pid = fork(); if (0 == pid) { - // TODO: Close (almost) all file descriptors from parent + close(serial_fd); char *argv[] = {"/term", NULL}; execv("/term", argv); assert(0); |