diff --git a/src/core/hle/service/server_manager.cpp b/src/core/hle/service/server_manager.cpp index 3d898725e8..62c12987ac 100644 --- a/src/core/hle/service/server_manager.cpp +++ b/src/core/hle/service/server_manager.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -381,11 +384,16 @@ Result ServerManager::CompleteSyncRequest(Session* session) { R_SUCCEED(); } + if (service_res == IPC::ResultSessionClosed) { + this->DestroySession(session); + R_SUCCEED(); + } + // Send the reply. res = server_session->SendReplyHLE(); // If the session has been closed, we're done. - if (res == Kernel::ResultSessionClosed || service_res == IPC::ResultSessionClosed) { + if (res == Kernel::ResultSessionClosed) { this->DestroySession(session); R_SUCCEED(); } diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index e054ad441b..0bac88492d 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -105,8 +105,6 @@ Result ServiceFrameworkBase::HandleSyncRequest(Kernel::KServerSession& session, switch (ctx.GetCommandType()) { case IPC::CommandType::Close: case IPC::CommandType::TIPC_Close: { - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); result = IPC::ResultSessionClosed; break; } @@ -132,7 +130,7 @@ Result ServiceFrameworkBase::HandleSyncRequest(Kernel::KServerSession& session, // If emulation was shutdown, we are closing service threads, do not write the response back to // memory that may be shutting down as well. - if (system.IsPoweredOn()) { + if (system.IsPoweredOn() && result != IPC::ResultSessionClosed) { ctx.WriteToOutgoingCommandBuffer(); }