hle: kernel: KServerSession: Fix client disconnected.

- Prevents a cloned session's handler from being overwritten by another disconnected session.
- Fixes session handler nullptr asserts with Pokemon Sword & Shield.
This commit is contained in:
bunnei 2021-06-09 21:37:11 -07:00
parent 86d832ab9a
commit b2971b48ed
3 changed files with 8 additions and 9 deletions

View File

@ -57,11 +57,11 @@ bool SessionRequestManager::HasSessionRequestHandler(const HLERequestContext& co
} }
void SessionRequestHandler::ClientConnected(KServerSession* session) { void SessionRequestHandler::ClientConnected(KServerSession* session) {
session->SetSessionHandler(shared_from_this()); session->ClientConnected(shared_from_this());
} }
void SessionRequestHandler::ClientDisconnected(KServerSession* session) { void SessionRequestHandler::ClientDisconnected(KServerSession* session) {
session->SetSessionHandler(nullptr); session->ClientDisconnected();
} }
HLERequestContext::HLERequestContext(KernelCore& kernel_, Core::Memory::Memory& memory_, HLERequestContext::HLERequestContext(KernelCore& kernel_, Core::Memory::Memory& memory_,

View File

@ -62,15 +62,14 @@ public:
void OnClientClosed(); void OnClientClosed();
/** void ClientConnected(SessionRequestHandlerPtr handler) {
* Sets the HLE handler for the session. This handler will be called to service IPC requests
* instead of the regular IPC machinery. (The regular IPC machinery is currently not
* implemented.)
*/
void SetSessionHandler(SessionRequestHandlerPtr handler) {
manager->SetSessionHandler(std::move(handler)); manager->SetSessionHandler(std::move(handler));
} }
void ClientDisconnected() {
manager = nullptr;
}
/** /**
* Handle a sync request from the emulated application. * Handle a sync request from the emulated application.
* *

View File

@ -42,7 +42,7 @@ class ServiceManager;
static const int kMaxPortSize = 8; ///< Maximum size of a port name (8 characters) static const int kMaxPortSize = 8; ///< Maximum size of a port name (8 characters)
/// Arbitrary default number of maximum connections to an HLE service. /// Arbitrary default number of maximum connections to an HLE service.
static const u32 DefaultMaxSessions = 0x10000; static const u32 DefaultMaxSessions = 0x100;
/** /**
* This is an non-templated base of ServiceFramework to reduce code bloat and compilation times, it * This is an non-templated base of ServiceFramework to reduce code bloat and compilation times, it