Prevent access to closed socket in in Connection.End
This commit is contained in:
parent
b162202519
commit
c0cc511b5b
|
|
@ -4,6 +4,7 @@
|
||||||
using System;
|
using System;
|
||||||
using Microsoft.AspNet.Server.Kestrel.Networking;
|
using Microsoft.AspNet.Server.Kestrel.Networking;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Server.Kestrel.Http
|
namespace Microsoft.AspNet.Server.Kestrel.Http
|
||||||
{
|
{
|
||||||
|
|
@ -15,6 +16,8 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
|
||||||
private static readonly Action<UvStreamHandle, int, Exception, object> _readCallback = ReadCallback;
|
private static readonly Action<UvStreamHandle, int, Exception, object> _readCallback = ReadCallback;
|
||||||
private static readonly Func<UvStreamHandle, int, object, Libuv.uv_buf_t> _allocCallback = AllocCallback;
|
private static readonly Func<UvStreamHandle, int, object, Libuv.uv_buf_t> _allocCallback = AllocCallback;
|
||||||
|
|
||||||
|
private int _connectionState;
|
||||||
|
|
||||||
private static Libuv.uv_buf_t AllocCallback(UvStreamHandle handle, int suggestedSize, object state)
|
private static Libuv.uv_buf_t AllocCallback(UvStreamHandle handle, int suggestedSize, object state)
|
||||||
{
|
{
|
||||||
return ((Connection)state).OnAlloc(handle, suggestedSize);
|
return ((Connection)state).OnAlloc(handle, suggestedSize);
|
||||||
|
|
@ -104,6 +107,12 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
|
||||||
switch (endType)
|
switch (endType)
|
||||||
{
|
{
|
||||||
case ProduceEndType.SocketShutdownSend:
|
case ProduceEndType.SocketShutdownSend:
|
||||||
|
if (Interlocked.CompareExchange(ref _connectionState, ConnectionState.Shutdown, ConnectionState.Open)
|
||||||
|
!= ConnectionState.Open)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
KestrelTrace.Log.ConnectionWriteFin(_connectionId, 0);
|
KestrelTrace.Log.ConnectionWriteFin(_connectionId, 0);
|
||||||
Thread.Post(
|
Thread.Post(
|
||||||
x =>
|
x =>
|
||||||
|
|
@ -128,6 +137,12 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
|
||||||
_frame);
|
_frame);
|
||||||
break;
|
break;
|
||||||
case ProduceEndType.SocketDisconnect:
|
case ProduceEndType.SocketDisconnect:
|
||||||
|
if (Interlocked.Exchange(ref _connectionState, ConnectionState.Disconnected)
|
||||||
|
== ConnectionState.Disconnected)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
KestrelTrace.Log.ConnectionDisconnect(_connectionId);
|
KestrelTrace.Log.ConnectionDisconnect(_connectionId);
|
||||||
Thread.Post(
|
Thread.Post(
|
||||||
x =>
|
x =>
|
||||||
|
|
@ -139,5 +154,12 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class ConnectionState
|
||||||
|
{
|
||||||
|
public const int Open = 0;
|
||||||
|
public const int Shutdown = 1;
|
||||||
|
public const int Disconnected = 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue