-
Notifications
You must be signed in to change notification settings - Fork 2.6k
SafeSendMessage BUG!! #1230
Description
Quasar version
1.4.0
Server installed .NET version
.NET 4.5.2
Server operating system
Windows 10/Server 2019/2016
Client installed .NET version
.NET 4.5.2
Client operating system
Windows 11/Server 2022
Build configuration
Debug
Describe the bug
Quasar.exe Framework V: v4.0.30319 Bug:
"The process terminated due to an unhandled exception. Exception information:".
System.ObjectDisposedException
System.Runtime.InteropServices.SafeHandle.DangerousAddRef(Boolean ByRef) System.StubHelpers.StubHelpers.SafeHandleAddRef(System.Runtime.InteropServices.SafeHandle, Boolean ByRef) Microsoft.Win32.Win32Native.ReleaseMutex(Microsoft.Win32.SafeHandles.SafeWaitHandle) System.Threading.Mutex.ReleaseMutex()
Quasar.Server.Networking.Client.SafeSendMessage(Quasar.Common.Messages.IMessage) Quasar.Server.Networking.Client.ProcessSendBuffers(System.Object) System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() System.Threading.ThreadPoolWorkQueue.Dispatch()
How to reproduce
private void SafeSendMessage(IMessage message)
{
try
{
_singleWriteMutex.WaitOne();
using (PayloadWriter pw = new PayloadWriter(_stream, true))
{
OnClientWrite(message, pw.WriteMessage(message));
}
}
catch (Exception)
{
Disconnect();
SendCleanup(true);
}
finally
{
_singleWriteMutex.ReleaseMutex();
}
}
C# Code
Open multiple remote control Shell, and when the client may be unstable, the client will return data, and an accident occurs at this time.
Expected behavior
private void SafeSendMessage(IMessage message)
{
if (_stream == null || !_stream.CanWrite)
{
return;
}
try
{
_singleWriteMutex.WaitOne();
using (PayloadWriter pw = new PayloadWriter(_stream, true))
{
OnClientWrite(message, pw.WriteMessage(message));
}
}
catch (ObjectDisposedException)
{
// Handle or log the exception as needed
}
finally
{
if (_singleWriteMutex != null && _singleWriteMutex.WaitOne(0))
{
_singleWriteMutex.ReleaseMutex();
}
}
}
Actual behavior
"It crashes directly, check the error in the Windows log
Additional context
private void SafeSendMessage(IMessage message)
{
if (_stream == null || !_stream.CanWrite)
{
return;
}
try
{
_singleWriteMutex.WaitOne();
using (PayloadWriter pw = new PayloadWriter(_stream, true))
{
OnClientWrite(message, pw.WriteMessage(message));
}
}
catch (ObjectDisposedException)
{
// Handle or log the exception as needed
}
finally
{
if (_singleWriteMutex != null && _singleWriteMutex.WaitOne(0))
{
_singleWriteMutex.ReleaseMutex();
}
}
}
this ismy code fix