summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/fs/vfs.c4
-rw-r--r--kernel/lib/relist.c3
-rw-r--r--userland/windowserver/ws.c7
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(&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;
}
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);