From 2229fd91f7230ae7068814ae029b733945852eb1 Mon Sep 17 00:00:00 2001 From: Anton Kling Date: Tue, 2 Apr 2024 09:17:06 +0200 Subject: Kernel: Fix some memory leaks --- kernel/fs/devfs.c | 3 ++- kernel/fs/ext2.c | 28 ++++++++++++++++------------ kernel/fs/shm.c | 2 +- kernel/fs/tmpfs.c | 6 ++++-- kernel/fs/vfs.c | 13 +++++++++++-- kernel/fs/vfs.h | 5 ++++- 6 files changed, 38 insertions(+), 19 deletions(-) (limited to 'kernel/fs') diff --git a/kernel/fs/devfs.c b/kernel/fs/devfs.c index 2705dc8..a3f13db 100644 --- a/kernel/fs/devfs.c +++ b/kernel/fs/devfs.c @@ -14,7 +14,7 @@ vfs_inode_t *devfs_add_file( u8 has_data, u8 can_write, int type) { files[num_files].name = copy_and_allocate_string(path); - vfs_inode_t *i = kmalloc(sizeof(vfs_inode_t)); + vfs_inode_t *i = kcalloc(1, sizeof(vfs_inode_t)); files[num_files].inode = i; i->type = type; i->read = read; @@ -24,6 +24,7 @@ vfs_inode_t *devfs_add_file( i->has_data = has_data; i->is_open = 1; i->can_write = can_write; + i->ref = 1; num_files++; return i; } diff --git a/kernel/fs/ext2.c b/kernel/fs/ext2.c index 9017b82..167c2aa 100644 --- a/kernel/fs/ext2.c +++ b/kernel/fs/ext2.c @@ -211,9 +211,12 @@ int ext2_get_inode_in_directory(int dir_inode, char *file, if (entry) { memcpy(entry, data_p, sizeof(direntry_header_t)); } - return dir->inode; + int r = dir->inode; + kfree(data); + return r; } } + kfree(data); return 0; } @@ -603,11 +606,12 @@ vfs_inode_t *ext2_open(const char *path) { break; } - return vfs_create_inode( - inode_num, type, 1 /*has_data*/, 1 /*can_write*/, 1 /*is_open*/, - NULL /*internal_object*/, file_size, ext2_open, ext2_create_file, - ext2_read, ext2_write, ext2_close, ext2_create_directory, - NULL /*get_vm_object*/, ext2_truncate /*truncate*/, ext2_stat); + return vfs_create_inode(inode_num, type, 1 /*has_data*/, 1 /*can_write*/, + 1 /*is_open*/, NULL /*internal_object*/, file_size, + ext2_open, ext2_create_file, ext2_read, ext2_write, + ext2_close, ext2_create_directory, + NULL /*get_vm_object*/, ext2_truncate /*truncate*/, + ext2_stat, NULL /*send_signal*/); } u64 end_of_last_entry_position(int dir_inode, u64 *entry_offset, @@ -805,12 +809,12 @@ vfs_inode_t *ext2_mount(void) { mount_fd = current_task->file_descriptors[fd]; current_task->file_descriptors[fd] = NULL; parse_superblock(); - return vfs_create_inode(0 /*inode_num*/, 0 /*type*/, 0 /*has_data*/, - 0 /*can_write*/, 0 /*is_open*/, - NULL /*internal_object*/, 0 /*file_size*/, ext2_open, - ext2_create_file, ext2_read, ext2_write, ext2_close, - ext2_create_directory, NULL /*get_vm_object*/, - ext2_truncate /*truncate*/, ext2_stat); + return vfs_create_inode( + 0 /*inode_num*/, 0 /*type*/, 0 /*has_data*/, 0 /*can_write*/, + 0 /*is_open*/, NULL /*internal_object*/, 0 /*file_size*/, ext2_open, + ext2_create_file, ext2_read, ext2_write, ext2_close, + ext2_create_directory, NULL /*get_vm_object*/, ext2_truncate /*truncate*/, + ext2_stat, NULL /*send_signal*/); } void parse_superblock(void) { diff --git a/kernel/fs/shm.c b/kernel/fs/shm.c index 9215b24..7eec825 100644 --- a/kernel/fs/shm.c +++ b/kernel/fs/shm.c @@ -83,7 +83,7 @@ int shm_open(const char *name, int oflag, mode_t mode) { 1 /*is_open*/, internal_object, 0 /*file_size*/, NULL /*open*/, NULL /*create_file*/, shm_read, shm_write, NULL /*close*/, NULL /*create_directory*/, shm_get_vm_object, shm_ftruncate, - NULL /*stat*/); + NULL /*stat*/, NULL /*send_signal*/); vfs_fd_t *fd_ptr; int fd = vfs_create_fd(oflag, mode, 0 /*is_tty*/, inode, &fd_ptr); diff --git a/kernel/fs/tmpfs.c b/kernel/fs/tmpfs.c index 75de1cd..f8e6712 100644 --- a/kernel/fs/tmpfs.c +++ b/kernel/fs/tmpfs.c @@ -49,7 +49,8 @@ void dual_pipe(int fd[2]) { 0 /*inode_num*/, 0 /*type*/, has_data, can_write, is_open, internal_object, 0 /*file_size*/, NULL /*open*/, NULL /*create_file*/, tmp_read, tmp_write, tmp_close, NULL /*create_directory*/, - NULL /*get_vm_object*/, NULL /*truncate*/, NULL /*stat*/); + NULL /*get_vm_object*/, NULL /*truncate*/, NULL /*stat*/, + NULL /*send_signal*/); assert(inode); vfs_fd_t *fd_ptr; @@ -79,7 +80,8 @@ void pipe(int fd[2]) { 0 /*inode_num*/, 0 /*type*/, has_data, can_write, is_open, internal_object, 0 /*file_size*/, NULL /*open*/, NULL /*create_file*/, tmp_read, tmp_write, tmp_close, NULL /*create_directory*/, - NULL /*get_vm_object*/, NULL /*truncate*/, NULL /*stat*/); + NULL /*get_vm_object*/, NULL /*truncate*/, NULL /*stat*/, + NULL /*send_signal*/); assert(inode); vfs_fd_t *fd_ptr; diff --git a/kernel/fs/vfs.c b/kernel/fs/vfs.c index 505d6ae..c167e8f 100644 --- a/kernel/fs/vfs.c +++ b/kernel/fs/vfs.c @@ -36,7 +36,8 @@ vfs_inode_t *vfs_create_inode( int (*create_directory)(const char *path, int mode), vfs_vm_object_t *(*get_vm_object)(u64 length, u64 offset, vfs_fd_t *fd), int (*truncate)(vfs_fd_t *fd, size_t length), - int (*stat)(vfs_fd_t *fd, struct stat *buf)) { + int (*stat)(vfs_fd_t *fd, struct stat *buf), + int (*send_signal)(vfs_fd_t *fd, int signal)) { vfs_inode_t *r = kmalloc(sizeof(inode_t)); r->inode_num = inode_num; r->type = type; @@ -54,6 +55,8 @@ vfs_inode_t *vfs_create_inode( r->get_vm_object = get_vm_object; r->truncate = truncate; r->stat = stat; + r->send_signal = send_signal; + r->ref = 1; return r; } @@ -69,6 +72,7 @@ int vfs_create_fd(int flags, int mode, int is_tty, vfs_inode_t *inode, if (p->file_descriptors[i]) { return -1; } + inode->ref++; vfs_fd_t *r = kmalloc(sizeof(vfs_fd_t)); r->flags = flags; r->mode = mode; @@ -307,6 +311,11 @@ int vfs_close_process(process_t *p, int fd) { fd_ptr->inode->close(fd_ptr); } + assert(0 < fd_ptr->inode->ref); + fd_ptr->inode->ref--; + if (0 >= fd_ptr->inode->ref) { + kfree(fd_ptr->inode); + } kfree(fd_ptr); } return 0; @@ -333,7 +342,7 @@ int vfs_pmread(int fd, void *buf, u64 count, int blocking, u64 offset) { kprintf("EBADF : %x\n", fd); return -EBADF; } - vfs_fd_t *vfs_fd = current_task->file_descriptors[fd]; + vfs_fd_t *vfs_fd = get_vfs_fd(fd, NULL); if (!vfs_fd) { return -EBADF; } diff --git a/kernel/fs/vfs.h b/kernel/fs/vfs.h index 8e61e11..e75d12e 100644 --- a/kernel/fs/vfs.h +++ b/kernel/fs/vfs.h @@ -54,6 +54,7 @@ struct vfs_fd { struct vfs_inode { int inode_num; int type; + int ref; u8 has_data; u8 can_write; u8 is_open; @@ -68,6 +69,7 @@ struct vfs_inode { vfs_vm_object_t *(*get_vm_object)(u64 length, u64 offset, vfs_fd_t *fd); int (*truncate)(vfs_fd_t *fd, size_t length); int (*stat)(vfs_fd_t *fd, struct stat *buf); + int (*send_signal)(vfs_fd_t *fd, int signal); }; int vfs_close(int fd); @@ -100,5 +102,6 @@ vfs_inode_t *vfs_create_inode( int (*create_directory)(const char *path, int mode), vfs_vm_object_t *(*get_vm_object)(u64 length, u64 offset, vfs_fd_t *fd), int (*truncate)(vfs_fd_t *fd, size_t length), - int (*stat)(vfs_fd_t *fd, struct stat *buf)); + int (*stat)(vfs_fd_t *fd, struct stat *buf), + int (*send_signal)(vfs_fd_t *fd, int signal)); #endif -- cgit v1.2.3