Skip to content

Commit b13a3db

Browse files
committed
Lock when writing to and SslStream
Network stream supports socket writes from multiple threads. SslStream does not hence we need to lock before writing when using Ssl. [#157088466]
1 parent 07f9089 commit b13a3db

File tree

1 file changed

+21
-3
lines changed

1 file changed

+21
-3
lines changed

projects/client/RabbitMQ.Client/src/client/impl/SocketFrameHandler.cs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@ public class SocketFrameHandler : IFrameHandler
7777
private readonly ITcpClient m_socket;
7878
private readonly NetworkBinaryWriter m_writer;
7979
private readonly object _semaphore = new object();
80+
private readonly object _sslLock = new object();
8081
private bool _closed;
82+
private bool _ssl = false;
8183
public SocketFrameHandler(AmqpTcpEndpoint endpoint,
8284
Func<AddressFamily, ITcpClient> socketFactory,
8385
int connectionTimeout, int readTimeout, int writeTimeout)
@@ -108,6 +110,7 @@ public SocketFrameHandler(AmqpTcpEndpoint endpoint,
108110
try
109111
{
110112
netstream = SslHelper.TcpUpgrade(netstream, endpoint.Ssl);
113+
_ssl = true;
111114
}
112115
catch (Exception)
113116
{
@@ -217,7 +220,7 @@ public void SendHeader()
217220
nbw.Write((byte)Endpoint.Protocol.MajorVersion);
218221
nbw.Write((byte)Endpoint.Protocol.MinorVersion);
219222
}
220-
m_writer.Write(ms.ToArray());
223+
Write(ms.ToArray());
221224
}
222225

223226
public void WriteFrame(OutboundFrame frame)
@@ -226,7 +229,7 @@ public void WriteFrame(OutboundFrame frame)
226229
var nbw = new NetworkBinaryWriter(ms);
227230
frame.WriteTo(nbw);
228231
m_socket.Client.Poll(m_writeableStateTimeout, SelectMode.SelectWrite);
229-
m_writer.Write(ms.ToArray());
232+
Write(ms.ToArray());
230233
}
231234

232235
public void WriteFrameSet(IList<OutboundFrame> frames)
@@ -235,7 +238,22 @@ public void WriteFrameSet(IList<OutboundFrame> frames)
235238
var nbw = new NetworkBinaryWriter(ms);
236239
foreach (var f in frames) f.WriteTo(nbw);
237240
m_socket.Client.Poll(m_writeableStateTimeout, SelectMode.SelectWrite);
238-
m_writer.Write(ms.ToArray());
241+
Write(ms.ToArray());
242+
}
243+
244+
private void Write(byte [] buffer)
245+
{
246+
if(_ssl)
247+
{
248+
lock (_sslLock)
249+
{
250+
m_writer.Write(buffer);
251+
}
252+
}
253+
else
254+
{
255+
m_writer.Write(buffer);
256+
}
239257
}
240258

241259
private bool ShouldTryIPv6(AmqpTcpEndpoint endpoint)

0 commit comments

Comments
 (0)