diff options
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.cpp | 15 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.h | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_server_session.cpp | 13 |
3 files changed, 26 insertions, 5 deletions
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index 260af87e5..45aced99f 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp | |||
| @@ -41,6 +41,21 @@ SessionRequestManager::SessionRequestManager(KernelCore& kernel_) : kernel{kerne | |||
| 41 | 41 | ||
| 42 | SessionRequestManager::~SessionRequestManager() = default; | 42 | SessionRequestManager::~SessionRequestManager() = default; |
| 43 | 43 | ||
| 44 | bool SessionRequestManager::HasSessionRequestHandler(const HLERequestContext& context) const { | ||
| 45 | if (IsDomain() && context.HasDomainMessageHeader()) { | ||
| 46 | const auto& message_header = context.GetDomainMessageHeader(); | ||
| 47 | const auto object_id = message_header.object_id; | ||
| 48 | |||
| 49 | if (object_id > DomainHandlerCount()) { | ||
| 50 | LOG_CRITICAL(IPC, "object_id {} is too big!", object_id); | ||
| 51 | return false; | ||
| 52 | } | ||
| 53 | return DomainHandler(object_id - 1) != nullptr; | ||
| 54 | } else { | ||
| 55 | return session_handler != nullptr; | ||
| 56 | } | ||
| 57 | } | ||
| 58 | |||
| 44 | void SessionRequestHandler::ClientConnected(KServerSession* session) { | 59 | void SessionRequestHandler::ClientConnected(KServerSession* session) { |
| 45 | session->SetSessionHandler(shared_from_this()); | 60 | session->SetSessionHandler(shared_from_this()); |
| 46 | } | 61 | } |
diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h index 159565203..a61870f8b 100644 --- a/src/core/hle/kernel/hle_ipc.h +++ b/src/core/hle/kernel/hle_ipc.h | |||
| @@ -156,6 +156,8 @@ public: | |||
| 156 | return session_handler->GetServiceThread(); | 156 | return session_handler->GetServiceThread(); |
| 157 | } | 157 | } |
| 158 | 158 | ||
| 159 | bool HasSessionRequestHandler(const HLERequestContext& context) const; | ||
| 160 | |||
| 159 | private: | 161 | private: |
| 160 | bool is_domain{}; | 162 | bool is_domain{}; |
| 161 | SessionRequestHandlerPtr session_handler; | 163 | SessionRequestHandlerPtr session_handler; |
| @@ -163,7 +165,6 @@ private: | |||
| 163 | 165 | ||
| 164 | private: | 166 | private: |
| 165 | KernelCore& kernel; | 167 | KernelCore& kernel; |
| 166 | std::weak_ptr<ServiceThread> service_thread; | ||
| 167 | }; | 168 | }; |
| 168 | 169 | ||
| 169 | /** | 170 | /** |
diff --git a/src/core/hle/kernel/k_server_session.cpp b/src/core/hle/kernel/k_server_session.cpp index 61213c20e..dd62706a8 100644 --- a/src/core/hle/kernel/k_server_session.cpp +++ b/src/core/hle/kernel/k_server_session.cpp | |||
| @@ -119,11 +119,16 @@ ResultCode KServerSession::QueueSyncRequest(KThread* thread, Core::Memory::Memor | |||
| 119 | 119 | ||
| 120 | context->PopulateFromIncomingCommandBuffer(kernel.CurrentProcess()->GetHandleTable(), cmd_buf); | 120 | context->PopulateFromIncomingCommandBuffer(kernel.CurrentProcess()->GetHandleTable(), cmd_buf); |
| 121 | 121 | ||
| 122 | if (auto strong_ptr = manager->GetServiceThread().lock()) { | 122 | // Ensure we have a session request handler |
| 123 | strong_ptr->QueueSyncRequest(*parent, std::move(context)); | 123 | if (manager->HasSessionRequestHandler(*context)) { |
| 124 | return ResultSuccess; | 124 | if (auto strong_ptr = manager->GetServiceThread().lock()) { |
| 125 | strong_ptr->QueueSyncRequest(*parent, std::move(context)); | ||
| 126 | return ResultSuccess; | ||
| 127 | } else { | ||
| 128 | ASSERT_MSG(false, "strong_ptr is nullptr!"); | ||
| 129 | } | ||
| 125 | } else { | 130 | } else { |
| 126 | ASSERT_MSG(false, "strong_ptr was nullptr!"); | 131 | ASSERT_MSG(false, "handler is invalid!"); |
| 127 | } | 132 | } |
| 128 | 133 | ||
| 129 | return ResultSuccess; | 134 | return ResultSuccess; |