From eff026ff8d80c24573ade846c41bc02cd5d4bcb5 Mon Sep 17 00:00:00 2001 From: smiRaphi Date: Tue, 7 Apr 2026 20:24:07 +0200 Subject: [PATCH] [hle/service] Instantly close IPC session when receiving CommandType::Close --- src/core/hle/service/server_manager.cpp | 10 +++++++++- src/core/hle/service/service.cpp | 4 +--- 2 files changed, 10 insertions(+), 4 deletions(-) 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(); }