From ce3fad266b6b518178e4c13ce154e923a1147c26 Mon Sep 17 00:00:00 2001 From: Matheus Date: Wed, 8 May 2024 20:57:52 -0300 Subject: [PATCH] syscalls: implement O_CLOEXEC properly --- kernel-src/sys/syscalls/accept.c | 4 ++-- kernel-src/sys/syscalls/execve.c | 14 +++++++++++--- kernel-src/sys/syscalls/open.c | 3 +-- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/kernel-src/sys/syscalls/accept.c b/kernel-src/sys/syscalls/accept.c index e290e09e..bc84be07 100644 --- a/kernel-src/sys/syscalls/accept.c +++ b/kernel-src/sys/syscalls/accept.c @@ -45,7 +45,7 @@ syscallret_t syscall_accept(context_t *, int oldfd, abisockaddr_t *abisockaddr, file_t *newfile; int newfd; - ret.errno = fd_new(0, &newfile, &newfd); + ret.errno = fd_new(acceptflags & O_CLOEXEC, &newfile, &newfd); if (ret.errno) { // socket gets deleted by node cleanup VOP_RELEASE(vnode); @@ -53,7 +53,7 @@ syscallret_t syscall_accept(context_t *, int oldfd, abisockaddr_t *abisockaddr, } newfile->vnode = vnode; - newfile->flags = FILE_READ | FILE_WRITE | (acceptflags & (O_CLOEXEC | O_NONBLOCK)); + newfile->flags = FILE_READ | FILE_WRITE | (acceptflags & (O_NONBLOCK)); newfile->offset = 0; newfile->mode = 0777; diff --git a/kernel-src/sys/syscalls/execve.c b/kernel-src/sys/syscalls/execve.c index 8c47c0f0..7dc81d14 100644 --- a/kernel-src/sys/syscalls/execve.c +++ b/kernel-src/sys/syscalls/execve.c @@ -21,6 +21,7 @@ syscallret_t syscall_execve(context_t *context, char *upath, char *uargv[], char .ret = -1 }; + // TODO shebang // TODO user str ops char *path = alloc(strlen(upath) + 1); if (path == NULL) { @@ -38,6 +39,7 @@ syscallret_t syscall_execve(context_t *context, char *upath, char *uargv[], char vnode_t *node = NULL; vnode_t *refnode = NULL; char *interp = NULL; + void *stack = NULL; while (uargv[argsize++]); while (uenvp[envsize++]); @@ -107,7 +109,7 @@ syscallret_t syscall_execve(context_t *context, char *upath, char *uargv[], char VOP_RELEASE(interpnode); } - void *stack = elf_preparestack(STACK_TOP, &auxv64, argv, envp); + stack = elf_preparestack(STACK_TOP, &auxv64, argv, envp); if (stack == NULL) { ret.errno = ENOMEM; goto error; @@ -115,10 +117,16 @@ syscallret_t syscall_execve(context_t *context, char *upath, char *uargv[], char ret.ret = 0; - // TODO close CLOEXEC fds - sched_stopotherthreads(); + // close O_CLOEXEC fds + + proc_t *proc = _cpu()->thread->proc; + for (int fd = 0; fd < proc->fdcount; ++fd) { + if (proc->fd[fd].flags & O_CLOEXEC) + fd_close(fd); + } + error: free(path); if (argv) diff --git a/kernel-src/sys/syscalls/open.c b/kernel-src/sys/syscalls/open.c index 009f7e32..a2790191 100644 --- a/kernel-src/sys/syscalls/open.c +++ b/kernel-src/sys/syscalls/open.c @@ -28,10 +28,9 @@ syscallret_t syscall_openat(context_t *context, int dirfd, const char *path, int ret.errno = dirfd_enter(pathbuf, dirfd, &dirfile, &dirnode); - // TODO pass CLOEXEC to fd file_t *newfile = NULL; int newfd; - ret.errno = fd_new(0, &newfile, &newfd); + ret.errno = fd_new(flags & O_CLOEXEC, &newfile, &newfd); if (ret.errno) goto cleanup;