From 0abac4a20dd22cbe981e289bbbaf21a2a0b083d9 Mon Sep 17 00:00:00 2001 From: BrennanConroy Date: Mon, 27 Feb 2017 11:40:48 -0800 Subject: [PATCH] Fix null ref in DisposeAsync on ConnectionState --- .../Internal/ConnectionState.cs | 8 ++++---- .../ConnectionManagerTests.cs | 15 ++++++++++++++- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNetCore.Sockets/Internal/ConnectionState.cs b/src/Microsoft.AspNetCore.Sockets/Internal/ConnectionState.cs index a1882e74c1..addee46904 100644 --- a/src/Microsoft.AspNetCore.Sockets/Internal/ConnectionState.cs +++ b/src/Microsoft.AspNetCore.Sockets/Internal/ConnectionState.cs @@ -51,13 +51,13 @@ namespace Microsoft.AspNetCore.Sockets.Internal RequestId = null; // If the application task is faulted, propagate the error to the transport - if (ApplicationTask.IsFaulted) + if (ApplicationTask?.IsFaulted == true) { Connection.Transport.Output.TryComplete(ApplicationTask.Exception.InnerException); } // If the transport task is faulted, propagate the error to the application - if (TransportTask.IsFaulted) + if (TransportTask?.IsFaulted == true) { Application.Output.TryComplete(TransportTask.Exception.InnerException); } @@ -65,8 +65,8 @@ namespace Microsoft.AspNetCore.Sockets.Internal Connection.Dispose(); Application.Dispose(); - applicationTask = ApplicationTask; - transportTask = TransportTask; + applicationTask = ApplicationTask ?? applicationTask; + transportTask = TransportTask ?? transportTask; } finally { diff --git a/test/Microsoft.AspNetCore.Sockets.Tests/ConnectionManagerTests.cs b/test/Microsoft.AspNetCore.Sockets.Tests/ConnectionManagerTests.cs index 0476fd9131..76bb9d5932 100644 --- a/test/Microsoft.AspNetCore.Sockets.Tests/ConnectionManagerTests.cs +++ b/test/Microsoft.AspNetCore.Sockets.Tests/ConnectionManagerTests.cs @@ -1,7 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Sockets.Internal; using Microsoft.Extensions.Logging; @@ -101,6 +100,20 @@ namespace Microsoft.AspNetCore.Sockets.Tests await state.DisposeAsync(); } + [Fact] + public async Task DisposeInactiveConnection() + { + var connectionManager = CreateConnectionManager(); + var state = connectionManager.CreateConnection();; + + Assert.NotNull(state.Connection); + Assert.NotNull(state.Connection.ConnectionId); + Assert.NotNull(state.Connection.Transport); + + await state.DisposeAsync(); + Assert.Equal(state.Status, ConnectionState.ConnectionStatus.Disposed); + } + private static ConnectionManager CreateConnectionManager() { return new ConnectionManager(new Logger(new LoggerFactory()));