Skip to content
This repository was archived by the owner on Mar 17, 2024. It is now read-only.

SafeSendMessage BUG!! #1230

@AlphaCharry

Description

@AlphaCharry

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions