summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel')
-rw-r--r--src/core/hle/kernel/hle_ipc.cpp15
-rw-r--r--src/core/hle/kernel/hle_ipc.h3
-rw-r--r--src/core/hle/kernel/k_server_session.cpp13
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
42SessionRequestManager::~SessionRequestManager() = default; 42SessionRequestManager::~SessionRequestManager() = default;
43 43
44bool 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
44void SessionRequestHandler::ClientConnected(KServerSession* session) { 59void 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
159private: 161private:
160 bool is_domain{}; 162 bool is_domain{};
161 SessionRequestHandlerPtr session_handler; 163 SessionRequestHandlerPtr session_handler;
@@ -163,7 +165,6 @@ private:
163 165
164private: 166private:
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;