From 75b27754d688eab1cff35c96e53437439a37cc12 Mon Sep 17 00:00:00 2001 From: Pranav K <prkrishn@hotmail.com> Date: Thu, 11 Jun 2020 13:14:15 -0700 Subject: [PATCH] Ensure FileBufferingReadStream created by formatters are always disposed (#22746) --- .../src/XmlDataContractSerializerInputFormatter.cs | 2 ++ .../Mvc.Formatters.Xml/src/XmlSerializerInputFormatter.cs | 2 ++ .../Mvc.NewtonsoftJson/src/NewtonsoftJsonInputFormatter.cs | 6 ++++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Mvc/Mvc.Formatters.Xml/src/XmlDataContractSerializerInputFormatter.cs b/src/Mvc/Mvc.Formatters.Xml/src/XmlDataContractSerializerInputFormatter.cs index 8132dfdba84..a2b32b23069 100644 --- a/src/Mvc/Mvc.Formatters.Xml/src/XmlDataContractSerializerInputFormatter.cs +++ b/src/Mvc/Mvc.Formatters.Xml/src/XmlDataContractSerializerInputFormatter.cs @@ -143,6 +143,8 @@ namespace Microsoft.AspNetCore.Mvc.Formatters } readStream = new FileBufferingReadStream(request.Body, memoryThreshold); + // Ensure the file buffer stream is always disposed at the end of a request. + request.HttpContext.Response.RegisterForDispose(readStream); await readStream.DrainAsync(CancellationToken.None); readStream.Seek(0L, SeekOrigin.Begin); diff --git a/src/Mvc/Mvc.Formatters.Xml/src/XmlSerializerInputFormatter.cs b/src/Mvc/Mvc.Formatters.Xml/src/XmlSerializerInputFormatter.cs index ab3abdf801f..66fb9aea877 100644 --- a/src/Mvc/Mvc.Formatters.Xml/src/XmlSerializerInputFormatter.cs +++ b/src/Mvc/Mvc.Formatters.Xml/src/XmlSerializerInputFormatter.cs @@ -124,6 +124,8 @@ namespace Microsoft.AspNetCore.Mvc.Formatters } readStream = new FileBufferingReadStream(request.Body, memoryThreshold); + // Ensure the file buffer stream is always disposed at the end of a request. + request.HttpContext.Response.RegisterForDispose(readStream); await readStream.DrainAsync(CancellationToken.None); readStream.Seek(0L, SeekOrigin.Begin); diff --git a/src/Mvc/Mvc.NewtonsoftJson/src/NewtonsoftJsonInputFormatter.cs b/src/Mvc/Mvc.NewtonsoftJson/src/NewtonsoftJsonInputFormatter.cs index ac26b61911c..3528916b3e0 100644 --- a/src/Mvc/Mvc.NewtonsoftJson/src/NewtonsoftJsonInputFormatter.cs +++ b/src/Mvc/Mvc.NewtonsoftJson/src/NewtonsoftJsonInputFormatter.cs @@ -153,6 +153,8 @@ namespace Microsoft.AspNetCore.Mvc.Formatters } readStream = new FileBufferingReadStream(request.Body, memoryThreshold); + // Ensure the file buffer stream is always disposed at the end of a request. + request.HttpContext.Response.RegisterForDispose(readStream); await readStream.DrainAsync(CancellationToken.None); readStream.Seek(0L, SeekOrigin.Begin); @@ -278,7 +280,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters /// <summary> /// Called during deserialization to get the <see cref="JsonSerializer"/>. The formatter context - /// that is passed gives an ability to create serializer specific to the context. + /// that is passed gives an ability to create serializer specific to the context. /// </summary> /// <returns>The <see cref="JsonSerializer"/> used during deserialization.</returns> /// <remarks> @@ -297,7 +299,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters /// <summary> /// Called during deserialization to get the <see cref="JsonSerializer"/>. The formatter context - /// that is passed gives an ability to create serializer specific to the context. + /// that is passed gives an ability to create serializer specific to the context. /// </summary> /// <param name="context">A context object used by an input formatter for deserializing the request body into an object.</param> /// <returns>The <see cref="JsonSerializer"/> used during deserialization.</returns> -- GitLab