From: Minep Date: Wed, 9 Nov 2022 21:42:11 +0000 (+0000) Subject: fix: memory leakage in file descriptor allocation X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/commitdiff_plain/cb089e17fcc6bd4823bd919cce2b9e62631cd570?hp=e6416905c4afb34e61276cdc07c44813a3ebc5e7 fix: memory leakage in file descriptor allocation --- diff --git a/lunaix-os/includes/lunaix/fs.h b/lunaix-os/includes/lunaix/fs.h index 539f0a8..4f57e08 100644 --- a/lunaix-os/includes/lunaix/fs.h +++ b/lunaix-os/includes/lunaix/fs.h @@ -341,6 +341,9 @@ vfs_pclose(struct v_file* file, pid_t pid); int vfs_close(struct v_file* file); +void +vfs_free_fd(struct v_fd* fd); + int vfs_fsync(struct v_file* file); diff --git a/lunaix-os/kernel/fs/vfs.c b/lunaix-os/kernel/fs/vfs.c index d0fbb1c..f5b6506 100644 --- a/lunaix-os/kernel/fs/vfs.c +++ b/lunaix-os/kernel/fs/vfs.c @@ -300,6 +300,12 @@ vfs_close(struct v_file* file) return vfs_pclose(file, __current->pid); } +void +vfs_free_fd(struct v_fd* fd) +{ + cake_release(fd_pile, fd); +} + int vfs_fsync(struct v_file* file) { @@ -570,7 +576,9 @@ vfs_do_open(const char* path, int options) struct v_inode* o_inode = ofile->inode; if (!errno && !(errno = vfs_alloc_fdslot(&fd))) { - struct v_fd* fd_s = vzalloc(sizeof(*fd_s)); + struct v_fd* fd_s = cake_grab(fd_pile); + memset(fd_s, 0, sizeof(*fd_s)); + ofile->f_pos = ofile->inode->fsize & -((options & FO_APPEND) != 0); fd_s->file = ofile; fd_s->flags = options; @@ -599,7 +607,7 @@ __DEFINE_LXSYSCALL1(int, close, int, fd) goto done_err; } - vfree(fd_s); + cake_release(fd_pile, fd_s); __current->fdtable->fds[fd] = 0; done_err: diff --git a/lunaix-os/kernel/process/sched.c b/lunaix-os/kernel/process/sched.c index caec0e6..c2a2426 100644 --- a/lunaix-os/kernel/process/sched.c +++ b/lunaix-os/kernel/process/sched.c @@ -347,8 +347,10 @@ destroy_process(pid_t pid) for (size_t i = 0; i < VFS_MAX_FD; i++) { struct v_fd* fd = proc->fdtable->fds[i]; - if (fd) + if (fd) { vfs_pclose(fd->file, pid); + vfs_free_fd(fd); + } } vfree(proc->fdtable);