From c7103044fb7d82ff984ab264a5b2cd406b6b5624 Mon Sep 17 00:00:00 2001 From: wfurt Date: Tue, 20 Jul 2021 14:31:11 -0700 Subject: [PATCH 1/2] check handle before shutdown in quic connection Dispose --- .../Quic/Implementations/MsQuic/MsQuicConnection.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 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 ef881266891de7..aadc34940bb0ab 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 @@ -712,10 +712,13 @@ private void Dispose(bool disposing) if (NetEventSource.Log.IsEnabled()) NetEventSource.Info(_state, $"{TraceId()} Stream disposing {disposing}"); // If we haven't already shutdown gracefully (via a successful CloseAsync call), then force an abortive shutdown. - MsQuicApi.Api.ConnectionShutdownDelegate( - _state.Handle, - QUIC_CONNECTION_SHUTDOWN_FLAGS.SILENT, - 0); + if (_state.Handle != null) + { + MsQuicApi.Api.ConnectionShutdownDelegate( + _state.Handle, + QUIC_CONNECTION_SHUTDOWN_FLAGS.SILENT, + 0); + } bool releaseHandles = false; lock (_state) From 8a15d077110862868ddd51b9a9d87986dfa16a49 Mon Sep 17 00:00:00 2001 From: wfurt Date: Tue, 20 Jul 2021 17:40:49 -0700 Subject: [PATCH 2/2] add comment --- .../System/Net/Quic/Implementations/MsQuic/MsQuicConnection.cs | 1 + 1 file changed, 1 insertion(+) 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 aadc34940bb0ab..6fb65889585133 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 @@ -714,6 +714,7 @@ private void Dispose(bool disposing) // If we haven't already shutdown gracefully (via a successful CloseAsync call), then force an abortive shutdown. if (_state.Handle != null) { + // Handle can be null if outbound constructor failed and we are called from finalizer. MsQuicApi.Api.ConnectionShutdownDelegate( _state.Handle, QUIC_CONNECTION_SHUTDOWN_FLAGS.SILENT,