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