Ensure SM service won't listen to closed sessions (#6246)

* Ensure SM service won't listen to closed sessions

* PR feedback
This commit is contained in:
gdkchan 2024-02-02 20:56:51 -03:00 committed by GitHub
parent c94f0fbb83
commit d704bcd93b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -287,6 +287,10 @@ namespace Ryujinx.HLE.HOS.Services
_wakeEvent.WritableEvent.Clear(); _wakeEvent.WritableEvent.Clear();
} }
} }
else if (rc == KernelResult.PortRemoteClosed && signaledIndex >= 0)
{
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();
@ -360,7 +374,7 @@ namespace Ryujinx.HLE.HOS.Services
response.RawData = _responseDataStream.ToArray(); response.RawData = _responseDataStream.ToArray();
} }
else if (request.Type == IpcMessageType.CmifControl || else if (request.Type == IpcMessageType.CmifControl ||
request.Type == IpcMessageType.CmifControlWithContext) request.Type == IpcMessageType.CmifControlWithContext)
{ {
#pragma warning disable IDE0059 // Remove unnecessary value assignment #pragma warning disable IDE0059 // Remove unnecessary value assignment
uint magic = (uint)_requestDataReader.ReadUInt64(); uint magic = (uint)_requestDataReader.ReadUInt64();
@ -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