diff options
-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); |