fix: memory leakage in file descriptor allocation
authorMinep <zelong56@gmail.com>
Wed, 9 Nov 2022 21:42:11 +0000 (21:42 +0000)
committerMinep <zelong56@gmail.com>
Wed, 9 Nov 2022 21:42:11 +0000 (21:42 +0000)
lunaix-os/includes/lunaix/fs.h
lunaix-os/kernel/fs/vfs.c
lunaix-os/kernel/process/sched.c

index 539f0a8aa0d8ccd658e522751319606440f936b8..4f57e08c37a99ac5fe547cb11645cda9d54b088b 100644 (file)
@@ -341,6 +341,9 @@ vfs_pclose(struct v_file* file, pid_t pid);
 int
 vfs_close(struct v_file* file);
 
 int
 vfs_close(struct v_file* file);
 
+void
+vfs_free_fd(struct v_fd* fd);
+
 int
 vfs_fsync(struct v_file* file);
 
 int
 vfs_fsync(struct v_file* file);
 
index d0fbb1cbb6ded93406770d38894873da4faf4f49..f5b650653cf20e57bac2b41b95e85093b565014b 100644 (file)
@@ -300,6 +300,12 @@ vfs_close(struct v_file* file)
     return vfs_pclose(file, __current->pid);
 }
 
     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)
 {
 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_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;
         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;
     }
 
         goto done_err;
     }
 
-    vfree(fd_s);
+    cake_release(fd_pile, fd_s);
     __current->fdtable->fds[fd] = 0;
 
 done_err:
     __current->fdtable->fds[fd] = 0;
 
 done_err:
index caec0e67cd05acd8d6ea26bf1d828eaed2f35b64..c2a24261dde6c7dc92eba8285b37368209c9a457 100644 (file)
@@ -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];
 
     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_pclose(fd->file, pid);
+            vfs_free_fd(fd);
+        }
     }
 
     vfree(proc->fdtable);
     }
 
     vfree(proc->fdtable);