summaryrefslogtreecommitdiff
path: root/kernel/fs
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-04-02 09:17:06 +0200
committerAnton Kling <anton@kling.gg>2024-04-02 09:39:03 +0200
commit2229fd91f7230ae7068814ae029b733945852eb1 (patch)
tree416487f8c66c389c57dee465f648362ca59b8f23 /kernel/fs
parent7eceb43433634ee253507208baf1d8298b40e377 (diff)
Kernel: Fix some memory leaks
Diffstat (limited to 'kernel/fs')
-rw-r--r--kernel/fs/devfs.c3
-rw-r--r--kernel/fs/ext2.c28
-rw-r--r--kernel/fs/shm.c2
-rw-r--r--kernel/fs/tmpfs.c6
-rw-r--r--kernel/fs/vfs.c13
-rw-r--r--kernel/fs/vfs.h5
6 files changed, 38 insertions, 19 deletions
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