diff --git a/tasks/mm0/src/file.c b/tasks/mm0/src/file.c index 4e253b9..0eca30b 100644 --- a/tasks/mm0/src/file.c +++ b/tasks/mm0/src/file.c @@ -410,7 +410,10 @@ int do_close(struct tcb *task, int fd) /* Reduce file's opener count */ if (!(--task->files->fd[fd].vmfile->openers)) - vm_file_delete(task->files->fd[fd].vmfile); + /* No openers left, check any mappers */ + if (!task->files->fd[fd].vmfile->vm_obj.nlinks) + /* No links or openers, delete the file */ + vm_file_delete(task->files->fd[fd].vmfile); task->files->fd[fd].vnum = 0; task->files->fd[fd].cursor = 0; diff --git a/tasks/mm0/src/task.c b/tasks/mm0/src/task.c index 774d78f..d9bf9ae 100644 --- a/tasks/mm0/src/task.c +++ b/tasks/mm0/src/task.c @@ -219,8 +219,13 @@ int copy_tcb(struct tcb *to, struct tcb *from, unsigned int flags) to->files = from->files; to->files->tcb_refs++; } else { - /* Copy all file descriptors */ + /* Bulk copy all file descriptors */ memcpy(to->files, from->files, sizeof(*to->files)); + + /* Increase refcount for all open files */ + for (int i = 0; i < TASK_FILES_MAX; i++) + if (to->files->fd[i].vmfile) + to->files->fd[i].vmfile->openers++; } return 0;