From a0ea9a9ffe0f673dcb184bb1e8fa5c1cfc641e6e Mon Sep 17 00:00:00 2001 From: ManickaP Date: Tue, 12 Jul 2022 15:49:59 +0200 Subject: [PATCH] Fixed Assert --- .../Implementations/MsQuic/MsQuicConnection.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/MsQuic/MsQuicConnection.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/MsQuic/MsQuicConnection.cs index 7020ba2589364c..f0f9abdb4793f8 100644 --- a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/MsQuic/MsQuicConnection.cs +++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/MsQuic/MsQuicConnection.cs @@ -47,6 +47,7 @@ internal sealed class State // These exists to prevent GC of the MsQuicConnection in the middle of an async op (Connect or Shutdown). public MsQuicConnection? Connection; + public bool ShutdownInProgress; public readonly ValueTaskSource ConnectTcs = new ValueTaskSource(); // TODO: only allocate these when there is an outstanding shutdown. @@ -215,7 +216,10 @@ private static unsafe int HandleEventConnected(State state, ref QUIC_CONNECTION_ //state.Connection._remoteEndPoint = MsQuicParameterHelpers.GetIPEndPointParam(MsQuicApi.Api, state.Handle, QUIC_PARAM_CONN_REMOTE_ADDRESS); state.Connection._localEndPoint = MsQuicParameterHelpers.GetIPEndPointParam(MsQuicApi.Api, state.Handle, QUIC_PARAM_CONN_LOCAL_ADDRESS); state.Connection._negotiatedAlpnProtocol = new SslApplicationProtocol(new Span(connectionEvent.CONNECTED.NegotiatedAlpn, connectionEvent.CONNECTED.NegotiatedAlpnLength).ToArray()); - state.Connection = null; + if (!state.ShutdownInProgress) + { + state.Connection = null; + } state.ConnectTcs.TrySetResult(); @@ -227,7 +231,10 @@ private static int HandleEventShutdownInitiatedByTransport(State state, ref QUIC if (!state.ConnectTcs.IsCompleted) { Debug.Assert(state.Connection != null); - state.Connection = null; + if (!state.ShutdownInProgress) + { + state.Connection = null; + } state.ConnectTcs.TrySetException(new MsQuicException(connectionEvent.SHUTDOWN_INITIATED_BY_TRANSPORT.Status, "Connection has been shutdown by transport")); } @@ -254,6 +261,7 @@ private static int HandleEventShutdownComplete(State state, ref QUIC_CONNECTION_ state.StateGCHandle.Free(); state.Connection = null; + state.ShutdownInProgress = false; state.ShutdownTcs.SetResult(QUIC_STATUS_SUCCESS); @@ -595,7 +603,7 @@ private unsafe ValueTask ShutdownAsync( long ErrorCode) { // Store the connection into the GCHandle'd state to prevent GC if user calls ShutdownAsync and gets rid of all references to the MsQuicConnection. - Debug.Assert(_state.Connection == null); + _state.ShutdownInProgress = true; _state.Connection = this; try @@ -608,6 +616,7 @@ private unsafe ValueTask ShutdownAsync( } catch { + _state.ShutdownInProgress = false; _state.Connection = null; throw; }