From 59bdc3449f44912686df0ba79d7bff00117fa028 Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Wed, 2 Oct 2019 08:06:56 +0900 Subject: [PATCH] [release/2.2] Backport memory leak fix from 3.0 (#13840) --- eng/PatchConfig.props | 1 + .../src/EntityFrameworkCoreXmlRepository.cs | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/eng/PatchConfig.props b/eng/PatchConfig.props index 36217a524ca4..dc15b2cbe0b6 100644 --- a/eng/PatchConfig.props +++ b/eng/PatchConfig.props @@ -78,6 +78,7 @@ Later on, this will be checked using this condition: + Microsoft.AspNetCore.DataProtection.EntityFrameworkCore; diff --git a/src/DataProtection/EntityFrameworkCore/src/EntityFrameworkCoreXmlRepository.cs b/src/DataProtection/EntityFrameworkCore/src/EntityFrameworkCoreXmlRepository.cs index 62250cf3efb7..0c9ff11639fc 100644 --- a/src/DataProtection/EntityFrameworkCore/src/EntityFrameworkCoreXmlRepository.cs +++ b/src/DataProtection/EntityFrameworkCore/src/EntityFrameworkCoreXmlRepository.cs @@ -42,8 +42,10 @@ public virtual IReadOnlyCollection GetAllElements() { using (var scope = _services.CreateScope()) { - var context = scope.ServiceProvider.GetRequiredService(); - return context.DataProtectionKeys.AsNoTracking().Select(key => TryParseKeyXml(key.Xml)).ToList().AsReadOnly(); + var context = scope.ServiceProvider.GetRequiredService(); + // Put logger in a local such that `this` isn't captured. + var logger = _logger; + return context.DataProtectionKeys.AsNoTracking().Select(key => TryParseKeyXml(key.Xml, logger)).ToList().AsReadOnly(); } } @@ -65,7 +67,7 @@ public void StoreElement(XElement element, string friendlyName) } } - private XElement TryParseKeyXml(string xml) + private static XElement TryParseKeyXml(string xml, ILogger logger) { try { @@ -73,7 +75,7 @@ private XElement TryParseKeyXml(string xml) } catch (Exception e) { - _logger?.LogExceptionWhileParsingKeyXml(xml, e); + logger?.LogExceptionWhileParsingKeyXml(xml, e); return null; } }