From 94de36f4319f85cffbc1c830f376ff0d6cbf7043 Mon Sep 17 00:00:00 2001 From: BHandle Date: Thu, 23 Jan 2025 20:09:00 -0500 Subject: [PATCH 1/2] Added locking to prevent a data message and a keepalive ping from inserting between the header and payload writes --- IpcStream.cs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/IpcStream.cs b/IpcStream.cs index 729dde1..d5a2206 100644 --- a/IpcStream.cs +++ b/IpcStream.cs @@ -33,6 +33,7 @@ public class IpcStream : IDisposable private bool _disposed = false; protected bool encrypted = false; + private object _lockObject = new object(); /// /// Constructor @@ -119,16 +120,19 @@ protected async Task ReadBytesAsync() /// byte buffer protected void WriteBytes(byte[] buffer) { - int length = buffer.Length; - if (length > UInt16.MaxValue) - throw new InvalidOperationException("Message is too long"); + lock (_lockObject) + { + int length = buffer.Length; + if (length > UInt16.MaxValue) + throw new InvalidOperationException("Message is too long"); // write message length BaseStream.Write(new byte[] { (byte)(length / 256), (byte)(length & 255) }, 0, 2); - // write message - BaseStream.Write(buffer, 0, length); - BaseStream.Flush(); + // write message + BaseStream.Write(buffer, 0, length); + BaseStream.Flush(); + } } /// From dfaf41adf43cc07fd1328e1a43fb9aed7ad70f77 Mon Sep 17 00:00:00 2001 From: BHandle Date: Thu, 23 Jan 2025 20:09:45 -0500 Subject: [PATCH 2/2] Adjusted length algorithm to use Modulus --- IpcStream.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/IpcStream.cs b/IpcStream.cs index d5a2206..ae63f8e 100644 --- a/IpcStream.cs +++ b/IpcStream.cs @@ -126,8 +126,8 @@ protected void WriteBytes(byte[] buffer) if (length > UInt16.MaxValue) throw new InvalidOperationException("Message is too long"); - // write message length - BaseStream.Write(new byte[] { (byte)(length / 256), (byte)(length & 255) }, 0, 2); + // write message length + BaseStream.Write(new byte[] {(byte) (length / 256), (byte) (length % 256)}, 0, 2); // write message BaseStream.Write(buffer, 0, length);