From a82c03312ad040f912d30835f580bb85b6f3e38d Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sun, 17 Dec 2023 20:47:50 +0200 Subject: [PATCH] Handle svcClose for file objects --- src/core/kernel/kernel.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/core/kernel/kernel.cpp b/src/core/kernel/kernel.cpp index cd691b48..04af5096 100644 --- a/src/core/kernel/kernel.cpp +++ b/src/core/kernel/kernel.cpp @@ -179,6 +179,30 @@ u32 Kernel::getTLSPointer() { // Result CloseHandle(Handle handle) void Kernel::svcCloseHandle() { logSVC("CloseHandle(handle = %d) (Unimplemented)\n", regs[0]); + const Handle handle = regs[0]; + + KernelObject* object = getObject(handle); + if (object != nullptr) { + switch (object->type) { + // Close file descriptor when closing a file to prevent leaks and properly flush file contents + case KernelObjectType::File: { + FileSession* file = object->getData(); + if (file->isOpen) { + file->isOpen = false; + + if (file->fd != nullptr) { + fclose(file->fd); + file->fd = nullptr; + } + } + break; + } + + default: break; + } + } + + // Stub to always succeed for now regs[0] = Result::Success; }