summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2017-06-08 00:33:24 -0700
committerGravatar Yuri Kunde Schlesner2017-06-08 00:33:24 -0700
commitd666e01cdf2cbeb0ab55b69c8c4558e5fb6c3d2c (patch)
tree482da3eef1f81f7c25d3f84e921bbc408a3559d8 /src
parentMerge pull request #2737 from Subv/decryptbeacondata (diff)
downloadyuzu-d666e01cdf2cbeb0ab55b69c8c4558e5fb6c3d2c.tar.gz
yuzu-d666e01cdf2cbeb0ab55b69c8c4558e5fb6c3d2c.tar.xz
yuzu-d666e01cdf2cbeb0ab55b69c8c4558e5fb6c3d2c.zip
Kernel: Ensure objects are kept alive during ClientSession disconnection
Fixes #2760
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/kernel/client_session.cpp20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/core/hle/kernel/client_session.cpp b/src/core/hle/kernel/client_session.cpp
index 6bc49ff64..5ac427bdb 100644
--- a/src/core/hle/kernel/client_session.cpp
+++ b/src/core/hle/kernel/client_session.cpp
@@ -16,9 +16,13 @@ ClientSession::~ClientSession() {
16 // This destructor will be called automatically when the last ClientSession handle is closed by 16 // This destructor will be called automatically when the last ClientSession handle is closed by
17 // the emulated application. 17 // the emulated application.
18 18
19 if (parent->server) { 19 // Local references to ServerSession and SessionRequestHandler are necessary to guarantee they
20 if (parent->server->hle_handler) 20 // will be kept alive until after ClientDisconnected() returns.
21 parent->server->hle_handler->ClientDisconnected(parent->server); 21 SharedPtr<ServerSession> server = parent->server;
22 if (server) {
23 std::shared_ptr<SessionRequestHandler> hle_handler = server->hle_handler;
24 if (hle_handler)
25 hle_handler->ClientDisconnected(server);
22 26
23 // TODO(Subv): Force a wake up of all the ServerSession's waiting threads and set 27 // TODO(Subv): Force a wake up of all the ServerSession's waiting threads and set
24 // their WaitSynchronization result to 0xC920181A. 28 // their WaitSynchronization result to 0xC920181A.
@@ -28,11 +32,13 @@ ClientSession::~ClientSession() {
28} 32}
29 33
30ResultCode ClientSession::SendSyncRequest() { 34ResultCode ClientSession::SendSyncRequest() {
31 // Signal the server session that new data is available 35 // Keep ServerSession alive until we're done working with it.
32 if (parent->server) 36 SharedPtr<ServerSession> server = parent->server;
33 return parent->server->HandleSyncRequest(); 37 if (server == nullptr)
38 return ERR_SESSION_CLOSED_BY_REMOTE;
34 39
35 return ERR_SESSION_CLOSED_BY_REMOTE; 40 // Signal the server session that new data is available
41 return server->HandleSyncRequest();
36} 42}
37 43
38} // namespace 44} // namespace