Compare commits

...

2 Commits

Author SHA1 Message Date
gdkchan
e5066449a5 Limit remote closed session removal to SM service (#6248) 2024-02-03 19:40:09 +01:00
gdkchan
d704bcd93b Ensure SM service won't listen to closed sessions (#6246)
* Ensure SM service won't listen to closed sessions

* PR feedback
2024-02-02 20:56:51 -03:00

View File

@@ -287,6 +287,10 @@ namespace Ryujinx.HLE.HOS.Services
_wakeEvent.WritableEvent.Clear(); _wakeEvent.WritableEvent.Clear();
} }
} }
else if (rc == KernelResult.PortRemoteClosed && signaledIndex >= 0 && SmObjectFactory != null)
{
DestroySession(handles[signaledIndex]);
}
_selfProcess.CpuMemory.Write(messagePtr + 0x0, 0); _selfProcess.CpuMemory.Write(messagePtr + 0x0, 0);
_selfProcess.CpuMemory.Write(messagePtr + 0x4, 2 << 10); _selfProcess.CpuMemory.Write(messagePtr + 0x4, 2 << 10);
@@ -299,6 +303,16 @@ namespace Ryujinx.HLE.HOS.Services
Dispose(); Dispose();
} }
private void DestroySession(int serverSessionHandle)
{
_context.Syscall.CloseHandle(serverSessionHandle);
if (RemoveSessionObj(serverSessionHandle, out var session))
{
(session as IDisposable)?.Dispose();
}
}
private bool Process(int serverSessionHandle, ulong recvListAddr) private bool Process(int serverSessionHandle, ulong recvListAddr)
{ {
IpcMessage request = ReadRequest(); IpcMessage request = ReadRequest();
@@ -412,11 +426,7 @@ namespace Ryujinx.HLE.HOS.Services
} }
else if (request.Type == IpcMessageType.CmifCloseSession || request.Type == IpcMessageType.TipcCloseSession) else if (request.Type == IpcMessageType.CmifCloseSession || request.Type == IpcMessageType.TipcCloseSession)
{ {
_context.Syscall.CloseHandle(serverSessionHandle); DestroySession(serverSessionHandle);
if (RemoveSessionObj(serverSessionHandle, out var session))
{
(session as IDisposable)?.Dispose();
}
shouldReply = false; shouldReply = false;
} }
// If the type is past 0xF, we are using TIPC // If the type is past 0xF, we are using TIPC