summaryrefslogtreecommitdiff
path: root/kernel/sched
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/sched
parent7eceb43433634ee253507208baf1d8298b40e377 (diff)
Kernel: Fix some memory leaks
Diffstat (limited to 'kernel/sched')
-rw-r--r--kernel/sched/scheduler.c23
-rw-r--r--kernel/sched/scheduler.h4
2 files changed, 25 insertions, 2 deletions
diff --git a/kernel/sched/scheduler.c b/kernel/sched/scheduler.c
index 7afd203..2fa9ad3 100644
--- a/kernel/sched/scheduler.c
+++ b/kernel/sched/scheduler.c
@@ -213,6 +213,10 @@ void free_process(process_t *p) {
list_free(&p->read_list);
list_free(&p->write_list);
list_free(&p->disconnect_list);
+ list_free(&p->tcp_sockets);
+ list_free(&p->tcp_listen);
+ list_free(&p->event_queue);
+ kfree(p->tcb);
}
void exit_process(process_t *p, int status) {
@@ -291,7 +295,8 @@ u32 setup_stack(u32 stack_pointer, int argc, char **argv) {
return ptr;
}
-int exec(const char *filename, char **argv) {
+int exec(const char *filename, char **argv, int dealloc_argv,
+ int dealloc_filename) {
// exec() will "takeover" the process by loading the file specified in
// filename into memory, change from ring 0 to ring 3 and jump to the
// files entry point as decided by the ELF header of the file.
@@ -313,6 +318,15 @@ int exec(const char *filename, char **argv) {
u32 ptr = setup_stack(0x90000000, argc, argv);
+ if (dealloc_argv) {
+ for (int i = 0; i < argc; i++) {
+ kfree(argv[i]);
+ }
+ }
+ if (dealloc_filename) {
+ kfree((char *)filename);
+ }
+
jump_usermode((void (*)())(entry), ptr);
ASSERT_NOT_REACHED;
return 0;
@@ -475,6 +489,13 @@ void signal_process(process_t *p, int sig) {
process_push_signal(p, signal);
}
+int process_signal(vfs_fd_t *fd, int sig) {
+ process_t *p = fd->inode->internal_object;
+ assert(p);
+ signal_process(p, sig);
+ return 0;
+}
+
int kill(pid_t pid, int sig) {
process_t *p = current_task;
p = p->next;
diff --git a/kernel/sched/scheduler.h b/kernel/sched/scheduler.h
index fbaed3e..b408f59 100644
--- a/kernel/sched/scheduler.h
+++ b/kernel/sched/scheduler.h
@@ -18,10 +18,12 @@ extern process_t *current_task;
extern process_t *ready_queue;
int fork(void);
-int exec(const char *filename, char **argv);
+int exec(const char *filename, char **argv, int dealloc_argv,
+ int dealloc_filename);
void switch_task(void);
void tasking_init(void);
void exit(int status);
+int process_signal(vfs_fd_t *fd, int sig);
void *mmap(void *addr, size_t length, int prot, int flags, int fd,
size_t offset);