From 72e5552409305fe57781b83c3145fb2b66552be2 Mon Sep 17 00:00:00 2001 From: Liam Date: Tue, 21 Feb 2023 12:19:12 -0500 Subject: [PATCH] sm:: fix lingering session initialization issues --- src/core/hle/kernel/hle_ipc.h | 12 ++++++++++++ src/core/hle/service/sm/sm.cpp | 9 +++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h index 6cbc974fec..b4364f9845 100644 --- a/src/core/hle/kernel/hle_ipc.h +++ b/src/core/hle/kernel/hle_ipc.h @@ -147,9 +147,21 @@ public: return server_manager; } + // TODO: remove this when sm: is implemented with the proper IUserInterface + // abstraction, creating a new C++ handler object for each session: + + bool GetIsInitializedForSm() const { + return is_initialized_for_sm; + } + + void SetIsInitializedForSm() { + is_initialized_for_sm = true; + } + private: bool convert_to_domain{}; bool is_domain{}; + bool is_initialized_for_sm{}; SessionRequestHandlerPtr session_handler; std::vector domain_handlers; diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp index 6eba48f03c..53c877836c 100644 --- a/src/core/hle/service/sm/sm.cpp +++ b/src/core/hle/service/sm/sm.cpp @@ -112,7 +112,7 @@ ResultVal ServiceManager::GetServicePort(const std::string& name void SM::Initialize(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_SM, "called"); - is_initialized = true; + ctx.GetManager()->SetIsInitializedForSm(); IPC::ResponseBuilder rb{ctx, 2}; rb.Push(ResultSuccess); @@ -159,7 +159,7 @@ static std::string PopServiceName(IPC::RequestParser& rp) { } ResultVal SM::GetServiceImpl(Kernel::HLERequestContext& ctx) { - if (!is_initialized) { + if (!ctx.GetManager()->GetIsInitializedForSm()) { return ERR_NOT_INITIALIZED; } @@ -168,6 +168,11 @@ ResultVal SM::GetServiceImpl(Kernel::HLERequestContext& // Find the named port. auto port_result = service_manager.GetServicePort(name); + if (port_result.Code() == ERR_INVALID_NAME) { + LOG_ERROR(Service_SM, "Invalid service name '{}'", name); + return ERR_INVALID_NAME; + } + if (port_result.Failed()) { LOG_INFO(Service_SM, "Waiting for service {} to become available", name); ctx.SetIsDeferred();