From 24e1f0b54d181e9016465aba54141c93edfafebb Mon Sep 17 00:00:00 2001 From: DotNet-Bot Date: Fri, 27 Mar 2026 19:23:27 +0000 Subject: [PATCH 01/23] Update dependencies from https://dev.azure.com/dnceng/internal/_git/dotnet-efcore build 20260327.2 On relative base path root dotnet-ef , Microsoft.EntityFrameworkCore , Microsoft.EntityFrameworkCore.Design , Microsoft.EntityFrameworkCore.InMemory , Microsoft.EntityFrameworkCore.Relational , Microsoft.EntityFrameworkCore.Sqlite , Microsoft.EntityFrameworkCore.SqlServer , Microsoft.EntityFrameworkCore.Tools From Version 9.0.15 -> To Version 9.0.15 --- NuGet.config | 4 ++-- eng/Version.Details.xml | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/NuGet.config b/NuGet.config index 3fbb60b97541..2f20f9b4a9a2 100644 --- a/NuGet.config +++ b/NuGet.config @@ -9,7 +9,7 @@ - + @@ -32,7 +32,7 @@ - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index e2b412ee0cf3..1eb1571df00d 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,36 +11,36 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 001e1d31c562c1d246e5a6531b607bf6c851f688 + 3ae591dc0a9f8d7ced0c0a897938136ab02a1928 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 001e1d31c562c1d246e5a6531b607bf6c851f688 + 3ae591dc0a9f8d7ced0c0a897938136ab02a1928 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 001e1d31c562c1d246e5a6531b607bf6c851f688 + 3ae591dc0a9f8d7ced0c0a897938136ab02a1928 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 001e1d31c562c1d246e5a6531b607bf6c851f688 + 3ae591dc0a9f8d7ced0c0a897938136ab02a1928 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 001e1d31c562c1d246e5a6531b607bf6c851f688 + 3ae591dc0a9f8d7ced0c0a897938136ab02a1928 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 001e1d31c562c1d246e5a6531b607bf6c851f688 + 3ae591dc0a9f8d7ced0c0a897938136ab02a1928 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 001e1d31c562c1d246e5a6531b607bf6c851f688 + 3ae591dc0a9f8d7ced0c0a897938136ab02a1928 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 001e1d31c562c1d246e5a6531b607bf6c851f688 + 3ae591dc0a9f8d7ced0c0a897938136ab02a1928 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime From 7733eb38a16e8ae7ecd6d1569ecc5a48c6f5ba22 Mon Sep 17 00:00:00 2001 From: DotNet-Bot Date: Wed, 8 Apr 2026 03:55:20 +0000 Subject: [PATCH 02/23] Update dependencies from https://dev.azure.com/dnceng/internal/_git/dotnet-efcore build 20260407.5 On relative base path root dotnet-ef , Microsoft.EntityFrameworkCore , Microsoft.EntityFrameworkCore.Design , Microsoft.EntityFrameworkCore.InMemory , Microsoft.EntityFrameworkCore.Relational , Microsoft.EntityFrameworkCore.Sqlite , Microsoft.EntityFrameworkCore.SqlServer , Microsoft.EntityFrameworkCore.Tools From Version 9.0.15 -> To Version 9.0.16 --- NuGet.config | 4 ++-- eng/Version.Details.xml | 32 ++++++++++++++++---------------- eng/Versions.props | 16 ++++++++-------- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/NuGet.config b/NuGet.config index 2f20f9b4a9a2..4ed4330bb40a 100644 --- a/NuGet.config +++ b/NuGet.config @@ -9,7 +9,7 @@ - + @@ -32,7 +32,7 @@ - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 1eb1571df00d..829c7a330b2f 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -9,38 +9,38 @@ --> - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 3ae591dc0a9f8d7ced0c0a897938136ab02a1928 + 9b60b228d7c61f71f81bcaebd4d6cb6850eb5f6d - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 3ae591dc0a9f8d7ced0c0a897938136ab02a1928 + 9b60b228d7c61f71f81bcaebd4d6cb6850eb5f6d - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 3ae591dc0a9f8d7ced0c0a897938136ab02a1928 + 9b60b228d7c61f71f81bcaebd4d6cb6850eb5f6d - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 3ae591dc0a9f8d7ced0c0a897938136ab02a1928 + 9b60b228d7c61f71f81bcaebd4d6cb6850eb5f6d - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 3ae591dc0a9f8d7ced0c0a897938136ab02a1928 + 9b60b228d7c61f71f81bcaebd4d6cb6850eb5f6d - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 3ae591dc0a9f8d7ced0c0a897938136ab02a1928 + 9b60b228d7c61f71f81bcaebd4d6cb6850eb5f6d - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 3ae591dc0a9f8d7ced0c0a897938136ab02a1928 + 9b60b228d7c61f71f81bcaebd4d6cb6850eb5f6d - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 3ae591dc0a9f8d7ced0c0a897938136ab02a1928 + 9b60b228d7c61f71f81bcaebd4d6cb6850eb5f6d https://dev.azure.com/dnceng/internal/_git/dotnet-runtime diff --git a/eng/Versions.props b/eng/Versions.props index e9332a569d9a..fa5fc275c300 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -145,14 +145,14 @@ 10.4.0-preview.1.26127.4 10.4.0-preview.1.26127.4 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 4.11.0-3.24554.2 4.11.0-3.24554.2 From fda28ceb9375cdd43aa1e8c83ead2406ebc3e6d8 Mon Sep 17 00:00:00 2001 From: DotNet-Bot Date: Wed, 8 Apr 2026 05:44:45 +0000 Subject: [PATCH 03/23] Update dependencies from https://dev.azure.com/dnceng/internal/_git/dotnet-efcore build 20260407.8 On relative base path root dotnet-ef , Microsoft.EntityFrameworkCore , Microsoft.EntityFrameworkCore.Design , Microsoft.EntityFrameworkCore.InMemory , Microsoft.EntityFrameworkCore.Relational , Microsoft.EntityFrameworkCore.Sqlite , Microsoft.EntityFrameworkCore.SqlServer , Microsoft.EntityFrameworkCore.Tools From Version 9.0.15 -> To Version 9.0.16 --- NuGet.config | 4 ++-- eng/Version.Details.xml | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/NuGet.config b/NuGet.config index 4ed4330bb40a..20327d5283aa 100644 --- a/NuGet.config +++ b/NuGet.config @@ -9,7 +9,7 @@ - + @@ -32,7 +32,7 @@ - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 829c7a330b2f..76d58f461c14 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,36 +11,36 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 9b60b228d7c61f71f81bcaebd4d6cb6850eb5f6d + 06791c1fcea0adbea5c5c1ac0edb4ed94f9be90e https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 9b60b228d7c61f71f81bcaebd4d6cb6850eb5f6d + 06791c1fcea0adbea5c5c1ac0edb4ed94f9be90e https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 9b60b228d7c61f71f81bcaebd4d6cb6850eb5f6d + 06791c1fcea0adbea5c5c1ac0edb4ed94f9be90e https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 9b60b228d7c61f71f81bcaebd4d6cb6850eb5f6d + 06791c1fcea0adbea5c5c1ac0edb4ed94f9be90e https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 9b60b228d7c61f71f81bcaebd4d6cb6850eb5f6d + 06791c1fcea0adbea5c5c1ac0edb4ed94f9be90e https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 9b60b228d7c61f71f81bcaebd4d6cb6850eb5f6d + 06791c1fcea0adbea5c5c1ac0edb4ed94f9be90e https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 9b60b228d7c61f71f81bcaebd4d6cb6850eb5f6d + 06791c1fcea0adbea5c5c1ac0edb4ed94f9be90e https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 9b60b228d7c61f71f81bcaebd4d6cb6850eb5f6d + 06791c1fcea0adbea5c5c1ac0edb4ed94f9be90e https://dev.azure.com/dnceng/internal/_git/dotnet-runtime From 24a152735f84472d190be67103a8f98f8bccabf4 Mon Sep 17 00:00:00 2001 From: DotNet-Bot Date: Wed, 8 Apr 2026 07:36:02 +0000 Subject: [PATCH 04/23] Update dependencies from https://dev.azure.com/dnceng/internal/_git/dotnet-efcore build 20260407.10 On relative base path root dotnet-ef , Microsoft.EntityFrameworkCore , Microsoft.EntityFrameworkCore.Design , Microsoft.EntityFrameworkCore.InMemory , Microsoft.EntityFrameworkCore.Relational , Microsoft.EntityFrameworkCore.Sqlite , Microsoft.EntityFrameworkCore.SqlServer , Microsoft.EntityFrameworkCore.Tools From Version 9.0.15 -> To Version 9.0.16 --- NuGet.config | 4 ++-- eng/Version.Details.xml | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/NuGet.config b/NuGet.config index 20327d5283aa..4b451ba7c74c 100644 --- a/NuGet.config +++ b/NuGet.config @@ -9,7 +9,7 @@ - + @@ -32,7 +32,7 @@ - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 76d58f461c14..fb0e961bbd40 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,36 +11,36 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 06791c1fcea0adbea5c5c1ac0edb4ed94f9be90e + b145c9fffbc0fbc42c83a330c7d912ad1213f269 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 06791c1fcea0adbea5c5c1ac0edb4ed94f9be90e + b145c9fffbc0fbc42c83a330c7d912ad1213f269 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 06791c1fcea0adbea5c5c1ac0edb4ed94f9be90e + b145c9fffbc0fbc42c83a330c7d912ad1213f269 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 06791c1fcea0adbea5c5c1ac0edb4ed94f9be90e + b145c9fffbc0fbc42c83a330c7d912ad1213f269 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 06791c1fcea0adbea5c5c1ac0edb4ed94f9be90e + b145c9fffbc0fbc42c83a330c7d912ad1213f269 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 06791c1fcea0adbea5c5c1ac0edb4ed94f9be90e + b145c9fffbc0fbc42c83a330c7d912ad1213f269 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 06791c1fcea0adbea5c5c1ac0edb4ed94f9be90e + b145c9fffbc0fbc42c83a330c7d912ad1213f269 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 06791c1fcea0adbea5c5c1ac0edb4ed94f9be90e + b145c9fffbc0fbc42c83a330c7d912ad1213f269 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime From fec65f91b1c0d36155ef6e17d0cce7339acc3c0d Mon Sep 17 00:00:00 2001 From: DotNet-Bot Date: Wed, 8 Apr 2026 23:00:56 +0000 Subject: [PATCH 05/23] Update dependencies from https://dev.azure.com/dnceng/internal/_git/dotnet-runtime build 20260408.11 On relative base path root Microsoft.Bcl.AsyncInterfaces , Microsoft.Bcl.TimeProvider , Microsoft.Extensions.Caching.Abstractions , Microsoft.Extensions.Caching.Memory , Microsoft.Extensions.Configuration , Microsoft.Extensions.Configuration.Abstractions , Microsoft.Extensions.Configuration.Binder , Microsoft.Extensions.Configuration.CommandLine , Microsoft.Extensions.Configuration.EnvironmentVariables , Microsoft.Extensions.Configuration.FileExtensions , Microsoft.Extensions.Configuration.Ini , Microsoft.Extensions.Configuration.Json , Microsoft.Extensions.Configuration.UserSecrets , Microsoft.Extensions.Configuration.Xml , Microsoft.Extensions.DependencyInjection , Microsoft.Extensions.DependencyInjection.Abstractions , Microsoft.Extensions.DependencyModel , Microsoft.Extensions.Diagnostics , Microsoft.Extensions.Diagnostics.Abstractions , Microsoft.Extensions.FileProviders.Abstractions , Microsoft.Extensions.FileProviders.Composite , Microsoft.Extensions.FileProviders.Physical , Microsoft.Extensions.FileSystemGlobbing , Microsoft.Extensions.Hosting , Microsoft.Extensions.Hosting.Abstractions , Microsoft.Extensions.Http , Microsoft.Extensions.Logging , Microsoft.Extensions.Logging.Abstractions , Microsoft.Extensions.Logging.Configuration , Microsoft.Extensions.Logging.Console , Microsoft.Extensions.Logging.Debug , Microsoft.Extensions.Logging.EventLog , Microsoft.Extensions.Logging.EventSource , Microsoft.Extensions.Logging.TraceSource , Microsoft.Extensions.Options , Microsoft.Extensions.Options.ConfigurationExtensions , Microsoft.Extensions.Options.DataAnnotations , Microsoft.Extensions.Primitives , Microsoft.NET.Runtime.MonoAOTCompiler.Task , Microsoft.NET.Runtime.WebAssembly.Sdk , Microsoft.NETCore.App.Ref , Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.browser-wasm , Microsoft.NETCore.App.Runtime.win-x64 , System.Collections.Immutable , System.Composition , System.Configuration.ConfigurationManager , System.Diagnostics.DiagnosticSource , System.Diagnostics.EventLog , System.Diagnostics.PerformanceCounter , System.DirectoryServices.Protocols , System.IO.Hashing , System.IO.Pipelines , System.Net.Http.Json , System.Net.Http.WinHttpHandler , System.Net.ServerSentEvents , System.Reflection.Metadata , System.Resources.Extensions , System.Runtime.Caching , System.Security.Cryptography.Pkcs , System.Security.Cryptography.Xml , System.Security.Permissions , System.ServiceProcess.ServiceController , System.Text.Encodings.Web , System.Text.Json , System.Threading.AccessControl , System.Threading.Channels , System.Threading.RateLimiting From Version 9.0.15 -> To Version 9.0.15 Microsoft.Extensions.HostFactoryResolver.Sources , Microsoft.Internal.Runtime.AspNetCore.Transport , Microsoft.NETCore.BrowserDebugHost.Transport , Microsoft.NETCore.Platforms , Microsoft.SourceBuild.Intermediate.runtime.linux-x64 From Version 9.0.15-servicing.26175.22 -> To Version 9.0.15-servicing.26208.11 --- NuGet.config | 4 +- eng/Version.Details.xml | 154 ++++++++++++++++++++-------------------- eng/Versions.props | 10 +-- 3 files changed, 84 insertions(+), 84 deletions(-) diff --git a/NuGet.config b/NuGet.config index 4b451ba7c74c..a46700a57d94 100644 --- a/NuGet.config +++ b/NuGet.config @@ -6,7 +6,7 @@ - + @@ -35,7 +35,7 @@ - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index fb0e961bbd40..564b62942166 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -44,268 +44,268 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://github.com/dotnet/xdt @@ -369,7 +369,7 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 @@ -380,9 +380,9 @@ - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 4250c8399aa851d2d6a95efbdcc5c4c12311e024 + feff4f661c3e7f48fe1e309c780fc3fa62059fd2 https://github.com/dotnet/winforms diff --git a/eng/Versions.props b/eng/Versions.props index fa5fc275c300..08441c4e4aa0 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -73,7 +73,7 @@ 9.0.15 9.0.15 9.0.15 - 9.0.15-servicing.26175.22 + 9.0.15-servicing.26208.11 9.0.15 9.0.15 9.0.15 @@ -94,7 +94,7 @@ 9.0.15 9.0.15 9.0.15 - 9.0.15-servicing.26175.22 + 9.0.15-servicing.26208.11 9.0.15 9.0.15 9.0.15 @@ -110,8 +110,8 @@ 9.0.15 9.0.15 9.0.15 - 9.0.15-servicing.26175.22 - 9.0.15-servicing.26175.22 + 9.0.15-servicing.26208.11 + 9.0.15-servicing.26208.11 9.0.15 9.0.15 9.0.15 @@ -133,7 +133,7 @@ 9.0.15 9.0.15 - 9.0.15-servicing.26175.22 + 9.0.15-servicing.26208.11 9.0.15 9.0.15 From d5798c6cb59a2a0c63d7134d4c72c64120969f79 Mon Sep 17 00:00:00 2001 From: DotNet-Bot Date: Fri, 10 Apr 2026 04:26:51 +0000 Subject: [PATCH 06/23] Update dependencies from https://dev.azure.com/dnceng/internal/_git/dotnet-runtime build 20260409.22 On relative base path root Microsoft.Bcl.AsyncInterfaces , Microsoft.Bcl.TimeProvider , Microsoft.Extensions.Caching.Abstractions , Microsoft.Extensions.Caching.Memory , Microsoft.Extensions.Configuration , Microsoft.Extensions.Configuration.Abstractions , Microsoft.Extensions.Configuration.Binder , Microsoft.Extensions.Configuration.CommandLine , Microsoft.Extensions.Configuration.EnvironmentVariables , Microsoft.Extensions.Configuration.FileExtensions , Microsoft.Extensions.Configuration.Ini , Microsoft.Extensions.Configuration.Json , Microsoft.Extensions.Configuration.UserSecrets , Microsoft.Extensions.Configuration.Xml , Microsoft.Extensions.DependencyInjection , Microsoft.Extensions.DependencyInjection.Abstractions , Microsoft.Extensions.DependencyModel , Microsoft.Extensions.Diagnostics , Microsoft.Extensions.Diagnostics.Abstractions , Microsoft.Extensions.FileProviders.Abstractions , Microsoft.Extensions.FileProviders.Composite , Microsoft.Extensions.FileProviders.Physical , Microsoft.Extensions.FileSystemGlobbing , Microsoft.Extensions.Hosting , Microsoft.Extensions.Hosting.Abstractions , Microsoft.Extensions.Http , Microsoft.Extensions.Logging , Microsoft.Extensions.Logging.Abstractions , Microsoft.Extensions.Logging.Configuration , Microsoft.Extensions.Logging.Console , Microsoft.Extensions.Logging.Debug , Microsoft.Extensions.Logging.EventLog , Microsoft.Extensions.Logging.EventSource , Microsoft.Extensions.Logging.TraceSource , Microsoft.Extensions.Options , Microsoft.Extensions.Options.ConfigurationExtensions , Microsoft.Extensions.Options.DataAnnotations , Microsoft.Extensions.Primitives , Microsoft.NET.Runtime.MonoAOTCompiler.Task , Microsoft.NET.Runtime.WebAssembly.Sdk , Microsoft.NETCore.App.Ref , Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.browser-wasm , Microsoft.NETCore.App.Runtime.win-x64 , System.Collections.Immutable , System.Composition , System.Configuration.ConfigurationManager , System.Diagnostics.DiagnosticSource , System.Diagnostics.EventLog , System.Diagnostics.PerformanceCounter , System.DirectoryServices.Protocols , System.IO.Hashing , System.IO.Pipelines , System.Net.Http.Json , System.Net.Http.WinHttpHandler , System.Net.ServerSentEvents , System.Reflection.Metadata , System.Resources.Extensions , System.Runtime.Caching , System.Security.Cryptography.Pkcs , System.Security.Cryptography.Xml , System.Security.Permissions , System.ServiceProcess.ServiceController , System.Text.Encodings.Web , System.Text.Json , System.Threading.AccessControl , System.Threading.Channels , System.Threading.RateLimiting From Version 9.0.15 -> To Version 9.0.16 Microsoft.Extensions.HostFactoryResolver.Sources , Microsoft.Internal.Runtime.AspNetCore.Transport , Microsoft.NETCore.BrowserDebugHost.Transport , Microsoft.NETCore.Platforms , Microsoft.SourceBuild.Intermediate.runtime.linux-x64 From Version 9.0.15-servicing.26175.22 -> To Version 9.0.16-servicing.26209.22 --- NuGet.config | 4 +- eng/Version.Details.xml | 288 ++++++++++++++++++++-------------------- eng/Versions.props | 144 ++++++++++---------- 3 files changed, 218 insertions(+), 218 deletions(-) diff --git a/NuGet.config b/NuGet.config index a46700a57d94..96d04b90f88a 100644 --- a/NuGet.config +++ b/NuGet.config @@ -6,7 +6,7 @@ - + @@ -35,7 +35,7 @@ - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 564b62942166..ff903f82dd15 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -42,292 +42,292 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-efcore b145c9fffbc0fbc42c83a330c7d912ad1213f269 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 https://github.com/dotnet/xdt @@ -367,9 +367,9 @@ bc1c3011064a493b0ca527df6fb7215e2e5cfa96 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 @@ -380,9 +380,9 @@ - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - feff4f661c3e7f48fe1e309c780fc3fa62059fd2 + 6f733b0760184aa039f85cab6ff1890ac6868169 https://github.com/dotnet/winforms diff --git a/eng/Versions.props b/eng/Versions.props index 08441c4e4aa0..3c0b075c584b 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -67,80 +67,80 @@ --> - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15-servicing.26208.11 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15-servicing.26208.11 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15-servicing.26208.11 - 9.0.15-servicing.26208.11 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16-servicing.26209.22 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16-servicing.26209.22 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16-servicing.26209.22 + 9.0.16-servicing.26209.22 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 - 9.0.15-servicing.26208.11 - 9.0.15 + 9.0.16-servicing.26209.22 + 9.0.16 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 - 9.0.15 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 + 9.0.16 10.4.0-preview.1.26127.4 10.4.0-preview.1.26127.4 From 424ab53ef33ca3abe19ad68621b9a097a7ac9d1d Mon Sep 17 00:00:00 2001 From: Will Godbe Date: Mon, 13 Apr 2026 22:52:05 +0000 Subject: [PATCH 07/23] Merged PR 60039: [internal/release/9.0] Fix bad merge conflict resolution #### AI description (iteration 1) #### PR Classification Bug fix to resolve incorrectly merged Git conflict markers in the NuGet configuration file. #### PR Summary Removes leftover Git conflict markers (`<<<<<<<`, `=======`, `>>>>>>>`) from the NuGet.config file that were inadvertently committed during a previous merge operation. This restores the file to a valid state with proper package source configurations. - `/NuGet.config`: Cleaned up duplicate comment lines and removed all Git conflict markers in both the `` and `` sections --- NuGet.config | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/NuGet.config b/NuGet.config index ee503772b9a9..3fbb60b97541 100644 --- a/NuGet.config +++ b/NuGet.config @@ -6,15 +6,10 @@ -<<<<<<< HEAD -======= - - ->>>>>>> upstream/release/9.0 @@ -37,15 +32,10 @@ -<<<<<<< HEAD -======= - - ->>>>>>> upstream/release/9.0 From f5ffc63edbb68f96b8f67d3fb51bf5b3154a48e0 Mon Sep 17 00:00:00 2001 From: Brennan Conroy Date: Tue, 14 Apr 2026 16:55:27 +0000 Subject: [PATCH 08/23] Merged PR 58157: Close connection after processing CL+TE RFC9112 updating working to "MUST" close the connection after processing a request with both Content-Length and Transfer-Encoding headers. We are still allowed to process the current request as long as we remove the Content-Length header, which we have been doing. --- .../HttpSys/src/RequestProcessing/Request.cs | 32 +++++-- .../HttpSys/src/RequestProcessing/Response.cs | 2 +- .../src/RequestProcessing/ResponseBody.cs | 5 ++ .../FunctionalTests/RequestHeaderTests.cs | 73 ++++++++++++++++ .../managedexports.cpp | 10 +++ .../IIS/IIS/src/Core/IISHttpContext.cs | 33 +++++-- src/Servers/IIS/IIS/src/NativeMethods.cs | 8 ++ .../RequestResponseTests.cs | 46 +++++++++- .../src/Internal/Http/Http1MessageBody.cs | 28 ++++-- .../ChunkedRequestTests.cs | 87 ++++++++++++++++++- 10 files changed, 297 insertions(+), 27 deletions(-) diff --git a/src/Servers/HttpSys/src/RequestProcessing/Request.cs b/src/Servers/HttpSys/src/RequestProcessing/Request.cs index f02507251cab..e4e8ebcf92fb 100644 --- a/src/Servers/HttpSys/src/RequestProcessing/Request.cs +++ b/src/Servers/HttpSys/src/RequestProcessing/Request.cs @@ -19,6 +19,8 @@ namespace Microsoft.AspNetCore.Server.HttpSys; internal sealed partial class Request { + private static readonly bool AllowKeepAliveAfterCLTE = AppContext.TryGetSwitch("Microsoft.AspNetCore.Server.HttpSys.AllowKeepAliveAfterCLTE", out var value) && value; + private X509Certificate2? _clientCert; // TODO: https://github.com/aspnet/HttpSysServer/issues/231 // private byte[] _providedTokenBindingId; @@ -201,6 +203,8 @@ internal Request(RequestContext requestContext) private RequestContext RequestContext { get; } + public bool KeepAlive { get; private set; } = true; + // With the leading ?, if any public string QueryString { get; } @@ -503,22 +507,34 @@ private void RemoveContentLengthIfTransferEncodingContainsChunked() return; } - // https://datatracker.ietf.org/doc/html/rfc7230#section-3.3.2 + // https://www.rfc-editor.org/rfc/rfc9112#section-6.2 // A sender MUST NOT send a Content-Length header field in any message // that contains a Transfer-Encoding header field. - // https://datatracker.ietf.org/doc/html/rfc7230#section-3.3.3 + // https://www.rfc-editor.org/rfc/rfc9112#section-6.3-2.3 // If a message is received with both a Transfer-Encoding and a // Content-Length header field, the Transfer-Encoding overrides the - // Content-Length. Such a message might indicate an attempt to - // perform request smuggling (Section 9.5) or response splitting - // (Section 9.4) and ought to be handled as an error. A sender MUST - // remove the received Content-Length field prior to forwarding such - // a message downstream. + // Content-Length. Such a message might indicate an attempt to + // perform request smuggling (Section 11.2) or response splitting + // (Section 11.1) and ought to be handled as an error. An intermediary + // that chooses to forward the message MUST first remove the received + // Content-Length field and process the Transfer-Encoding + // (as described below) prior to forwarding the message downstream. // We should remove the Content-Length request header in this case, for compatibility - // reasons, include X-Content-Length so that the original Content-Length is still available. + // reasons, include x-Content-Length so that the original Content-Length is still available. IHeaderDictionary headerDictionary = Headers; headerDictionary.Add("X-Content-Length", headerDictionary[HeaderNames.ContentLength]); Headers.ContentLength = StringValues.Empty; + + if (!AllowKeepAliveAfterCLTE) + { + // https://www.rfc-editor.org/rfc/rfc9112#section-6.1 + // A server MAY reject a request that contains both Content-Length + // and Transfer-Encoding or process such a request in accordance + // with the Transfer-Encoding alone. Regardless, the server MUST + // close the connection after responding to such a request to + // avoid the potential attacks. + KeepAlive = false; + } } private static bool IsChunked(string? transferEncoding) diff --git a/src/Servers/HttpSys/src/RequestProcessing/Response.cs b/src/Servers/HttpSys/src/RequestProcessing/Response.cs index 0fb275227994..acb6b8b82dbc 100644 --- a/src/Servers/HttpSys/src/RequestProcessing/Response.cs +++ b/src/Servers/HttpSys/src/RequestProcessing/Response.cs @@ -403,7 +403,7 @@ internal uint ComputeHeaders(long writeCount, bool endOfRequest = false) var statusCanHaveBody = CanSendResponseBody(RequestContext.Response.StatusCode); // Determine if the connection will be kept alive or closed. - var keepConnectionAlive = true; + var keepConnectionAlive = Request.KeepAlive; // An HTTP/1.1 server may also establish persistent connections with // HTTP/1.0 clients upon receipt of a Keep-Alive connection token. diff --git a/src/Servers/HttpSys/src/RequestProcessing/ResponseBody.cs b/src/Servers/HttpSys/src/RequestProcessing/ResponseBody.cs index 8bb2f555e900..75612b15b037 100644 --- a/src/Servers/HttpSys/src/RequestProcessing/ResponseBody.cs +++ b/src/Servers/HttpSys/src/RequestProcessing/ResponseBody.cs @@ -482,6 +482,11 @@ private uint ComputeLeftToWrite(long writeCount, bool endOfRequest = false) } } + if (!_requestContext.Request.KeepAlive) + { + flags |= PInvoke.HTTP_SEND_RESPONSE_FLAG_DISCONNECT; + } + if (endOfRequest && _requestContext.Response.BoundaryType == BoundaryType.Close) { flags |= PInvoke.HTTP_SEND_RESPONSE_FLAG_DISCONNECT; diff --git a/src/Servers/HttpSys/test/FunctionalTests/RequestHeaderTests.cs b/src/Servers/HttpSys/test/FunctionalTests/RequestHeaderTests.cs index e32aeb750486..30c2e8164a6a 100644 --- a/src/Servers/HttpSys/test/FunctionalTests/RequestHeaderTests.cs +++ b/src/Servers/HttpSys/test/FunctionalTests/RequestHeaderTests.cs @@ -177,6 +177,79 @@ public async Task RequestHeaders_ClientSendTransferEncodingAndContentLength_Cont } } + [ConditionalFact] + public async Task CloseConnectionAfterProcessingContentLengthPlusChunkedRequest() + { + string address; + using (Utilities.CreateHttpServer(out address, async httpContext => + { + var requestHeaders = httpContext.Request.Headers; + var request = httpContext.Features.Get().Request; + Assert.Single(requestHeaders["Transfer-Encoding"]); + Assert.Equal("chunked", requestHeaders.TransferEncoding); + + Assert.Null(request.ContentLength); + Assert.True(request.HasEntityBody); + + Assert.False(requestHeaders.ContainsKey("Content-Length")); + Assert.Null(requestHeaders.ContentLength); + + Assert.Single(requestHeaders["X-Content-Length"]); + Assert.Equal("1", requestHeaders["X-Content-Length"]); + + await httpContext.Response.WriteAsync("Hello World"); + }, LoggerFactory)) + { + var uri = new Uri(address); + using (Socket socket = new Socket(SocketType.Stream, ProtocolType.Tcp)) + { + socket.Connect(uri.Host, uri.Port); + // Send 2 requests with both CL and TE header + // expect the second to not be processed and the connection to be closed + for (var i = 0; i < 2; i++) + { + socket.Send(Encoding.ASCII.GetBytes(string.Join("\r\n", + "POST / HTTP/1.1", + $"Host: {uri.Authority}", + "Transfer-Encoding: chunked", + "Connection: keep-alive", + "Content-Length: 1", + "", + "5", "Hello", + "6", " World", + "0", + "", + ""))); + } + byte[] response = new byte[1024 * 5]; + var sb = new StringBuilder(); + + int read = 0; + do + { + read = await Task.Run(() => socket.Receive(response)); + var s = Encoding.ASCII.GetString(response, 0, read); + sb.Append(s); + } while (read != 0); + + var resp = sb.ToString(); + + Assert.Matches(@"HTTP/1\.1 200 OK +Transfer-Encoding: chunked +Server: Microsoft-HTTPAPI/2\.0 +Date: .+ +Connection: close + +B +Hello World +0 + +$", + resp); + } + } + } + [ConditionalFact] public async Task RequestHeaders_AllKnownHeadersKeys_Received() { diff --git a/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/managedexports.cpp b/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/managedexports.cpp index 23639860527a..040a91f573e3 100644 --- a/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/managedexports.cpp +++ b/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/managedexports.cpp @@ -478,6 +478,16 @@ http_close_connection( return S_OK; } +EXTERN_C __declspec(dllexport) +HRESULT +http_set_close( + _In_ IN_PROCESS_HANDLER* pInProcessHandler +) +{ + pInProcessHandler->QueryHttpContext()->GetResponse()->SetNeedDisconnect(); + return S_OK; +} + EXTERN_C __declspec(dllexport) HRESULT http_response_set_unknown_header( diff --git a/src/Servers/IIS/IIS/src/Core/IISHttpContext.cs b/src/Servers/IIS/IIS/src/Core/IISHttpContext.cs index f0e04f3b2a95..f96a03fb0720 100644 --- a/src/Servers/IIS/IIS/src/Core/IISHttpContext.cs +++ b/src/Servers/IIS/IIS/src/Core/IISHttpContext.cs @@ -29,6 +29,8 @@ namespace Microsoft.AspNetCore.Server.IIS.Core; internal abstract partial class IISHttpContext : NativeRequestContext, IThreadPoolWorkItem, IDisposable { + private static readonly bool AllowKeepAliveAfterCLTE = AppContext.TryGetSwitch("Microsoft.AspNetCore.Server.IIS.AllowKeepAliveAfterCLTE", out var value) && value; + private const int MinAllocBufferSize = 2048; protected readonly NativeSafeHandle _requestNativeHandle; @@ -41,6 +43,7 @@ internal abstract partial class IISHttpContext : NativeRequestContext, IThreadPo private int _statusCode; private string? _reasonPhrase; + // Used to synchronize callback registration and native method calls internal readonly object _contextLock = new object(); @@ -367,23 +370,35 @@ private bool CheckRequestCanHaveBody() string transferEncoding = RequestHeaders.TransferEncoding.ToString(); if (IsChunked(transferEncoding)) { - // https://datatracker.ietf.org/doc/html/rfc7230#section-3.3.2 + // https://www.rfc-editor.org/rfc/rfc9112#section-6.2 // A sender MUST NOT send a Content-Length header field in any message // that contains a Transfer-Encoding header field. - // https://datatracker.ietf.org/doc/html/rfc7230#section-3.3.3 + // https://www.rfc-editor.org/rfc/rfc9112#section-6.3-2.3 // If a message is received with both a Transfer-Encoding and a // Content-Length header field, the Transfer-Encoding overrides the - // Content-Length. Such a message might indicate an attempt to - // perform request smuggling (Section 9.5) or response splitting - // (Section 9.4) and ought to be handled as an error. A sender MUST - // remove the received Content-Length field prior to forwarding such - // a message downstream. + // Content-Length. Such a message might indicate an attempt to + // perform request smuggling (Section 11.2) or response splitting + // (Section 11.1) and ought to be handled as an error. An intermediary + // that chooses to forward the message MUST first remove the received + // Content-Length field and process the Transfer-Encoding + // (as described below) prior to forwarding the message downstream. // We should remove the Content-Length request header in this case, for compatibility // reasons, include X-Content-Length so that the original Content-Length is still available. - if (RequestHeaders.ContentLength.HasValue) + if (RequestHeaders.TryGetValue(HeaderNames.ContentLength, out var contentLength)) { - RequestHeaders.Add("X-Content-Length", RequestHeaders[HeaderNames.ContentLength]); + RequestHeaders.Add("X-Content-Length", contentLength); RequestHeaders.ContentLength = null; + + if (!AllowKeepAliveAfterCLTE) + { + // https://www.rfc-editor.org/rfc/rfc9112#section-6.1 + // A server MAY reject a request that contains both Content-Length + // and Transfer-Encoding or process such a request in accordance + // with the Transfer-Encoding alone. Regardless, the server MUST + // close the connection after responding to such a request to + // avoid the potential attacks. + NativeMethods.HttpSetClose(_requestNativeHandle); + } } return true; } diff --git a/src/Servers/IIS/IIS/src/NativeMethods.cs b/src/Servers/IIS/IIS/src/NativeMethods.cs index 6aa3d68ed35e..1fe994ec4ff4 100644 --- a/src/Servers/IIS/IIS/src/NativeMethods.cs +++ b/src/Servers/IIS/IIS/src/NativeMethods.cs @@ -143,6 +143,9 @@ private static unsafe partial int http_websockets_write_bytes( [LibraryImport(AspNetCoreModuleDll)] private static partial int http_close_connection(NativeSafeHandle pInProcessHandler); + [LibraryImport(AspNetCoreModuleDll)] + private static partial int http_set_close(NativeSafeHandle pInProcessHandler); + [LibraryImport(AspNetCoreModuleDll)] private static partial int http_response_set_need_goaway(NativeSafeHandle pInProcessHandler); @@ -306,6 +309,11 @@ public static void HttpCloseConnection(NativeSafeHandle pInProcessHandler) Validate(http_close_connection(pInProcessHandler)); } + public static void HttpSetClose(NativeSafeHandle pInProcessHandler) + { + Validate(http_set_close(pInProcessHandler)); + } + public static unsafe void HttpResponseSetUnknownHeader(NativeSafeHandle pInProcessHandler, byte* pszHeaderName, byte* pszHeaderValue, ushort usHeaderValueLength, bool fReplace) { Validate(http_response_set_unknown_header(pInProcessHandler, pszHeaderName, pszHeaderValue, usHeaderValueLength, fReplace)); diff --git a/src/Servers/IIS/IIS/test/Common.FunctionalTests/RequestResponseTests.cs b/src/Servers/IIS/IIS/test/Common.FunctionalTests/RequestResponseTests.cs index 5181cee0f75f..d8a1d0a624a7 100644 --- a/src/Servers/IIS/IIS/test/Common.FunctionalTests/RequestResponseTests.cs +++ b/src/Servers/IIS/IIS/test/Common.FunctionalTests/RequestResponseTests.cs @@ -10,8 +10,8 @@ using System.Net.Http.Headers; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNetCore.Server.IntegrationTesting; using Microsoft.AspNetCore.InternalTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting; using Xunit; #if !IIS_FUNCTIONALS @@ -789,6 +789,50 @@ await connection.Receive( } } + [ConditionalFact] + public async Task CloseConnectionAfterProcessingContentLengthPlusChunkedRequest() + { + using (var connection = _fixture.CreateTestConnection()) + { + for (var i = 0; i < 2; i++) + { + await connection.Send( + "POST /ReadAndWriteEcho HTTP/1.1", + "Host: localhost", + "Transfer-Encoding: chunked", + "Connection: keep-alive", + "Content-Length: 25", + "", + "5", "Hello", + "6", " World", + "0", + "", + ""); + } + + var recv = await connection.Receive(4096); + var recvString = Encoding.UTF8.GetString(recv.Span); + + Assert.Matches(@"HTTP/1\.1 200 OK +Server: Microsoft-IIS/10\.0 +Date: .+ +Connection: close + +Hello World + +$", + recvString); + + // Double check that there is no second response since we're using + // Assert.Matches which only checks for a first match + Assert.Equal(0, recvString.LastIndexOf("HTTP/1", StringComparison.InvariantCultureIgnoreCase)); + + // Verify the connection is closed + recv = await connection.Receive(100); + Assert.Equal(0, recv.Length); + } + } + private async Task<(int Status, string Body)> SendSocketRequestAsync(string path) { using (var connection = _fixture.CreateTestConnection()) diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/Http1MessageBody.cs b/src/Servers/Kestrel/Core/src/Internal/Http/Http1MessageBody.cs index d14c25e49910..178ba3be43b1 100644 --- a/src/Servers/Kestrel/Core/src/Internal/Http/Http1MessageBody.cs +++ b/src/Servers/Kestrel/Core/src/Internal/Http/Http1MessageBody.cs @@ -15,6 +15,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http; internal abstract class Http1MessageBody : MessageBody { + private static readonly bool ContinueProcessingAfterCLTE = AppContext.TryGetSwitch("Microsoft.AspNetCore.Server.Kestrel.AllowKeepAliveAfterCLTE", out var value) && value; + protected readonly Http1Connection _context; private bool _readerCompleted; @@ -166,17 +168,18 @@ public static MessageBody For( KestrelBadHttpRequestException.Throw(RequestRejectionReason.FinalTransferCodingNotChunked, transferEncoding); } - // https://datatracker.ietf.org/doc/html/rfc7230#section-3.3.2 + // https://www.rfc-editor.org/rfc/rfc9112#section-6.2 // A sender MUST NOT send a Content-Length header field in any message // that contains a Transfer-Encoding header field. - // https://datatracker.ietf.org/doc/html/rfc7230#section-3.3.3 + // https://www.rfc-editor.org/rfc/rfc9112#section-6.3-2.3 // If a message is received with both a Transfer-Encoding and a // Content-Length header field, the Transfer-Encoding overrides the - // Content-Length. Such a message might indicate an attempt to - // perform request smuggling (Section 9.5) or response splitting - // (Section 9.4) and ought to be handled as an error. A sender MUST - // remove the received Content-Length field prior to forwarding such - // a message downstream. + // Content-Length. Such a message might indicate an attempt to + // perform request smuggling (Section 11.2) or response splitting + // (Section 11.1) and ought to be handled as an error. An intermediary + // that chooses to forward the message MUST first remove the received + // Content-Length field and process the Transfer-Encoding + // (as described below) prior to forwarding the message downstream. // We should remove the Content-Length request header in this case, for compatibility // reasons, include x-Content-Length so that the original Content-Length is still available. if (headers.ContentLength.HasValue) @@ -184,6 +187,17 @@ public static MessageBody For( IHeaderDictionary headerDictionary = headers; headerDictionary.Add("X-Content-Length", headerDictionary[HeaderNames.ContentLength]); headers.ContentLength = null; + + if (!ContinueProcessingAfterCLTE) + { + // https://www.rfc-editor.org/rfc/rfc9112#section-6.1 + // A server MAY reject a request that contains both Content-Length + // and Transfer-Encoding or process such a request in accordance + // with the Transfer-Encoding alone. Regardless, the server MUST + // close the connection after responding to such a request to + // avoid the potential attacks. + keepAlive = false; + } } // TODO may push more into the wrapper rather than just calling into the message body diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/ChunkedRequestTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/ChunkedRequestTests.cs index 7859716d6ff1..0b62c480575c 100644 --- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/ChunkedRequestTests.cs +++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/ChunkedRequestTests.cs @@ -11,6 +11,7 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http; using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure; using Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests.TestTransport; +using Microsoft.DotNet.RemoteExecutor; using Microsoft.Extensions.Diagnostics.Metrics.Testing; using Microsoft.Extensions.Logging; using BadHttpRequestException = Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException; @@ -119,7 +120,7 @@ private async Task PipeApp(HttpContext httpContext) } } - private async Task AppChunked(HttpContext httpContext) + private static async Task AppChunked(HttpContext httpContext) { var request = httpContext.Request; var response = httpContext.Response; @@ -1264,4 +1265,88 @@ await connection.ReceiveEnd( } } } + + [Fact] + public async Task CloseConnectionAfterProcessingContentLengthPlusChunkedRequest() + { + var testContext = new TestServiceContext(LoggerFactory); + + await using (var server = new TestServer(AppChunked, testContext)) + { + using (var connection = server.CreateConnection()) + { + for (var i = 0; i < 2; i++) + { + await connection.Send( + "POST / HTTP/1.1", + "Host:", + "Transfer-Encoding: chunked", + "Connection: keep-alive", + "Content-Length: 7", + "", + "5", "Hello", + "6", " World", + "0", + "", + ""); + } + + await connection.ReceiveEnd( + "HTTP/1.1 200 OK", + "Content-Length: 11", + "Connection: close", + $"Date: {testContext.DateHeaderValue}", + "", + "Hello World"); + } + } + } + + [ConditionalFact] + [RemoteExecutionSupported] + public void CanKeepProcessingRequestsAfterContentLengthPlusChunkedRequest_WithAppContext() + { + var options = new RemoteInvokeOptions(); + options.RuntimeConfigurationOptions.Add("Microsoft.AspNetCore.Server.Kestrel.AllowKeepAliveAfterCLTE", "true"); + + using var remoteHandle = RemoteExecutor.Invoke(static async () => + { + var testContext = new TestServiceContext(); + + await using (var server = new TestServer(AppChunked, testContext)) + { + using (var connection = server.CreateConnection()) + { + for (var i = 0; i < 2; i++) + { + await connection.Send( + "POST / HTTP/1.1", + "Host:", + "Transfer-Encoding: chunked", + "Connection: keep-alive", + "Content-Length: 7", + "", + "5", "Hello", + "6", " World", + "0", + "", + ""); + } + + await connection.Receive( + "HTTP/1.1 200 OK", + "Content-Length: 11", + $"Date: {testContext.DateHeaderValue}", + "", + "Hello World"); + await connection.Receive( + "HTTP/1.1 200 OK", + "Content-Length: 11", + $"Date: {testContext.DateHeaderValue}", + "", + "Hello World"); + } + } + }, options); + } } From 206a12e8ead4007af310ab313f20e4e4a9210bec Mon Sep 17 00:00:00 2001 From: Dmitrii Korolev Date: Tue, 14 Apr 2026 16:57:36 +0000 Subject: [PATCH 09/23] Merged PR 60026: [release/9.0] fix(ResponseCaching): Add validation to ResponseCachingKeyProvider delimiter characters delimiter characters are not validated in the request, meaning users can get the "artificial" response instead of their real request. --- .../samples/ResponseCachingSample/Startup.cs | 21 +++- .../src/CacheKeyDelimiterException.cs | 12 +++ .../ResponseCaching/src/LoggerExtensions.cs | 4 + .../src/ResponseCachingKeyProvider.cs | 17 +++ .../src/ResponseCachingMiddleware.cs | 49 +++++++-- .../test/ResponseCachingKeyProviderTests.cs | 102 ++++++++++++++++++ .../test/ResponseCachingMiddlewareTests.cs | 98 +++++++++++++++++ .../ResponseCaching/test/TestUtils.cs | 1 + 8 files changed, 295 insertions(+), 9 deletions(-) create mode 100644 src/Middleware/ResponseCaching/src/CacheKeyDelimiterException.cs diff --git a/src/Middleware/ResponseCaching/samples/ResponseCachingSample/Startup.cs b/src/Middleware/ResponseCaching/samples/ResponseCachingSample/Startup.cs index 3cf2daf4b12d..e322ff2322fd 100644 --- a/src/Middleware/ResponseCaching/samples/ResponseCachingSample/Startup.cs +++ b/src/Middleware/ResponseCaching/samples/ResponseCachingSample/Startup.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using Microsoft.AspNetCore.ResponseCaching; using Microsoft.Net.Http.Headers; namespace ResponseCachingSample; @@ -20,17 +21,31 @@ public void Configure(IApplicationBuilder app) context.Response.GetTypedHeaders().CacheControl = new CacheControlHeaderValue() { Public = true, - MaxAge = TimeSpan.FromSeconds(10) + MaxAge = TimeSpan.FromSeconds(60) }; - context.Response.Headers.Vary = new string[] { "Accept-Encoding" }; - await context.Response.WriteAsync("Hello World! " + DateTime.UtcNow); + var responseCachingFeature = context.Features.Get(); + if (responseCachingFeature != null) + { + responseCachingFeature.VaryByQueryKeys = [ "*" ]; + } + + var user = context.Request.Query["user"].FirstOrDefault() ?? "(none)"; + var theme = context.Request.Query["theme"].FirstOrDefault() ?? "(none)"; + + context.Response.ContentType = "text/plain"; + await context.Response.WriteAsync($"User: {user} | Theme: {theme} | Generated: {DateTime.UtcNow:O}"); }); } public static Task Main(string[] args) { var host = new HostBuilder() + .ConfigureLogging(logging => + { + logging.AddConsole(); + logging.SetMinimumLevel(LogLevel.Information); + }) .ConfigureWebHost(webHostBuilder => { webHostBuilder diff --git a/src/Middleware/ResponseCaching/src/CacheKeyDelimiterException.cs b/src/Middleware/ResponseCaching/src/CacheKeyDelimiterException.cs new file mode 100644 index 000000000000..d2a4c6f4eb09 --- /dev/null +++ b/src/Middleware/ResponseCaching/src/CacheKeyDelimiterException.cs @@ -0,0 +1,12 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Microsoft.AspNetCore.ResponseCaching; + +internal sealed class CacheKeyDelimiterException : Exception +{ + public CacheKeyDelimiterException() + : base("The value contains invalid characters to cache.") + { + } +} diff --git a/src/Middleware/ResponseCaching/src/LoggerExtensions.cs b/src/Middleware/ResponseCaching/src/LoggerExtensions.cs index 68887c41c3aa..83e969e14ad7 100644 --- a/src/Middleware/ResponseCaching/src/LoggerExtensions.cs +++ b/src/Middleware/ResponseCaching/src/LoggerExtensions.cs @@ -120,4 +120,8 @@ internal static partial class LoggerExtensions "However, the 'max-stale' cache directive was specified without an assigned value and a stale response of any age is accepted.", EventName = "ExpirationInfiniteMaxStaleSatisfied")] internal static partial void ExpirationInfiniteMaxStaleSatisfied(this ILogger logger, TimeSpan age, TimeSpan maxAge); + + [LoggerMessage(30, LogLevel.Debug, "The request contains invalid characters and will not be cached.", + EventName = "RequestContainsInvalidCacheSymbols")] + internal static partial void RequestContainsInvalidCacheSymbols(this ILogger logger); } diff --git a/src/Middleware/ResponseCaching/src/ResponseCachingKeyProvider.cs b/src/Middleware/ResponseCaching/src/ResponseCachingKeyProvider.cs index 54458ae19cf5..79c08b246e71 100644 --- a/src/Middleware/ResponseCaching/src/ResponseCachingKeyProvider.cs +++ b/src/Middleware/ResponseCaching/src/ResponseCachingKeyProvider.cs @@ -39,6 +39,10 @@ public string CreateBaseKey(ResponseCachingContext context) ArgumentNullException.ThrowIfNull(context); var request = context.HttpContext.Request; + + ThrowIfContainsDelimiters(request.PathBase.Value); + ThrowIfContainsDelimiters(request.Path.Value); + var builder = _builderPool.Get(); try @@ -117,6 +121,7 @@ public string CreateStorageVaryByKey(ResponseCachingContext context) for (var j = 0; j < headerValuesArray.Length; j++) { + ThrowIfContainsDelimiters(headerValuesArray[j]); builder.Append(headerValuesArray[j]); } } @@ -138,6 +143,8 @@ public string CreateStorageVaryByKey(ResponseCachingContext context) for (var i = 0; i < queryArray.Length; i++) { + ThrowIfContainsDelimiters(queryArray[i].Key); + builder.Append(KeyDelimiter) .AppendUpperInvariant(queryArray[i].Key) .Append('='); @@ -152,6 +159,7 @@ public string CreateStorageVaryByKey(ResponseCachingContext context) builder.Append(KeySubDelimiter); } + ThrowIfContainsDelimiters(queryValueArray[j]); builder.Append(queryValueArray[j]); } } @@ -176,6 +184,7 @@ public string CreateStorageVaryByKey(ResponseCachingContext context) builder.Append(KeySubDelimiter); } + ThrowIfContainsDelimiters(queryValueArray[j]); builder.Append(queryValueArray[j]); } } @@ -190,6 +199,14 @@ public string CreateStorageVaryByKey(ResponseCachingContext context) } } + internal static void ThrowIfContainsDelimiters(string? value) + { + if (!string.IsNullOrEmpty(value) && value.AsSpan().IndexOfAny(KeyDelimiter, KeySubDelimiter) >= 0) + { + throw new CacheKeyDelimiterException(); + } + } + private sealed class QueryKeyComparer : IComparer> { private readonly StringComparer _stringComparer; diff --git a/src/Middleware/ResponseCaching/src/ResponseCachingMiddleware.cs b/src/Middleware/ResponseCaching/src/ResponseCachingMiddleware.cs index 8131e512e7d3..6b9fc883c9cd 100644 --- a/src/Middleware/ResponseCaching/src/ResponseCachingMiddleware.cs +++ b/src/Middleware/ResponseCaching/src/ResponseCachingMiddleware.cs @@ -203,7 +203,16 @@ internal async Task TryServeCachedResponseAsync(ResponseCachingContext con internal async Task TryServeFromCacheAsync(ResponseCachingContext context) { - context.BaseKey = _keyProvider.CreateBaseKey(context); + try + { + context.BaseKey = _keyProvider.CreateBaseKey(context); + } + catch (CacheKeyDelimiterException) + { + _logger.RequestContainsInvalidCacheSymbols(); + return false; + } + var cacheEntry = _cache.Get(context.BaseKey); if (cacheEntry is CachedVaryByRules cachedVaryByRules) @@ -211,13 +220,21 @@ internal async Task TryServeFromCacheAsync(ResponseCachingContext context) // Request contains vary rules, recompute key(s) and try again context.CachedVaryByRules = cachedVaryByRules; - foreach (var varyKey in _keyProvider.CreateLookupVaryByKeys(context)) + try { - if (await TryServeCachedResponseAsync(context, _cache.Get(varyKey))) + foreach (var varyKey in _keyProvider.CreateLookupVaryByKeys(context)) { - return true; + if (await TryServeCachedResponseAsync(context, _cache.Get(varyKey))) + { + return true; + } } } + catch (CacheKeyDelimiterException) + { + _logger.RequestContainsInvalidCacheSymbols(); + return false; + } } else { @@ -263,7 +280,17 @@ private bool OnFinalizeCacheHeaders(ResponseCachingContext context) // Generate a base key if none exist if (string.IsNullOrEmpty(context.BaseKey)) { - context.BaseKey = _keyProvider.CreateBaseKey(context); + try + { + context.BaseKey = _keyProvider.CreateBaseKey(context); + } + catch (CacheKeyDelimiterException) + { + _logger.RequestContainsInvalidCacheSymbols(); + context.ShouldCacheResponse = false; + context.ResponseCachingStream.DisableBuffering(); + return false; + } } // Check if any vary rules exist @@ -290,7 +317,17 @@ private bool OnFinalizeCacheHeaders(ResponseCachingContext context) _logger.VaryByRulesUpdated(normalizedVaryHeaders.ToString(), normalizedVaryQueryKeys.ToString()); storeVaryByEntry = true; - context.StorageVaryKey = _keyProvider.CreateStorageVaryByKey(context); + try + { + context.StorageVaryKey = _keyProvider.CreateStorageVaryByKey(context); + } + catch (CacheKeyDelimiterException) + { + _logger.RequestContainsInvalidCacheSymbols(); + context.ShouldCacheResponse = false; + context.ResponseCachingStream.DisableBuffering(); + return false; + } } // Ensure date header is set diff --git a/src/Middleware/ResponseCaching/test/ResponseCachingKeyProviderTests.cs b/src/Middleware/ResponseCaching/test/ResponseCachingKeyProviderTests.cs index 1afb15dbd0e4..cc06219f0d6e 100644 --- a/src/Middleware/ResponseCaching/test/ResponseCachingKeyProviderTests.cs +++ b/src/Middleware/ResponseCaching/test/ResponseCachingKeyProviderTests.cs @@ -211,4 +211,106 @@ public void ResponseCachingKeyProvider_CreateStorageVaryKey_IncludesListedHeader Assert.Equal($"{context.CachedVaryByRules.VaryByKeyPrefix}{KeyDelimiter}H{KeyDelimiter}HeaderA=ValueA{KeyDelimiter}HeaderC={KeyDelimiter}Q{KeyDelimiter}QueryA=ValueA{KeyDelimiter}QueryC=", cacheKeyProvider.CreateStorageVaryByKey(context)); } + + [Theory] + [InlineData("\u001e")] + [InlineData("\u001f")] + [InlineData("before\u001eafter")] + [InlineData("before\u001fafter")] + public void ThrowIfContainsDelimiters_ThrowsForValuesWithDelimiters(string value) + { + Assert.Throws(() => ResponseCachingKeyProvider.ThrowIfContainsDelimiters(value)); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + [InlineData("normalvalue")] + [InlineData("/path/to/resource")] + [InlineData("value with spaces")] + public void ThrowIfContainsDelimiters_DoesNotThrowForSafeValues(string value) + { + ResponseCachingKeyProvider.ThrowIfContainsDelimiters(value); + } + + [Fact] + public void CreateBaseKey_Throws_IfPathContainsDelimiter() + { + var cacheKeyProvider = TestUtils.CreateTestKeyProvider(); + var context = TestUtils.CreateTestContext(); + context.HttpContext.Request.Method = HttpMethods.Get; + context.HttpContext.Request.Path = "/path\u001einjected"; + + Assert.Throws(() => cacheKeyProvider.CreateBaseKey(context)); + } + + [Fact] + public void CreateBaseKey_Throws_IfPathBaseContainsDelimiter() + { + var cacheKeyProvider = TestUtils.CreateTestKeyProvider(); + var context = TestUtils.CreateTestContext(); + context.HttpContext.Request.Method = HttpMethods.Get; + context.HttpContext.Request.PathBase = "/base\u001finjected"; + + Assert.Throws(() => cacheKeyProvider.CreateBaseKey(context)); + } + + [Fact] + public void CreateStorageVaryByKey_Throws_IfHeaderValueContainsDelimiter() + { + var cacheKeyProvider = TestUtils.CreateTestKeyProvider(); + var context = TestUtils.CreateTestContext(); + context.HttpContext.Request.Headers["HeaderA"] = "Value\u001eInjected"; + context.CachedVaryByRules = new CachedVaryByRules() + { + Headers = new string[] { "HeaderA" } + }; + + Assert.Throws(() => cacheKeyProvider.CreateStorageVaryByKey(context)); + } + + [Fact] + public void CreateStorageVaryByKey_Throws_IfQueryKeyContainsDelimiter_WildcardMode() + { + var cacheKeyProvider = TestUtils.CreateTestKeyProvider(); + var context = TestUtils.CreateTestContext(); + context.HttpContext.Request.QueryString = new QueryString("?normal=value&injected\u001ekey=value"); + context.CachedVaryByRules = new CachedVaryByRules() + { + VaryByKeyPrefix = FastGuid.NewGuid().IdString, + QueryKeys = new string[] { "*" } + }; + + Assert.Throws(() => cacheKeyProvider.CreateStorageVaryByKey(context)); + } + + [Fact] + public void CreateStorageVaryByKey_Throws_IfQueryValueContainsDelimiter_WildcardMode() + { + var cacheKeyProvider = TestUtils.CreateTestKeyProvider(); + var context = TestUtils.CreateTestContext(); + context.HttpContext.Request.QueryString = new QueryString("?key=value\u001einjected"); + context.CachedVaryByRules = new CachedVaryByRules() + { + VaryByKeyPrefix = FastGuid.NewGuid().IdString, + QueryKeys = new string[] { "*" } + }; + + Assert.Throws(() => cacheKeyProvider.CreateStorageVaryByKey(context)); + } + + [Fact] + public void CreateStorageVaryByKey_Throws_IfQueryValueContainsDelimiter_ExplicitMode() + { + var cacheKeyProvider = TestUtils.CreateTestKeyProvider(); + var context = TestUtils.CreateTestContext(); + context.HttpContext.Request.QueryString = new QueryString("?QueryA=value\u001finjected"); + context.CachedVaryByRules = new CachedVaryByRules() + { + VaryByKeyPrefix = FastGuid.NewGuid().IdString, + QueryKeys = new string[] { "QueryA" } + }; + + Assert.Throws(() => cacheKeyProvider.CreateStorageVaryByKey(context)); + } } diff --git a/src/Middleware/ResponseCaching/test/ResponseCachingMiddlewareTests.cs b/src/Middleware/ResponseCaching/test/ResponseCachingMiddlewareTests.cs index c0ea3b50c595..dd3b29b00ba4 100644 --- a/src/Middleware/ResponseCaching/test/ResponseCachingMiddlewareTests.cs +++ b/src/Middleware/ResponseCaching/test/ResponseCachingMiddlewareTests.cs @@ -922,6 +922,104 @@ public async Task Invoke_AddsResponseCachingFeature_Always(bool allowResponseCac Assert.True(responseCachingFeatureAdded); } + [Fact] + public async Task TryServeFromCacheAsync_ReturnsFalse_IfBaseKeyContainsDelimiters() + { + var sink = new TestSink(); + var middleware = TestUtils.CreateTestMiddleware(testSink: sink); + var context = TestUtils.CreateTestContext(); + context.HttpContext.Request.Path = "/path\u001einjected"; + + Assert.False(await middleware.TryServeFromCacheAsync(context)); + TestUtils.AssertLoggedMessages( + sink.Writes, + LoggedMessage.RequestContainsInvalidCacheSymbols); + } + + [Fact] + public async Task TryServeFromCacheAsync_ReturnsFalse_IfVaryByKeyContainsDelimiters() + { + var cache = new TestResponseCache(); + var sink = new TestSink(); + // Use real key provider so CreateLookupVaryByKeys invokes validation + var middleware = TestUtils.CreateTestMiddleware(testSink: sink, cache: cache); + var context = TestUtils.CreateTestContext(); + context.HttpContext.Request.Method = HttpMethods.Get; + context.HttpContext.Request.QueryString = new QueryString("?key=value\u001einjected"); + + // Pre-set a base key so CreateBaseKey succeeds, then set up vary rules in cache + // so the middleware will call CreateLookupVaryByKeys -> CreateStorageVaryByKey + var baseKey = $"GET{(char)0x1e}{(char)0x1e}"; + context.BaseKey = baseKey; + var varyByRules = new CachedVaryByRules() + { + VaryByKeyPrefix = FastGuid.NewGuid().IdString, + QueryKeys = new string[] { "*" } + }; + cache.Set(baseKey, varyByRules, TimeSpan.Zero); + + Assert.False(await middleware.TryServeFromCacheAsync(context)); + TestUtils.AssertLoggedMessages( + sink.Writes, + LoggedMessage.RequestContainsInvalidCacheSymbols); + } + + [Fact] + public void FinalizeCacheHeaders_ReturnsFalse_IfBaseKeyContainsDelimiters() + { + var sink = new TestSink(); + var middleware = TestUtils.CreateTestMiddleware(testSink: sink, policyProvider: new ResponseCachingPolicyProvider()); + var context = TestUtils.CreateTestContext(); + context.HttpContext.Request.Path = "/path\u001einjected"; + context.HttpContext.Response.Headers.CacheControl = new CacheControlHeaderValue() + { + Public = true + }.ToString(); + + middleware.ShimResponseStream(context); + middleware.FinalizeCacheHeaders(context); + + Assert.False(context.ShouldCacheResponse); + Assert.False(context.ResponseCachingStream.BufferingEnabled); + TestUtils.AssertLoggedMessages( + sink.Writes, + LoggedMessage.RequestContainsInvalidCacheSymbols); + } + + [Fact] + public void FinalizeCacheHeaders_ReturnsFalse_IfStorageVaryKeyContainsDelimiters() + { + var sink = new TestSink(); + var middleware = TestUtils.CreateTestMiddleware(testSink: sink, policyProvider: new ResponseCachingPolicyProvider()); + var context = TestUtils.CreateTestContext(); + context.HttpContext.Request.QueryString = new QueryString("?key=value\u001einjected"); + context.HttpContext.Response.Headers.CacheControl = new CacheControlHeaderValue() + { + Public = true + }.ToString(); + context.HttpContext.Features.Set(new ResponseCachingFeature() + { + VaryByQueryKeys = new string[] { "*" } + }); + // Pre-set BaseKey so CreateBaseKey is skipped (it would also throw) + context.BaseKey = "SomeBaseKey"; + + // ShimResponseStream also calls AddResponseCachingFeature, so remove ours first + context.HttpContext.Features.Set(null); + middleware.ShimResponseStream(context); + // Now re-set VaryByQueryKeys on the feature that ShimResponseStream added + context.HttpContext.Features.Get()!.VaryByQueryKeys = new string[] { "*" }; + + middleware.FinalizeCacheHeaders(context); + + Assert.False(context.ShouldCacheResponse); + Assert.False(context.ResponseCachingStream.BufferingEnabled); + TestUtils.AssertLoggedMessages( + sink.Writes, + LoggedMessage.VaryByRulesUpdated, + LoggedMessage.RequestContainsInvalidCacheSymbols); + } + [Fact] public void GetOrderCasingNormalizedStringValues_NormalizesCasingToUpper() { diff --git a/src/Middleware/ResponseCaching/test/TestUtils.cs b/src/Middleware/ResponseCaching/test/TestUtils.cs index a3a64267e550..26844a8d99d0 100644 --- a/src/Middleware/ResponseCaching/test/TestUtils.cs +++ b/src/Middleware/ResponseCaching/test/TestUtils.cs @@ -301,6 +301,7 @@ internal class LoggedMessage internal static LoggedMessage ResponseNotCached => new LoggedMessage(27, LogLevel.Information); internal static LoggedMessage ResponseContentLengthMismatchNotCached => new LoggedMessage(28, LogLevel.Warning); internal static LoggedMessage ExpirationInfiniteMaxStaleSatisfied => new LoggedMessage(29, LogLevel.Debug); + internal static LoggedMessage RequestContainsInvalidCacheSymbols => new LoggedMessage(30, LogLevel.Warning); private LoggedMessage(int evenId, LogLevel logLevel) { From b0b333dabed23ddbe528fd82815973735295b651 Mon Sep 17 00:00:00 2001 From: Dmitrii Korolev Date: Tue, 14 Apr 2026 16:58:29 +0000 Subject: [PATCH 10/23] Merged PR 60023: [release/9.0] fix(Security/Authentication): include scheme in certificate cache Storing scheme as a string in `HttpContext.Items` under `__CertificateAuthScheme`, which is used as part of cache key now. --- .../src/CertificateAuthenticationHandler.cs | 3 + .../src/CertificateValidationCache.cs | 28 +++- .../Authentication/test/CertificateTests.cs | 125 ++++++++++++++++++ 3 files changed, 152 insertions(+), 4 deletions(-) diff --git a/src/Security/Authentication/Certificate/src/CertificateAuthenticationHandler.cs b/src/Security/Authentication/Certificate/src/CertificateAuthenticationHandler.cs index de74d6e5bf7c..98d647bc558b 100644 --- a/src/Security/Authentication/Certificate/src/CertificateAuthenticationHandler.cs +++ b/src/Security/Authentication/Certificate/src/CertificateAuthenticationHandler.cs @@ -13,6 +13,8 @@ namespace Microsoft.AspNetCore.Authentication.Certificate; internal sealed class CertificateAuthenticationHandler : AuthenticationHandler { + internal const string CertificateSchemeCacheKeyItem = "__CertificateAuthScheme"; + private static readonly Oid ClientCertificateOid = new Oid("1.3.6.1.5.5.7.3.2"); private ICertificateValidationCache? _cache; @@ -67,6 +69,7 @@ protected override async Task HandleAuthenticateAsync() if (_cache != null) { + Context.Items[CertificateSchemeCacheKeyItem] = Scheme.Name; var cacheHit = _cache.Get(Context, clientCertificate); if (cacheHit != null) { diff --git a/src/Security/Authentication/Certificate/src/CertificateValidationCache.cs b/src/Security/Authentication/Certificate/src/CertificateValidationCache.cs index 432a0d2e47bb..27252d8506f0 100644 --- a/src/Security/Authentication/Certificate/src/CertificateValidationCache.cs +++ b/src/Security/Authentication/Certificate/src/CertificateValidationCache.cs @@ -39,7 +39,14 @@ public CertificateValidationCache(IOptions op /// The certificate. /// the public AuthenticateResult? Get(HttpContext context, X509Certificate2 certificate) - => _cache.Get(ComputeKey(certificate))?.Clone(); + { + var key = ComputeKey(context, certificate); + if (key is null) + { + return null; + } + return _cache.Get(key)?.Clone(); + } /// /// Store a for the connection and certificate @@ -49,6 +56,12 @@ public CertificateValidationCache(IOptions op /// the public void Put(HttpContext context, X509Certificate2 certificate, AuthenticateResult result) { + var key = ComputeKey(context, certificate); + if (key is null) + { + return; + } + // Never cache longer than 30 minutes var absoluteExpiration = _timeProvider.GetUtcNow().Add(TimeSpan.FromMinutes(30)); var notAfter = certificate.NotAfter.ToUniversalTime(); @@ -56,14 +69,21 @@ public void Put(HttpContext context, X509Certificate2 certificate, AuthenticateR { absoluteExpiration = notAfter; } - _cache.Set(ComputeKey(certificate), result.Clone(), new MemoryCacheEntryOptions() + _cache.Set(key, result.Clone(), new MemoryCacheEntryOptions() .SetSize(1) .SetSlidingExpiration(_options.CacheEntryExpiration) .SetAbsoluteExpiration(absoluteExpiration)); } - private static string ComputeKey(X509Certificate2 certificate) - => certificate.GetCertHashString(HashAlgorithmName.SHA256); + private static string? ComputeKey(HttpContext context, X509Certificate2 certificate) + { + if (context.Items.TryGetValue(CertificateAuthenticationHandler.CertificateSchemeCacheKeyItem, out var schemeObj) + && schemeObj is string schemeName) + { + return $"{schemeName}:{certificate.GetCertHashString(HashAlgorithmName.SHA256)}"; + } + return null; + } private sealed class CachingClock : Extensions.Internal.ISystemClock { diff --git a/src/Security/Authentication/test/CertificateTests.cs b/src/Security/Authentication/test/CertificateTests.cs index 5e6d73eeca94..80a567d2c5ea 100644 --- a/src/Security/Authentication/test/CertificateTests.cs +++ b/src/Security/Authentication/test/CertificateTests.cs @@ -935,5 +935,130 @@ private static async Task CreateHost( return Task.CompletedTask; } }; + + [Fact] + public async Task VerifyCacheIsIsolatedAcrossSchemes() + { + var scheme1ValidationCount = 0; + var scheme2ValidationCount = 0; + + using var host = new HostBuilder() + .ConfigureWebHost(builder => + builder.UseTestServer() + .Configure(app => + { + app.Use((context, next) => + { + context.Connection.ClientCertificate = Certificates.SelfSignedValidWithNoEku; + return next(context); + }); + + app.UseAuthentication(); + + app.Run(async context => + { + var schemeName = context.Request.Query["scheme"].ToString(); + var result = await context.AuthenticateAsync(schemeName); + + if (result.Succeeded) + { + context.Response.StatusCode = (int)HttpStatusCode.OK; + context.Response.ContentType = "text/plain"; + await context.Response.WriteAsync("Authenticated"); + } + else + { + context.Response.StatusCode = (int)HttpStatusCode.Forbidden; + context.Response.ContentType = "text/plain"; + await context.Response.WriteAsync("Denied"); + } + }); + }) + .ConfigureServices(services => + { + services.AddAuthentication() + .AddCertificate("scheme1", options => + { + options.AllowedCertificateTypes = CertificateTypes.SelfSigned; + options.Events = new CertificateAuthenticationEvents + { + OnCertificateValidated = context => + { + scheme1ValidationCount++; + context.Principal = new ClaimsPrincipal( + new ClaimsIdentity( + [new Claim(ClaimTypes.Name, "scheme1User")], + context.Scheme.Name)); + context.Success(); + return Task.CompletedTask; + } + }; + }) + .AddCertificate("scheme2", options => + { + options.AllowedCertificateTypes = CertificateTypes.SelfSigned; + options.Events = new CertificateAuthenticationEvents + { + OnCertificateValidated = context => + { + scheme2ValidationCount++; + context.Fail("Certificate does not meet scheme2 requirements"); + return Task.CompletedTask; + } + }; + }) + .AddCertificateCache(); + })) + .Build(); + + await host.StartAsync(); + + using var server = host.GetTestServer(); + var client = server.CreateClient(); + + // 1. Authenticate with the scheme1 — should succeed and cache + var response1 = await client.GetAsync("https://example.com/?scheme=scheme1"); + Assert.Equal(HttpStatusCode.OK, response1.StatusCode); + Assert.Equal(1, scheme1ValidationCount); + + // 2. Authenticate with the scheme2 — must NOT reuse the scheme1's cached success + var response2 = await client.GetAsync("https://example.com/?scheme=scheme2"); + Assert.Equal(HttpStatusCode.Forbidden, response2.StatusCode); + Assert.Equal(1, scheme2ValidationCount); + + // 3. Authenticate with the scheme1 again — should use the cache (no re-validation) + var response3 = await client.GetAsync("https://example.com/?scheme=scheme1"); + Assert.Equal(HttpStatusCode.OK, response3.StatusCode); + Assert.Equal(1, scheme1ValidationCount); // Still 1 — served from cache + } + + [Fact] + public void VerifyCacheNoOpsWithoutSchemeInHttpContextItems() + { + var cache = new CertificateValidationCache(Options.Create(new CertificateValidationCacheOptions())); + var certificate = Certificates.SelfSignedValidWithNoEku; + + var httpContext = new DefaultHttpContext(); + // Do NOT set httpContext.Items[CertificateAuthenticationHandler.CertificateSchemeCacheKeyItem] + + // Put should no-op (no scheme = no cache key) + var successResult = AuthenticateResult.Success( + new AuthenticationTicket( + new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, "test") }, "test")), + "test")); + cache.Put(httpContext, certificate, successResult); + + // Get should return null even after Put + var cached = cache.Get(httpContext, certificate); + Assert.Null(cached); + + // Now set the scheme item — Put and Get should work + httpContext.Items[CertificateAuthenticationHandler.CertificateSchemeCacheKeyItem] = "MyScheme"; + cache.Put(httpContext, certificate, successResult); + + var cachedWithScheme = cache.Get(httpContext, certificate); + Assert.NotNull(cachedWithScheme); + Assert.True(cachedWithScheme.Succeeded); + } } From adecba1f18a158a07cf17cbf589d4897f041f967 Mon Sep 17 00:00:00 2001 From: DotNet-Bot Date: Tue, 14 Apr 2026 21:49:47 +0000 Subject: [PATCH 11/23] Update dependencies from https://dev.azure.com/dnceng/internal/_git/dotnet-runtime build 20260414.12 On relative base path root Microsoft.Bcl.AsyncInterfaces , Microsoft.Bcl.TimeProvider , Microsoft.Extensions.Caching.Abstractions , Microsoft.Extensions.Caching.Memory , Microsoft.Extensions.Configuration , Microsoft.Extensions.Configuration.Abstractions , Microsoft.Extensions.Configuration.Binder , Microsoft.Extensions.Configuration.CommandLine , Microsoft.Extensions.Configuration.EnvironmentVariables , Microsoft.Extensions.Configuration.FileExtensions , Microsoft.Extensions.Configuration.Ini , Microsoft.Extensions.Configuration.Json , Microsoft.Extensions.Configuration.UserSecrets , Microsoft.Extensions.Configuration.Xml , Microsoft.Extensions.DependencyInjection , Microsoft.Extensions.DependencyInjection.Abstractions , Microsoft.Extensions.DependencyModel , Microsoft.Extensions.Diagnostics , Microsoft.Extensions.Diagnostics.Abstractions , Microsoft.Extensions.FileProviders.Abstractions , Microsoft.Extensions.FileProviders.Composite , Microsoft.Extensions.FileProviders.Physical , Microsoft.Extensions.FileSystemGlobbing , Microsoft.Extensions.Hosting , Microsoft.Extensions.Hosting.Abstractions , Microsoft.Extensions.Http , Microsoft.Extensions.Logging , Microsoft.Extensions.Logging.Abstractions , Microsoft.Extensions.Logging.Configuration , Microsoft.Extensions.Logging.Console , Microsoft.Extensions.Logging.Debug , Microsoft.Extensions.Logging.EventLog , Microsoft.Extensions.Logging.EventSource , Microsoft.Extensions.Logging.TraceSource , Microsoft.Extensions.Options , Microsoft.Extensions.Options.ConfigurationExtensions , Microsoft.Extensions.Options.DataAnnotations , Microsoft.Extensions.Primitives , Microsoft.NET.Runtime.MonoAOTCompiler.Task , Microsoft.NET.Runtime.WebAssembly.Sdk , Microsoft.NETCore.App.Ref , Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.browser-wasm , Microsoft.NETCore.App.Runtime.win-x64 , System.Collections.Immutable , System.Composition , System.Configuration.ConfigurationManager , System.Diagnostics.DiagnosticSource , System.Diagnostics.EventLog , System.Diagnostics.PerformanceCounter , System.DirectoryServices.Protocols , System.IO.Hashing , System.IO.Pipelines , System.Net.Http.Json , System.Net.Http.WinHttpHandler , System.Net.ServerSentEvents , System.Reflection.Metadata , System.Resources.Extensions , System.Runtime.Caching , System.Security.Cryptography.Pkcs , System.Security.Cryptography.Xml , System.Security.Permissions , System.ServiceProcess.ServiceController , System.Text.Encodings.Web , System.Text.Json , System.Threading.AccessControl , System.Threading.Channels , System.Threading.RateLimiting From Version 9.0.15 -> To Version 9.0.16 Microsoft.Extensions.HostFactoryResolver.Sources , Microsoft.Internal.Runtime.AspNetCore.Transport , Microsoft.NETCore.BrowserDebugHost.Transport , Microsoft.NETCore.Platforms , Microsoft.SourceBuild.Intermediate.runtime.linux-x64 From Version 9.0.15-servicing.26175.22 -> To Version 9.0.16-servicing.26214.12 --- NuGet.config | 4 +- eng/Version.Details.xml | 154 ++++++++++++++++++++-------------------- eng/Versions.props | 10 +-- 3 files changed, 84 insertions(+), 84 deletions(-) diff --git a/NuGet.config b/NuGet.config index 96d04b90f88a..b2c833ca6d9c 100644 --- a/NuGet.config +++ b/NuGet.config @@ -6,7 +6,7 @@ - + @@ -35,7 +35,7 @@ - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index ff903f82dd15..c5b6a17b5867 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -44,268 +44,268 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://github.com/dotnet/xdt @@ -369,7 +369,7 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f @@ -380,9 +380,9 @@ - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 6f733b0760184aa039f85cab6ff1890ac6868169 + 8f651f380086316d7150bc300794e4f782983a5f https://github.com/dotnet/winforms diff --git a/eng/Versions.props b/eng/Versions.props index 3c0b075c584b..e88c1f84faaf 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -73,7 +73,7 @@ 9.0.16 9.0.16 9.0.16 - 9.0.16-servicing.26209.22 + 9.0.16-servicing.26214.12 9.0.16 9.0.16 9.0.16 @@ -94,7 +94,7 @@ 9.0.16 9.0.16 9.0.16 - 9.0.16-servicing.26209.22 + 9.0.16-servicing.26214.12 9.0.16 9.0.16 9.0.16 @@ -110,8 +110,8 @@ 9.0.16 9.0.16 9.0.16 - 9.0.16-servicing.26209.22 - 9.0.16-servicing.26209.22 + 9.0.16-servicing.26214.12 + 9.0.16-servicing.26214.12 9.0.16 9.0.16 9.0.16 @@ -133,7 +133,7 @@ 9.0.16 9.0.16 - 9.0.16-servicing.26209.22 + 9.0.16-servicing.26214.12 9.0.16 9.0.16 From 77e4936deeb0010a1878ba7115194234602df4c1 Mon Sep 17 00:00:00 2001 From: Javier Calvarro Nelson Date: Tue, 14 Apr 2026 23:03:25 +0000 Subject: [PATCH 12/23] Merged PR 59460: [Form binding] Fix parsing of malformed keys (net 9.0) `FormDataReader.ProcessFormKeys()` enters an infinite loop when a form key contains an opening `[` without a matching `]` (e.g., `customer[0`). The bug is caused by adding `startIndex` to the result of `IndexOf(']')` before checking for the `-1` sentinel, which prevents the `break` guard from ever firing when the `[` is at a non-zero position. The fix replaces `ProcessFormKeys()` entirely with a lazy per-prefix scan in `GetKeys()` that skips malformed keys via `continue`, extracts one bracket segment per key, and caps output at `MaxCollectionSize`. Additionally, `MaxCollectionSize` is now correctly forwarded from `FormDataMapperOptions` to `FormDataReader` in `HttpContextFormValueMapper`. --- .../src/FormMapping/FormDataReader.cs | 89 ++-- .../FormMapping/HttpContextFormValueMapper.cs | 3 +- .../test/Binding/FormDataMapperTests.cs | 471 ++++++++++++++++++ .../src/RequestDelegateFactory.cs | 6 + ...RequestDelegateFactoryTests.FormMapping.cs | 38 ++ 5 files changed, 558 insertions(+), 49 deletions(-) diff --git a/src/Components/Endpoints/src/FormMapping/FormDataReader.cs b/src/Components/Endpoints/src/FormMapping/FormDataReader.cs index 85c65e363e93..f142f0e9e003 100644 --- a/src/Components/Endpoints/src/FormMapping/FormDataReader.cs +++ b/src/Components/Endpoints/src/FormMapping/FormDataReader.cs @@ -7,6 +7,7 @@ using System.Globalization; using System.Runtime.CompilerServices; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.WebUtilities; using Microsoft.Extensions.Primitives; namespace Microsoft.AspNetCore.Components.Endpoints.FormMapping; @@ -23,7 +24,6 @@ internal struct FormDataReader : IDisposable // As an implementation detail, reuse FormKey for the values. // It's just a thin wrapper over ReadOnlyMemory that caches // the computed hash code. - private IReadOnlyDictionary>? _formDictionaryKeysByPrefix; private PrefixResolver _prefixResolver; @@ -48,6 +48,8 @@ public FormDataReader(IReadOnlyDictionary formCollection, public int MaxRecursionDepth { get; set; } = 64; + public int MaxCollectionSize { get; set; } = FormReader.DefaultValueCountLimit; + public Action? ErrorHandler { get; set; } public Action? AttachInstanceToErrorsHandler { get; set; } @@ -107,61 +109,52 @@ public void AttachInstanceToErrors(object value) internal FormKeyCollection GetKeys() { - if (_formDictionaryKeysByPrefix == null) - { - _formDictionaryKeysByPrefix = ProcessFormKeys(); - } + // Scan the input dictionary for keys matching the current prefix followed by a bracket segment. + // This avoids building a large upfront dictionary of all prefix→key mappings. + var prefix = _currentPrefixBuffer; + var result = new HashSet(); - if (_formDictionaryKeysByPrefix.TryGetValue(new FormKey(_currentPrefixBuffer), out var foundKeys)) + foreach (var kvp in _readOnlyMemoryKeys) { - return new FormKeyCollection(foundKeys); - } + var key = kvp.Key.Value; - return FormKeyCollection.Empty; - } + // The key must start with the current prefix (case-insensitive). + if (key.Length <= prefix.Length || + !key.Span[..prefix.Length].Equals(prefix.Span, StringComparison.OrdinalIgnoreCase)) + { + continue; + } - // Internal for testing purposes - internal IReadOnlyDictionary> ProcessFormKeys() - { - var keys = _readOnlyMemoryKeys.Keys; - var result = new Dictionary>(); - // We need to iterate over all the keys in the dictionary and process each key to split it into segments where - // the prefixes are string separated by . and the keys are enclosed in []. For example if the key is - // Customer.Orders[<>]BillingInfo.FirstName, then we need to split it into Customer.Orders, - // [<>] and BillingInfo.FirstName. We then, need to group all the keys by the prefix. So, for the - // above example, we will have an entry for the prefix Customer.Orders that will include [<>] as the - // key. - - foreach (var key in keys) - { - var startIndex = key.Value.Span.IndexOf('['); - while (startIndex >= 0) + // Immediately after the prefix, there must be a '['. + if (key.Span[prefix.Length] != '[') + { + continue; + } + + // Find the closing ']' after the '['. + var remaining = key[prefix.Length..]; + var closeIndex = remaining.Span[1..].IndexOf(']'); + if (closeIndex == -1) + { + // Malformed key — no closing bracket. Skip it. + continue; + } + + // Extract "[value]" (closeIndex is relative to position 1, so add 2 for the full segment). + var segment = remaining[..(closeIndex + 2)]; + result.Add(new FormKey(segment)); + + // Allow one extra item through so collection/dictionary binding can still detect overflow + // and report the existing max-size error instead of silently truncating the input. + if (result.Count > MaxCollectionSize) { - var endIndex = key.Value.Span[startIndex..].IndexOf(']') + startIndex; - if (endIndex == -1) - { - // Ignore malformed keys - break; - } - - var prefix = key.Value[..startIndex]; - var keyValue = key.Value[startIndex..(endIndex + 1)]; - if (result.TryGetValue(new FormKey(prefix), out var foundKeys)) - { - foundKeys.Add(new FormKey(keyValue)); - } - else - { - result.Add(new FormKey(prefix), new HashSet { new FormKey(keyValue) }); - } - - var nextOpenBracket = key.Value.Span[(endIndex + 1)..].IndexOf('['); - - startIndex = nextOpenBracket != -1 ? endIndex + 1 + nextOpenBracket : -1; + break; } } - return result; + return result.Count > 0 + ? new FormKeyCollection(result) + : FormKeyCollection.Empty; } // This only ever gets invoked if we have a recursive type. diff --git a/src/Components/Endpoints/src/FormMapping/HttpContextFormValueMapper.cs b/src/Components/Endpoints/src/FormMapping/HttpContextFormValueMapper.cs index db1e9af301cf..212bff678ba2 100644 --- a/src/Components/Endpoints/src/FormMapping/HttpContextFormValueMapper.cs +++ b/src/Components/Endpoints/src/FormMapping/HttpContextFormValueMapper.cs @@ -138,7 +138,8 @@ public override void Deserialize( ErrorHandler = context.OnError, AttachInstanceToErrorsHandler = context.MapErrorToContainer, MaxRecursionDepth = options.MaxRecursionDepth, - MaxErrorCount = options.MaxErrorCount + MaxErrorCount = options.MaxErrorCount, + MaxCollectionSize = options.MaxCollectionSize }; reader.PushPrefix(context.ParameterName); diff --git a/src/Components/Endpoints/test/Binding/FormDataMapperTests.cs b/src/Components/Endpoints/test/Binding/FormDataMapperTests.cs index 823c97143d9d..f7071d66f95c 100644 --- a/src/Components/Endpoints/test/Binding/FormDataMapperTests.cs +++ b/src/Components/Endpoints/test/Binding/FormDataMapperTests.cs @@ -1218,6 +1218,477 @@ public void Deserialize_SkipsElement_WhenFailsToParseKey() }); } + [Fact] + public void GetKeys_IgnoresMalformedKeysWithUnterminatedBracket() + { + // Arrange + var collection = new Dictionary() + { + ["customer[0"] = "10", + ["customer[1]"] = "11", + ["customer[2"] = "12", + }; + + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + reader.PushPrefix("customer"); + + // Act + var result = reader.GetKeys().Select(key => key.ToString()).ToArray(); + + // Assert + Assert.Equal(new[] { "[1]" }, result); + } + + [Theory] + [InlineData("prefix[", "prefix")] // unterminated [ at end + [InlineData("prefix[abc", "prefix")] // unterminated [ with content + [InlineData("prefix[value[[", "prefix")] // double [[ at end, all unterminated + [InlineData("[", "")] // key is just [ + [InlineData("[[", "prefix")] // doubled open brackets + [InlineData("]", "prefix")] // only closing bracket + [InlineData("]value[", "prefix")] // reversed brackets surrounding value + [InlineData("prefix][", "prefix")] // reversed brackets at boundary + [InlineData("[[value]", "prefix")] // double [[ at start, different prefix + public void GetKeys_MalformedKeyIgnored_ValidKeyPreserved(string malformedKey, string prefix) + { + var validKey = prefix.Length > 0 ? $"{prefix}[ok]" : "[ok]"; + var collection = new Dictionary() + { + [malformedKey] = "v1", + [validKey] = "v2", + }; + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + if (prefix.Length > 0) + { + reader.PushPrefix(prefix); + } + + var result = reader.GetKeys().Select(k => k.ToString()).ToArray(); + + Assert.Equal(new[] { "[ok]" }, result); + } + + [Theory] + [InlineData("prefix[]", "prefix", "[]")] // empty bracket pair + [InlineData("prefix[[value]", "prefix", "[[value]")] // double [[ in middle + [InlineData("a[b.c]", "a", "[b.c]")] // dots inside brackets + [InlineData("a[ ]", "a", "[ ]")] // whitespace inside brackets + [InlineData("prefix[val]]", "prefix", "[val]")] // double ]] at end + [InlineData("prefix[value][", "prefix", "[value]")] // valid then unterminated [ + [InlineData("a[b[c]d]", "a", "[b[c]")] // nested brackets + [InlineData("]]prefix[ok]", "]]prefix", "[ok]")] // double ]] at start of key + [InlineData("prefix[val]]rest[ok]", "prefix", "[val]")] // double ]] in middle + [InlineData("prefix[[a][b]", "prefix", "[[a]")] // double [[ with valid segment after + [InlineData("prefix[a]][b]", "prefix", "[a]")] // double ]] between segments + [InlineData("prefix[a][b", "prefix", "[a]")] // valid then unterminated (partial) + [InlineData("prefix[a]suffix[b", "prefix", "[a]")] // valid then unterminated in suffix + [InlineData("][value][", "]", "[value]")] // reversed ] at start + [InlineData("prefix][value][", "prefix]", "[value]")] // reversed ] in middle + [InlineData("prefix][a][b][", "prefix]", "[a]")] // reversed ] with multiple segments + [InlineData("a[x][y]", "a", "[x]")] // adjacent brackets — first + [InlineData("a[x][y]", "a[x]", "[y]")] // adjacent brackets — second (nested) + [InlineData("prefix[]]", "prefix", "[]")] // extra ] after empty pair + public void GetKeys_ExtractsExpectedKey(string formKey, string prefix, string expectedKey) + { + var collection = new Dictionary() + { + [formKey] = "v1", + }; + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + if (prefix.Length > 0) + { + reader.PushPrefix(prefix); + } + + var result = reader.GetKeys().Select(k => k.ToString()).ToArray(); + + Assert.Contains(expectedKey, result); + } + + [Fact] + public void GetKeys_LongRunOfOpenBrackets_NoHang() + { + var malformedKey = new string('[', 10000); + var collection = new Dictionary() + { + [malformedKey] = "v1", + ["prefix[ok]"] = "v2", + }; + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + reader.PushPrefix("prefix"); + + var result = reader.GetKeys().Select(k => k.ToString()).ToArray(); + + Assert.Equal(new[] { "[ok]" }, result); + } + + [Fact] + public void GetKeys_ManyValidSegments() + { + var sb = new StringBuilder(); + sb.Append("root"); + for (var i = 0; i < 64; i++) + { + sb.Append(CultureInfo.InvariantCulture, $"[{i}]"); + } + var collection = new Dictionary() + { + [sb.ToString()] = "v1", + }; + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + reader.PushPrefix("root"); + + // Only [0] is directly under "root"; [1] is under "root[0]", etc. + var result = reader.GetKeys().Select(k => k.ToString()).ToArray(); + + Assert.Contains("[0]", result); + } + + [Fact] + public void GetKeys_ManyKeysAllWellFormed() + { + var collection = new Dictionary(); + for (var i = 0; i < 1000; i++) + { + collection[$"prefix[{i}]"] = $"v{i}"; + } + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + reader.PushPrefix("prefix"); + + var result = reader.GetKeys().Select(k => k.ToString()).ToArray(); + + Assert.Equal(1000, result.Length); + } + + [Fact] + public void GetKeys_AllowsOneExtraItemForOverflowDetection() + { + var collection = new Dictionary(); + for (var i = 0; i < 200; i++) + { + collection[$"prefix[{i}]"] = $"v{i}"; + } + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + reader.PushPrefix("prefix"); + reader.MaxCollectionSize = 50; + + var result = reader.GetKeys().Select(k => k.ToString()).ToArray(); + + Assert.Equal(51, result.Length); + } + + [Fact] + public void Deserialize_Dictionary_WhenReaderMaxCollectionSizeIsSet_StillReportsOverflow() + { + var data = new Dictionary(Enumerable.Range(0, 3) + .Select(i => new KeyValuePair( + $"[{i.ToString(CultureInfo.InvariantCulture)}]", + (i + 10).ToString(CultureInfo.InvariantCulture)))); + + var reader = CreateFormDataReader(data, CultureInfo.InvariantCulture); + var errors = new List(); + reader.ErrorHandler = (key, message, attemptedValue) => + { + errors.Add(new FormDataMappingError(key, message, attemptedValue)); + }; + reader.MaxCollectionSize = 2; + + var options = new FormDataMapperOptions + { + MaxCollectionSize = 2 + }; + + var result = FormDataMapper.Map>(reader, options); + + Assert.Equal(2, result.Count); + var error = Assert.Single(errors); + Assert.Equal("", error.Key); + Assert.Equal("The number of elements in the dictionary exceeded the maximum number of '2' elements allowed.", error.Message.ToString(reader.Culture)); + Assert.Null(error.Value); + } + + [Fact] + public void GetKeys_ManyMalformedKeys_NoHang() + { + var collection = new Dictionary(); + for (var i = 0; i < 100; i++) + { + collection[$"prefix[{i}"] = $"v{i}"; + } + collection["prefix[ok]"] = "valid"; + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + reader.PushPrefix("prefix"); + + var result = reader.GetKeys().Select(k => k.ToString()).ToArray(); + + Assert.Equal(new[] { "[ok]" }, result); + } + + [Fact] + public void GetLastPrefixSegment_EmptyPrefix() + { + var collection = new Dictionary() { ["key"] = "v1" }; + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + + var result = reader.GetLastPrefixSegment(); + + Assert.Equal("", result); + } + + [Fact] + public void GetLastPrefixSegment_SimplePrefix() + { + var collection = new Dictionary() { ["key"] = "v1" }; + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + reader.PushPrefix("foo"); + + var result = reader.GetLastPrefixSegment(); + + Assert.Equal("foo", result); + } + + [Fact] + public void GetLastPrefixSegment_DottedPrefix() + { + var collection = new Dictionary() { ["key"] = "v1" }; + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + reader.PushPrefix("foo"); + reader.PushPrefix("bar"); + + var result = reader.GetLastPrefixSegment(); + + Assert.Equal("bar", result); + } + + [Fact] + public void GetLastPrefixSegment_BracketedPrefix() + { + var collection = new Dictionary() { ["key"] = "v1" }; + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + reader.PushPrefix("foo"); + reader.PushPrefix("[0]"); + + var result = reader.GetLastPrefixSegment(); + + Assert.Equal("0", result); + } + + [Fact] + public void TryGetValue_SingleValue_ReturnsValue() + { + var collection = new Dictionary() + { + ["key"] = "hello", + }; + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + reader.PushPrefix("key"); + + var found = reader.TryGetValue(out var value); + + Assert.True(found); + Assert.Equal("hello", value); + } + + [Fact] + public void TryGetValue_MultipleValues_ReturnsFirstValue() + { + var collection = new Dictionary() + { + ["key"] = new StringValues(new[] { "first", "second", "third" }), + }; + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + reader.PushPrefix("key"); + + var found = reader.TryGetValue(out var value); + + Assert.True(found); + Assert.Equal("first", value); + } + + [Fact] + public void TryGetValue_KeyNotFound_ReturnsFalse() + { + var collection = new Dictionary() + { + ["other"] = "hello", + }; + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + reader.PushPrefix("missing"); + + var found = reader.TryGetValue(out var value); + + Assert.False(found); + Assert.Null(value); + } + + [Fact] + public void CurrentPrefixExists_EmptyPrefix_WithKeys_ReturnsTrue() + { + var collection = new Dictionary() + { + ["key"] = "v1", + }; + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + + var result = reader.CurrentPrefixExists(); + + Assert.True(result); + } + + [Fact] + public void CurrentPrefixExists_EmptyPrefix_NoKeys_ReturnsFalse() + { + var collection = new Dictionary(); + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + + var result = reader.CurrentPrefixExists(); + + Assert.False(result); + } + + [Fact] + public void CurrentPrefixExists_MatchingPrefix_ReturnsTrue() + { + var collection = new Dictionary() + { + ["customer.name"] = "Alice", + ["customer.age"] = "30", + }; + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + reader.PushPrefix("customer"); + + var result = reader.CurrentPrefixExists(); + + Assert.True(result); + } + + [Fact] + public void CurrentPrefixExists_NoMatchingPrefix_ReturnsFalse() + { + var collection = new Dictionary() + { + ["other.name"] = "Alice", + }; + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + reader.PushPrefix("customer"); + + var result = reader.CurrentPrefixExists(); + + Assert.False(result); + } + + [Fact] + public void PushPrefix_ExceedingBufferLength_Throws() + { + var collection = new Dictionary() + { + ["key"] = "v1", + }; + var reader = new FormDataReader( + new Dictionary + { + [new FormKey("key".AsMemory())] = "v1" + }, + CultureInfo.InvariantCulture, + new char[20]); + + reader.PushPrefix("short"); + + Assert.ThrowsAny(() => reader.PushPrefix(new string('x', 100))); + } + + [Fact] + public void CurrentPrefixExists_BracketDelimitedKey_ReturnsTrue() + { + var collection = new Dictionary() + { + ["a[x]"] = "v1", + }; + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + reader.PushPrefix("a"); + + var result = reader.CurrentPrefixExists(); + + Assert.True(result); + } + + [Theory] + [InlineData("a[x]", "a")] + [InlineData("d[x].y", "d")] + [InlineData("d[x].y", "d[x]")] + [InlineData("d[x].y", "d[x].y")] + [InlineData("e.a.b[foo].bar", "e")] + [InlineData("e.a.b[foo].bar", "e.a.b")] + [InlineData("e.a.b[foo].bar", "e.a.b[foo]")] + [InlineData("e.a.b[foo].bar", "e.a.b[foo].bar")] + public void CurrentPrefixExists_DotAndBracketPrefixes_ReturnsTrue(string key, string prefix) + { + var collection = new Dictionary() + { + [key] = "v1", + }; + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + reader.PushPrefix(prefix); + + var result = reader.CurrentPrefixExists(); + + Assert.True(result); + } + + [Fact] + public void GetKeys_MixedDotAndBracketKeys_ExtractsOnlyBracketedKeys() + { + var collection = new Dictionary() + { + ["foo[0].name"] = "Alice", + ["foo.age"] = "30", + ["foo[1].name"] = "Bob", + }; + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + reader.PushPrefix("foo"); + + var result = reader.GetKeys().Select(k => k.ToString()).OrderBy(k => k).ToArray(); + + Assert.Equal(new[] { "[0]", "[1]" }, result); + } + + [Fact] + public void GetKeys_NestedDotBracketPrefix_ExtractsNestedKeys() + { + var collection = new Dictionary() + { + ["person[0].address[0].street"] = "Main St", + ["person[0].address[1].street"] = "Oak Ave", + ["person[0].address[1].zip"] = "12345", + }; + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + reader.PushPrefix("person[0].address"); + + var result = reader.GetKeys().Select(k => k.ToString()).OrderBy(k => k).ToArray(); + + Assert.Equal(new[] { "[0]", "[1]" }, result); + } + + [Fact] + public void GetKeys_EmptyPrefix_ExtractsBracketedRootKeys() + { + var collection = new Dictionary() + { + ["[0].name"] = "Alice", + ["[0].address.street"] = "Main St", + ["[item1].name"] = "Bob", + ["[item1].age"] = "30", + ["foo"] = "bar", + ["foo.baz"] = "qux", + }; + var reader = CreateFormDataReader(collection, CultureInfo.InvariantCulture); + + var result = reader.GetKeys().Select(k => k.ToString()).OrderBy(k => k).ToArray(); + + Assert.Contains("[0]", result); + Assert.Contains("[item1]", result); + } + private void CanDeserialize_Dictionary(TImplementation expected) where TDictionary : IDictionary where TImplementation : TDictionary diff --git a/src/Http/Http.Extensions/src/RequestDelegateFactory.cs b/src/Http/Http.Extensions/src/RequestDelegateFactory.cs index 159982900eda..5648fe9330e1 100644 --- a/src/Http/Http.Extensions/src/RequestDelegateFactory.cs +++ b/src/Http/Http.Extensions/src/RequestDelegateFactory.cs @@ -2149,6 +2149,10 @@ private static Expression BindComplexParameterFromFormItem( var setMaxRecursionDepthExpr = Expression.Assign( Expression.Property(formReader, nameof(FormDataReader.MaxRecursionDepth)), Expression.Constant(formDataMapperOptions.MaxRecursionDepth)); + // name_reader.MaxCollectionSize = formDataMapperOptions.MaxCollectionSize; + var setMaxCollectionSizeExpr = Expression.Assign( + Expression.Property(formReader, nameof(FormDataReader.MaxCollectionSize)), + Expression.Constant(formDataMapperOptions.MaxCollectionSize)); // FormDataMapper.Map(name_reader, FormDataMapperOptions); var invokeMapMethodExpr = Expression.Call( FormDataMapperMapMethod.MakeGenericMethod(parameter.ParameterType), @@ -2175,6 +2179,7 @@ private static Expression BindComplexParameterFromFormItem( // ProcessForm(context.Request.Form, form_dict, form_buffer); // name_reader = new FormDataReader(form_dict, CultureInfo.InvariantCulture, form_buffer.AsMemory(0, FormDataMapperOptions.MaxKeyBufferSize)); // name_reader.MaxRecursionDepth = formDataMapperOptions.MaxRecursionDepth; + // name_reader.MaxCollectionSize = formDataMapperOptions.MaxCollectionSize; // name_local = FormDataMapper.Map(name_reader, FormDataMapperOptions); // } // catch (FormDataMappingException e) @@ -2197,6 +2202,7 @@ private static Expression BindComplexParameterFromFormItem( processFormExpr, initializeReaderExpr, setMaxRecursionDepthExpr, + setMaxCollectionSizeExpr, Expression.Assign(formArgument, invokeMapMethodExpr)), conditionalReturnBufferExpr, Expression.Catch(formDataMappingException, Expression.Block( diff --git a/src/Http/Http.Extensions/test/RequestDelegateFactoryTests.FormMapping.cs b/src/Http/Http.Extensions/test/RequestDelegateFactoryTests.FormMapping.cs index 31e2af50a478..0c3f4f360290 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateFactoryTests.FormMapping.cs +++ b/src/Http/Http.Extensions/test/RequestDelegateFactoryTests.FormMapping.cs @@ -61,6 +61,44 @@ static void TestAction([FromForm] Dictionary args) { } Assert.Equal("The number of elements in the dictionary exceeded the maximum number of '2' elements allowed.", exception.Message); } + [Fact] + public async Task SupportsFormMappingOptionsInMetadata_PropagatesMaxCollectionSizeToReader() + { + // Arrange + static void TestAction([FromForm] Dictionary args) { } + var options = new RequestDelegateFactoryOptions + { + EndpointBuilder = CreateEndpointBuilder(new List() + { + new FormMappingOptionsMetadata(maxCollectionSize: 2) + }), + ThrowOnBadRequest = true + }; + var metadataResult = new RequestDelegateMetadataResult { EndpointMetadata = new List() }; + var httpContext = CreateHttpContext(); + httpContext.Request.Form = new FormCollection(new Dictionary + { + { + "[name1]", "value1" + }, + { + "[name2]", "value2" + }, + { + "[name3]", "value3" + } + }); + + var factoryResult = RequestDelegateFactory.Create(TestAction, options, metadataResult); + var requestDelegate = factoryResult.RequestDelegate; + + // Act + var exception = await Assert.ThrowsAsync(async () => await requestDelegate(httpContext)); + + // Assert + Assert.Equal("The number of elements in the dictionary exceeded the maximum number of '2' elements allowed.", exception.Message); + } + [Fact] public async Task SupportsFormMappingOptionsInMetadataFormFormWithAttributeName() { From c6c82763dec9231e724670a4f31d96bfbe5078a9 Mon Sep 17 00:00:00 2001 From: DotNet-Bot Date: Wed, 15 Apr 2026 06:13:22 +0000 Subject: [PATCH 13/23] Update dependencies from https://dev.azure.com/dnceng/internal/_git/dotnet-efcore build 20260414.9 On relative base path root dotnet-ef , Microsoft.EntityFrameworkCore , Microsoft.EntityFrameworkCore.Design , Microsoft.EntityFrameworkCore.InMemory , Microsoft.EntityFrameworkCore.Relational , Microsoft.EntityFrameworkCore.Sqlite , Microsoft.EntityFrameworkCore.SqlServer , Microsoft.EntityFrameworkCore.Tools From Version 9.0.15 -> To Version 9.0.16 --- NuGet.config | 4 ++-- eng/Version.Details.xml | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/NuGet.config b/NuGet.config index b2c833ca6d9c..097d0f21ca66 100644 --- a/NuGet.config +++ b/NuGet.config @@ -9,7 +9,7 @@ - + @@ -32,7 +32,7 @@ - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index c5b6a17b5867..ae11e50f99b3 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,36 +11,36 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - b145c9fffbc0fbc42c83a330c7d912ad1213f269 + 7d48d82aa798d251991d637bb3ba49caefd38557 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - b145c9fffbc0fbc42c83a330c7d912ad1213f269 + 7d48d82aa798d251991d637bb3ba49caefd38557 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - b145c9fffbc0fbc42c83a330c7d912ad1213f269 + 7d48d82aa798d251991d637bb3ba49caefd38557 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - b145c9fffbc0fbc42c83a330c7d912ad1213f269 + 7d48d82aa798d251991d637bb3ba49caefd38557 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - b145c9fffbc0fbc42c83a330c7d912ad1213f269 + 7d48d82aa798d251991d637bb3ba49caefd38557 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - b145c9fffbc0fbc42c83a330c7d912ad1213f269 + 7d48d82aa798d251991d637bb3ba49caefd38557 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - b145c9fffbc0fbc42c83a330c7d912ad1213f269 + 7d48d82aa798d251991d637bb3ba49caefd38557 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - b145c9fffbc0fbc42c83a330c7d912ad1213f269 + 7d48d82aa798d251991d637bb3ba49caefd38557 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime From ceadc1b534b21fa5bdd677d80721dda1825ff5c3 Mon Sep 17 00:00:00 2001 From: DotNet-Bot Date: Wed, 15 Apr 2026 20:18:48 +0000 Subject: [PATCH 14/23] Update dependencies from https://dev.azure.com/dnceng/internal/_git/dotnet-efcore build 20260415.5 On relative base path root dotnet-ef , Microsoft.EntityFrameworkCore , Microsoft.EntityFrameworkCore.Design , Microsoft.EntityFrameworkCore.InMemory , Microsoft.EntityFrameworkCore.Relational , Microsoft.EntityFrameworkCore.Sqlite , Microsoft.EntityFrameworkCore.SqlServer , Microsoft.EntityFrameworkCore.Tools From Version 9.0.15 -> To Version 9.0.16 --- NuGet.config | 4 ++-- eng/Version.Details.xml | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/NuGet.config b/NuGet.config index 097d0f21ca66..7da7a4075370 100644 --- a/NuGet.config +++ b/NuGet.config @@ -9,7 +9,7 @@ - + @@ -32,7 +32,7 @@ - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index ae11e50f99b3..1eef29b56279 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,36 +11,36 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 7d48d82aa798d251991d637bb3ba49caefd38557 + 91c660d70e31fca00947c8bd65b78c24c43c8fa1 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 7d48d82aa798d251991d637bb3ba49caefd38557 + 91c660d70e31fca00947c8bd65b78c24c43c8fa1 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 7d48d82aa798d251991d637bb3ba49caefd38557 + 91c660d70e31fca00947c8bd65b78c24c43c8fa1 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 7d48d82aa798d251991d637bb3ba49caefd38557 + 91c660d70e31fca00947c8bd65b78c24c43c8fa1 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 7d48d82aa798d251991d637bb3ba49caefd38557 + 91c660d70e31fca00947c8bd65b78c24c43c8fa1 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 7d48d82aa798d251991d637bb3ba49caefd38557 + 91c660d70e31fca00947c8bd65b78c24c43c8fa1 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 7d48d82aa798d251991d637bb3ba49caefd38557 + 91c660d70e31fca00947c8bd65b78c24c43c8fa1 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 7d48d82aa798d251991d637bb3ba49caefd38557 + 91c660d70e31fca00947c8bd65b78c24c43c8fa1 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime From 45883b5b060a806cd17a271a1b36afc8a88b5c13 Mon Sep 17 00:00:00 2001 From: DotNet-Bot Date: Wed, 15 Apr 2026 22:59:49 +0000 Subject: [PATCH 15/23] Update dependencies from https://dev.azure.com/dnceng/internal/_git/dotnet-efcore build 20260415.12 On relative base path root dotnet-ef , Microsoft.EntityFrameworkCore , Microsoft.EntityFrameworkCore.Design , Microsoft.EntityFrameworkCore.InMemory , Microsoft.EntityFrameworkCore.Relational , Microsoft.EntityFrameworkCore.Sqlite , Microsoft.EntityFrameworkCore.SqlServer , Microsoft.EntityFrameworkCore.Tools From Version 9.0.15 -> To Version 9.0.16 --- NuGet.config | 4 ++-- eng/Version.Details.xml | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/NuGet.config b/NuGet.config index 7da7a4075370..8ac7e7ace62b 100644 --- a/NuGet.config +++ b/NuGet.config @@ -9,7 +9,7 @@ - + @@ -32,7 +32,7 @@ - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 1eef29b56279..4e7a18055ecb 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,36 +11,36 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 91c660d70e31fca00947c8bd65b78c24c43c8fa1 + 3a9bea9eb23087e7819fdfa197937772453be60d https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 91c660d70e31fca00947c8bd65b78c24c43c8fa1 + 3a9bea9eb23087e7819fdfa197937772453be60d https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 91c660d70e31fca00947c8bd65b78c24c43c8fa1 + 3a9bea9eb23087e7819fdfa197937772453be60d https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 91c660d70e31fca00947c8bd65b78c24c43c8fa1 + 3a9bea9eb23087e7819fdfa197937772453be60d https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 91c660d70e31fca00947c8bd65b78c24c43c8fa1 + 3a9bea9eb23087e7819fdfa197937772453be60d https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 91c660d70e31fca00947c8bd65b78c24c43c8fa1 + 3a9bea9eb23087e7819fdfa197937772453be60d https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 91c660d70e31fca00947c8bd65b78c24c43c8fa1 + 3a9bea9eb23087e7819fdfa197937772453be60d https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 91c660d70e31fca00947c8bd65b78c24c43c8fa1 + 3a9bea9eb23087e7819fdfa197937772453be60d https://dev.azure.com/dnceng/internal/_git/dotnet-runtime From b21136b05784d879de8810444d12d9eaffa843ec Mon Sep 17 00:00:00 2001 From: "Sean Reeser (CSI Interfusion Inc)" Date: Sat, 18 Apr 2026 03:36:49 +0000 Subject: [PATCH 16/23] Merged PR 60208: [internal/release/9.0] - Disabled nuget audit. [internal/release/9.0] - Disabled nuget audit. ---- #### AI description (iteration 1) #### PR Classification Build/configuration change to disable NuGet package auditing for the internal 9.0 release branch. #### PR Summary Disables NuGet audit checks at the repository build configuration level. This prevents audit enforcement during restore/build. - `Directory.Build.props`: Added `false` to disable NuGet auditing globally. --- Directory.Build.props | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index 996c2be9577b..946014f57ef5 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,8 @@ - + + false + true From 1ad07c927b7bc77300deec66415db0b116413a9f Mon Sep 17 00:00:00 2001 From: ProductConstructionServiceProd Date: Sat, 18 Apr 2026 18:01:46 +0000 Subject: [PATCH 17/23] Merged PR 60232: [internal/release/9.0] Update dependencies from dnceng/internal/dotnet-runtime This pull request updates the following dependencies [marker]: <> (Begin:ff8719c2-a1bf-4aef-ad09-b38561e103bc) ## From https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - **Subscription**: [ff8719c2-a1bf-4aef-ad09-b38561e103bc](https://maestro.dot.net/subscriptions?search=ff8719c2-a1bf-4aef-ad09-b38561e103bc) - **Build**: [20260418.6](https://dev.azure.com/dnceng/internal/_build/results?buildId=2954453) ([310946](https://maestro.dot.net/channel/5128/azdo:dnceng:internal:dotnet-runtime/build/310946)) - **Date Produced**: April 18, 2026 5:22:54 PM UTC - **Commit**: [c918bc31ab2b35053f098b190bb644bea211367b](https://dev.azure.com/dnceng/internal/_git/dotnet-runtime?_a=history&version=GCc918bc31ab2b35053f098b190bb644bea211367b) - **Branch**: [refs/heads/internal/release/9.0](https://dev.azure.com/dnceng/internal/_git/dotnet-runtime?version=GBrefs/heads/internal/release/9.0) [DependencyUpdate]: <> (Begin) - **Dependency Updates**: - From [9.0.16 to 9.0.16][1] - Microsoft.Bcl.AsyncInterfaces - Microsoft.Bcl.TimeProvider - Microsoft.Extensions.Caching.Abstractions - Microsoft.Extensions.Caching.Memory - Microsoft.Extensions.Configuration - Microsoft.Extensions.Configuration.Abstractions - Microsoft.Extensions.Configuration.Binder - Microsoft.Extensions.Configuration.CommandLine - Microsoft.Extensions.Configuration.EnvironmentVariables - Microsoft.Extensions.Configuration.FileExtensions - Microsoft.Extensions.Configuration.Ini - Microsoft.Extensions.Configuration.Json - Microsoft.Extensions.Configuration.UserSecrets - Microsoft.Extensions.Configuration.Xml - Microsoft.Extensions.DependencyInjection - Microsoft.Extensions.DependencyInjection.Abstractions - Microsoft.Extensions.DependencyModel - Microsoft.Extensions.Diagnostics - Microsoft.Extensions.Diagnostics.Abstractions - Microsoft.Extensions.FileProviders.Abstractions - Microsoft.Extensions.FileProviders.Composite - Microsoft.Extensions.FileProviders.Physical - Microsoft.Extensions.FileSystemGlobbing - Microsoft.Extensions.Hosting - Microsoft.Extensions.Hosting.Abstractions - Microsoft.Extensions.Http - Microsoft.Extensions.Logging - Microsoft.Extensions.Logging.Abstractions - Microsoft.Extensions.Logging.Configuration - Microsoft.Extensions.Logging.Console - Microsoft.Extensions.Logging.Debug - Microsoft.Extensions.Logging.EventLog - Microsoft.Extensions.Logging.EventSource - Microsoft.Extensions.Logging.TraceSource - Microsoft.Extensions.Options - Microsoft.Extensions.Options.ConfigurationExtensions - Microsoft.Extensions.Options.DataAnnotations - Microsoft.Extensions.Primitives - Microsoft.NET.Runtime.MonoAOTCompiler.Task - Microsoft.NET.Runtime.WebAssembly.Sdk - Microsoft.NETCore.App.Ref - Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.browser-wasm - Microsoft.NETCore.App... --- NuGet.config | 4 +- eng/Version.Details.xml | 156 ++++++++++++++++++++-------------------- eng/Versions.props | 10 +-- 3 files changed, 85 insertions(+), 85 deletions(-) diff --git a/NuGet.config b/NuGet.config index 8ac7e7ace62b..488611b78ff1 100644 --- a/NuGet.config +++ b/NuGet.config @@ -6,7 +6,7 @@ - + @@ -35,7 +35,7 @@ - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 1332413e9444..14c7e2fc83fe 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -44,268 +44,268 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://github.com/dotnet/xdt @@ -369,7 +369,7 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b @@ -380,9 +380,9 @@ - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 8f651f380086316d7150bc300794e4f782983a5f + c918bc31ab2b35053f098b190bb644bea211367b https://github.com/dotnet/winforms @@ -441,4 +441,4 @@ - \ No newline at end of file + diff --git a/eng/Versions.props b/eng/Versions.props index 6dcfc792a6b1..754ad20dc770 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -73,7 +73,7 @@ 9.0.16 9.0.16 9.0.16 - 9.0.16-servicing.26214.12 + 9.0.16-servicing.26218.6 9.0.16 9.0.16 9.0.16 @@ -94,7 +94,7 @@ 9.0.16 9.0.16 9.0.16 - 9.0.16-servicing.26214.12 + 9.0.16-servicing.26218.6 9.0.16 9.0.16 9.0.16 @@ -110,8 +110,8 @@ 9.0.16 9.0.16 9.0.16 - 9.0.16-servicing.26214.12 - 9.0.16-servicing.26214.12 + 9.0.16-servicing.26218.6 + 9.0.16-servicing.26218.6 9.0.16 9.0.16 9.0.16 @@ -133,7 +133,7 @@ 9.0.16 9.0.16 - 9.0.16-servicing.26214.12 + 9.0.16-servicing.26218.6 9.0.16 9.0.16 From db9d9da4dedbeca6c6fedb2dd67506d8857f413c Mon Sep 17 00:00:00 2001 From: ProductConstructionServiceProd Date: Sat, 18 Apr 2026 22:28:04 +0000 Subject: [PATCH 18/23] Merged PR 60241: [internal/release/9.0] Update dependencies from dnceng/internal/dotnet-efcore This pull request updates the following dependencies [marker]: <> (Begin:67a6df8f-40a9-4218-839a-e336f1bd1d79) ## From https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - **Subscription**: [67a6df8f-40a9-4218-839a-e336f1bd1d79](https://maestro.dot.net/subscriptions?search=67a6df8f-40a9-4218-839a-e336f1bd1d79) - **Build**: [20260418.5](https://dev.azure.com/dnceng/internal/_build/results?buildId=2954607) ([310956](https://maestro.dot.net/channel/5128/azdo:dnceng:internal:dotnet-efcore/build/310956)) - **Date Produced**: April 18, 2026 7:08:40 PM UTC - **Commit**: [ad3e74d0a83e3d0ec63998914e76f81a30d292ca](https://dev.azure.com/dnceng/internal/_git/dotnet-efcore?_a=history&version=GCad3e74d0a83e3d0ec63998914e76f81a30d292ca) - **Branch**: [refs/heads/internal/release/9.0](https://dev.azure.com/dnceng/internal/_git/dotnet-efcore?version=GBrefs/heads/internal/release/9.0) [DependencyUpdate]: <> (Begin) - **Dependency Updates**: - From [9.0.16 to 9.0.16][1] - dotnet-ef - Microsoft.EntityFrameworkCore - Microsoft.EntityFrameworkCore.Design - Microsoft.EntityFrameworkCore.InMemory - Microsoft.EntityFrameworkCore.Relational - Microsoft.EntityFrameworkCore.Sqlite - Microsoft.EntityFrameworkCore.SqlServer - Microsoft.EntityFrameworkCore.Tools [1]: https://dev.azure.com/dnceng/internal/_git/dotnet-efcore/branches?baseVersion=GC3a9bea9eb23087e7819fdfa197937772453be60d&targetVersion=GCad3e74d0a83e3d0ec63998914e76f81a30d292ca&_a=files [DependencyUpdate]: <> (End) [marker]: <> (End:67a6df8f-40a9-4218-839a-e336f1bd1d79) --- NuGet.config | 4 ++-- eng/Version.Details.xml | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/NuGet.config b/NuGet.config index 488611b78ff1..454c765fb977 100644 --- a/NuGet.config +++ b/NuGet.config @@ -9,7 +9,7 @@ - + @@ -32,7 +32,7 @@ - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 14c7e2fc83fe..d5caab1a62e9 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,36 +11,36 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 3a9bea9eb23087e7819fdfa197937772453be60d + ad3e74d0a83e3d0ec63998914e76f81a30d292ca https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 3a9bea9eb23087e7819fdfa197937772453be60d + ad3e74d0a83e3d0ec63998914e76f81a30d292ca https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 3a9bea9eb23087e7819fdfa197937772453be60d + ad3e74d0a83e3d0ec63998914e76f81a30d292ca https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 3a9bea9eb23087e7819fdfa197937772453be60d + ad3e74d0a83e3d0ec63998914e76f81a30d292ca https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 3a9bea9eb23087e7819fdfa197937772453be60d + ad3e74d0a83e3d0ec63998914e76f81a30d292ca https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 3a9bea9eb23087e7819fdfa197937772453be60d + ad3e74d0a83e3d0ec63998914e76f81a30d292ca https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 3a9bea9eb23087e7819fdfa197937772453be60d + ad3e74d0a83e3d0ec63998914e76f81a30d292ca https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 3a9bea9eb23087e7819fdfa197937772453be60d + ad3e74d0a83e3d0ec63998914e76f81a30d292ca https://dev.azure.com/dnceng/internal/_git/dotnet-runtime From f9193be90fe1dd6348e8525bdbd7a359a6bf008b Mon Sep 17 00:00:00 2001 From: ProductConstructionServiceProd Date: Wed, 29 Apr 2026 07:04:26 +0000 Subject: [PATCH 19/23] Merged PR 60561: [internal/release/9.0] Update dependencies from dnceng/internal/dotnet-runtime This pull request updates the following dependencies [marker]: <> (Begin:ff8719c2-a1bf-4aef-ad09-b38561e103bc) ## From https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - **Subscription**: [ff8719c2-a1bf-4aef-ad09-b38561e103bc](https://maestro.dot.net/subscriptions?search=ff8719c2-a1bf-4aef-ad09-b38561e103bc) - **Build**: [20260428.17](https://dev.azure.com/dnceng/internal/_build/results?buildId=2962683) ([312348](https://maestro.dot.net/channel/5128/azdo:dnceng:internal:dotnet-runtime/build/312348)) - **Date Produced**: April 29, 2026 4:48:33 AM UTC - **Commit**: [2a90773a6f08116292accdc493b970ef3c7ed2c0](https://dev.azure.com/dnceng/internal/_git/dotnet-runtime?_a=history&version=GC2a90773a6f08116292accdc493b970ef3c7ed2c0) - **Branch**: [refs/heads/internal/release/9.0](https://dev.azure.com/dnceng/internal/_git/dotnet-runtime?version=GBrefs/heads/internal/release/9.0) [DependencyUpdate]: <> (Begin) - **Dependency Updates**: - From [9.0.16 to 9.0.16][1] - Microsoft.Bcl.AsyncInterfaces - Microsoft.Bcl.TimeProvider - Microsoft.Extensions.Caching.Abstractions - Microsoft.Extensions.Caching.Memory - Microsoft.Extensions.Configuration - Microsoft.Extensions.Configuration.Abstractions - Microsoft.Extensions.Configuration.Binder - Microsoft.Extensions.Configuration.CommandLine - Microsoft.Extensions.Configuration.EnvironmentVariables - Microsoft.Extensions.Configuration.FileExtensions - Microsoft.Extensions.Configuration.Ini - Microsoft.Extensions.Configuration.Json - Microsoft.Extensions.Configuration.UserSecrets - Microsoft.Extensions.Configuration.Xml - Microsoft.Extensions.DependencyInjection - Microsoft.Extensions.DependencyInjection.Abstractions - Microsoft.Extensions.DependencyModel - Microsoft.Extensions.Diagnostics - Microsoft.Extensions.Diagnostics.Abstractions - Microsoft.Extensions.FileProviders.Abstractions - Microsoft.Extensions.FileProviders.Composite - Microsoft.Extensions.FileProviders.Physical - Microsoft.Extensions.FileSystemGlobbing - Microsoft.Extensions.Hosting - Microsoft.Extensions.Hosting.Abstractions - Microsoft.Extensions.Http - Microsoft.Extensions.Logging - Microsoft.Extensions.Logging.Abstractions - Microsoft.Extensions.Logging.Configuration - Microsoft.Extensions.Logging.Console - Microsoft.Extensions.Logging.Debug - Microsoft.Extensions.Logging.EventLog - Microsoft.Extensions.Logging.EventSource - Microsoft.Extensions.Logging.TraceSource - Microsoft.Extensions.Options - Microsoft.Extensions.Options.ConfigurationExtensions - Microsoft.Extensions.Options.DataAnnotations - Microsoft.Extensions.Primitives - Microsoft.NET.Runtime.MonoAOTCompiler.Task - Microsoft.NET.Runtime.WebAssembly.Sdk - Microsoft.NETCore.App.Ref - Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.browser-wasm - Microsoft.NETCore.Ap... --- NuGet.config | 4 +- eng/Version.Details.xml | 154 ++++++++++++++++++++-------------------- eng/Versions.props | 10 +-- 3 files changed, 84 insertions(+), 84 deletions(-) diff --git a/NuGet.config b/NuGet.config index 454c765fb977..d8356b7f397c 100644 --- a/NuGet.config +++ b/NuGet.config @@ -6,7 +6,7 @@ - + @@ -35,7 +35,7 @@ - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index d5caab1a62e9..3322f2e18177 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -44,268 +44,268 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://github.com/dotnet/xdt @@ -369,7 +369,7 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 @@ -380,9 +380,9 @@ - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c918bc31ab2b35053f098b190bb644bea211367b + 2a90773a6f08116292accdc493b970ef3c7ed2c0 https://github.com/dotnet/winforms diff --git a/eng/Versions.props b/eng/Versions.props index 754ad20dc770..eb150fadbff6 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -73,7 +73,7 @@ 9.0.16 9.0.16 9.0.16 - 9.0.16-servicing.26218.6 + 9.0.16-servicing.26228.17 9.0.16 9.0.16 9.0.16 @@ -94,7 +94,7 @@ 9.0.16 9.0.16 9.0.16 - 9.0.16-servicing.26218.6 + 9.0.16-servicing.26228.17 9.0.16 9.0.16 9.0.16 @@ -110,8 +110,8 @@ 9.0.16 9.0.16 9.0.16 - 9.0.16-servicing.26218.6 - 9.0.16-servicing.26218.6 + 9.0.16-servicing.26228.17 + 9.0.16-servicing.26228.17 9.0.16 9.0.16 9.0.16 @@ -133,7 +133,7 @@ 9.0.16 9.0.16 - 9.0.16-servicing.26218.6 + 9.0.16-servicing.26228.17 9.0.16 9.0.16 From 07a496738e36552857af89c1ea94f6b47780a47d Mon Sep 17 00:00:00 2001 From: ProductConstructionServiceProd Date: Wed, 29 Apr 2026 14:52:56 +0000 Subject: [PATCH 20/23] Merged PR 60570: [internal/release/9.0] Update dependencies from dnceng/internal/dotnet-efcore This pull request updates the following dependencies [marker]: <> (Begin:67a6df8f-40a9-4218-839a-e336f1bd1d79) ## From https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - **Subscription**: [67a6df8f-40a9-4218-839a-e336f1bd1d79](https://maestro.dot.net/subscriptions?search=67a6df8f-40a9-4218-839a-e336f1bd1d79) - **Build**: [20260429.1](https://dev.azure.com/dnceng/internal/_build/results?buildId=2962960) ([312372](https://maestro.dot.net/channel/5128/azdo:dnceng:internal:dotnet-efcore/build/312372)) - **Date Produced**: April 29, 2026 8:28:32 AM UTC - **Commit**: [b814fcc21e386ebc8debece838974fd1c6d6f36b](https://dev.azure.com/dnceng/internal/_git/dotnet-efcore?_a=history&version=GCb814fcc21e386ebc8debece838974fd1c6d6f36b) - **Branch**: [refs/heads/internal/release/9.0](https://dev.azure.com/dnceng/internal/_git/dotnet-efcore?version=GBrefs/heads/internal/release/9.0) [DependencyUpdate]: <> (Begin) - **Dependency Updates**: - From [9.0.16 to 9.0.16][1] - dotnet-ef - Microsoft.EntityFrameworkCore - Microsoft.EntityFrameworkCore.Design - Microsoft.EntityFrameworkCore.InMemory - Microsoft.EntityFrameworkCore.Relational - Microsoft.EntityFrameworkCore.Sqlite - Microsoft.EntityFrameworkCore.SqlServer - Microsoft.EntityFrameworkCore.Tools [1]: https://dev.azure.com/dnceng/internal/_git/dotnet-efcore/branches?baseVersion=GCad3e74d0a83e3d0ec63998914e76f81a30d292ca&targetVersion=GCb814fcc21e386ebc8debece838974fd1c6d6f36b&_a=files [DependencyUpdate]: <> (End) [marker]: <> (End:67a6df8f-40a9-4218-839a-e336f1bd1d79) --- NuGet.config | 4 ++-- eng/Version.Details.xml | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/NuGet.config b/NuGet.config index d8356b7f397c..5b805b986fec 100644 --- a/NuGet.config +++ b/NuGet.config @@ -9,7 +9,7 @@ - + @@ -32,7 +32,7 @@ - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 3322f2e18177..56924f8fbcc3 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,36 +11,36 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - ad3e74d0a83e3d0ec63998914e76f81a30d292ca + b814fcc21e386ebc8debece838974fd1c6d6f36b https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - ad3e74d0a83e3d0ec63998914e76f81a30d292ca + b814fcc21e386ebc8debece838974fd1c6d6f36b https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - ad3e74d0a83e3d0ec63998914e76f81a30d292ca + b814fcc21e386ebc8debece838974fd1c6d6f36b https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - ad3e74d0a83e3d0ec63998914e76f81a30d292ca + b814fcc21e386ebc8debece838974fd1c6d6f36b https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - ad3e74d0a83e3d0ec63998914e76f81a30d292ca + b814fcc21e386ebc8debece838974fd1c6d6f36b https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - ad3e74d0a83e3d0ec63998914e76f81a30d292ca + b814fcc21e386ebc8debece838974fd1c6d6f36b https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - ad3e74d0a83e3d0ec63998914e76f81a30d292ca + b814fcc21e386ebc8debece838974fd1c6d6f36b https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - ad3e74d0a83e3d0ec63998914e76f81a30d292ca + b814fcc21e386ebc8debece838974fd1c6d6f36b https://dev.azure.com/dnceng/internal/_git/dotnet-runtime From cd199d4b4761aa130b721bb66fb487c9e7c2228f Mon Sep 17 00:00:00 2001 From: ProductConstructionServiceProd Date: Thu, 30 Apr 2026 07:14:11 +0000 Subject: [PATCH 21/23] Merged PR 60605: [internal/release/9.0] Update dependencies from dnceng/internal/dotnet-efcore, dnceng/internal/dotnet-runtime This pull request updates the following dependencies [marker]: <> (Begin:67a6df8f-40a9-4218-839a-e336f1bd1d79) ## From https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - **Subscription**: [67a6df8f-40a9-4218-839a-e336f1bd1d79](https://maestro.dot.net/subscriptions?search=67a6df8f-40a9-4218-839a-e336f1bd1d79) - **Build**: [20260429.4](https://dev.azure.com/dnceng/internal/_build/results?buildId=2963583) ([312476](https://maestro.dot.net/channel/5128/azdo:dnceng:internal:dotnet-efcore/build/312476)) - **Date Produced**: April 29, 2026 10:00:43 PM UTC - **Commit**: [67f83cd0d31c89365ba73b177e732caf54a0da57](https://dev.azure.com/dnceng/internal/_git/dotnet-efcore?_a=history&version=GC67f83cd0d31c89365ba73b177e732caf54a0da57) - **Branch**: [refs/heads/internal/release/9.0](https://dev.azure.com/dnceng/internal/_git/dotnet-efcore?version=GBrefs/heads/internal/release/9.0) [DependencyUpdate]: <> (Begin) - **Dependency Updates**: - From [9.0.16 to 9.0.16][1] - dotnet-ef - Microsoft.EntityFrameworkCore - Microsoft.EntityFrameworkCore.Design - Microsoft.EntityFrameworkCore.InMemory - Microsoft.EntityFrameworkCore.Relational - Microsoft.EntityFrameworkCore.Sqlite - Microsoft.EntityFrameworkCore.SqlServer - Microsoft.EntityFrameworkCore.Tools [1]: https://dev.azure.com/dnceng/internal/_git/dotnet-efcore/branches?baseVersion=GCb814fcc21e386ebc8debece838974fd1c6d6f36b&targetVersion=GC67f83cd0d31c89365ba73b177e732caf54a0da57&_a=files [DependencyUpdate]: <> (End) [marker]: <> (End:67a6df8f-40a9-4218-839a-e336f1bd1d79) [marker]: <> (Begin:ff8719c2-a1bf-4aef-ad09-b38561e103bc) ## From https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - **Subscription**: [ff8719c2-a1bf-4aef-ad09-b38561e103bc](https://maestro.dot.net/subscriptions?search=ff8719c2-a1bf-4aef-ad09-b38561e103bc) - **Build**: [20260429.23](https://dev.azure.com/dnceng/internal/_build/results?buildId=2963667) ([312507](https://maestro.dot.net/channel/5128/azdo:dnceng:internal:dotnet-runtime/build/312507)) - **Date Produced**: April 30, 2026 4:19:01 AM UTC - **Commit**: [a1e6809fb8318884882ceff057000654f558738a](https://dev.azure.com/dnceng/internal/_git/dotnet-runtime?_a=history&version=GCa1e6809fb8318884882ceff057000654f558738a) - **Branch**: [refs/heads/internal/release/9.0](https://dev.azure.com/dnceng/internal/_git/dotnet-runtime?version=GBrefs/heads/internal/release/9.0) [DependencyUpdate]: <> (Begin) - **Dependency Updates**: - From [9.0.16 to 9.0.16][2] - Microsoft.Bcl.AsyncInterfaces - Microsoft.Bcl.TimeProvider - Microsoft.Extensions.Caching.Abstractions - Microsoft.Extensions.Caching.Memory - Microsoft.Extensions.Configuration - Microsoft.Extensions.Configuration.Abstractions - Microsoft.Extensions.Configuration.Binder - Microsoft.Extensions.Configuration.CommandLine - Microsoft.Extensions.Configuration.EnvironmentVariables - Microsoft.Extensions.Configuration.FileExtensions... --- NuGet.config | 8 +- eng/Version.Details.xml | 170 ++++++++++++++++++++-------------------- eng/Versions.props | 10 +-- 3 files changed, 94 insertions(+), 94 deletions(-) diff --git a/NuGet.config b/NuGet.config index 5b805b986fec..86a227c7ef4f 100644 --- a/NuGet.config +++ b/NuGet.config @@ -6,10 +6,10 @@ - + - + @@ -32,10 +32,10 @@ - + - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 56924f8fbcc3..ffff6c449e0f 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,301 +11,301 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - b814fcc21e386ebc8debece838974fd1c6d6f36b + 67f83cd0d31c89365ba73b177e732caf54a0da57 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - b814fcc21e386ebc8debece838974fd1c6d6f36b + 67f83cd0d31c89365ba73b177e732caf54a0da57 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - b814fcc21e386ebc8debece838974fd1c6d6f36b + 67f83cd0d31c89365ba73b177e732caf54a0da57 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - b814fcc21e386ebc8debece838974fd1c6d6f36b + 67f83cd0d31c89365ba73b177e732caf54a0da57 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - b814fcc21e386ebc8debece838974fd1c6d6f36b + 67f83cd0d31c89365ba73b177e732caf54a0da57 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - b814fcc21e386ebc8debece838974fd1c6d6f36b + 67f83cd0d31c89365ba73b177e732caf54a0da57 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - b814fcc21e386ebc8debece838974fd1c6d6f36b + 67f83cd0d31c89365ba73b177e732caf54a0da57 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - b814fcc21e386ebc8debece838974fd1c6d6f36b + 67f83cd0d31c89365ba73b177e732caf54a0da57 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://github.com/dotnet/xdt @@ -369,7 +369,7 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a @@ -380,9 +380,9 @@ - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 2a90773a6f08116292accdc493b970ef3c7ed2c0 + a1e6809fb8318884882ceff057000654f558738a https://github.com/dotnet/winforms diff --git a/eng/Versions.props b/eng/Versions.props index eb150fadbff6..d81ad52c2e9d 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -73,7 +73,7 @@ 9.0.16 9.0.16 9.0.16 - 9.0.16-servicing.26228.17 + 9.0.16-servicing.26229.23 9.0.16 9.0.16 9.0.16 @@ -94,7 +94,7 @@ 9.0.16 9.0.16 9.0.16 - 9.0.16-servicing.26228.17 + 9.0.16-servicing.26229.23 9.0.16 9.0.16 9.0.16 @@ -110,8 +110,8 @@ 9.0.16 9.0.16 9.0.16 - 9.0.16-servicing.26228.17 - 9.0.16-servicing.26228.17 + 9.0.16-servicing.26229.23 + 9.0.16-servicing.26229.23 9.0.16 9.0.16 9.0.16 @@ -133,7 +133,7 @@ 9.0.16 9.0.16 - 9.0.16-servicing.26228.17 + 9.0.16-servicing.26229.23 9.0.16 9.0.16 From 4d825aeb5e5023588c036709c7914008b625b0eb Mon Sep 17 00:00:00 2001 From: ProductConstructionServiceProd Date: Thu, 30 Apr 2026 09:46:26 +0000 Subject: [PATCH 22/23] Merged PR 60637: [internal/release/9.0] Update dependencies from dnceng/internal/dotnet-efcore This pull request updates the following dependencies [marker]: <> (Begin:67a6df8f-40a9-4218-839a-e336f1bd1d79) ## From https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - **Subscription**: [67a6df8f-40a9-4218-839a-e336f1bd1d79](https://maestro.dot.net/subscriptions?search=67a6df8f-40a9-4218-839a-e336f1bd1d79) - **Build**: [20260430.2](https://dev.azure.com/dnceng/internal/_build/results?buildId=2963976) ([312533](https://maestro.dot.net/channel/5128/azdo:dnceng:internal:dotnet-efcore/build/312533)) - **Date Produced**: April 30, 2026 8:31:57 AM UTC - **Commit**: [60c2e9b8f50634a077d6c4d2a2a73a7f643c9b11](https://dev.azure.com/dnceng/internal/_git/dotnet-efcore?_a=history&version=GC60c2e9b8f50634a077d6c4d2a2a73a7f643c9b11) - **Branch**: [refs/heads/internal/release/9.0](https://dev.azure.com/dnceng/internal/_git/dotnet-efcore?version=GBrefs/heads/internal/release/9.0) [DependencyUpdate]: <> (Begin) - **Dependency Updates**: - From [9.0.16 to 9.0.16][1] - dotnet-ef - Microsoft.EntityFrameworkCore - Microsoft.EntityFrameworkCore.Design - Microsoft.EntityFrameworkCore.InMemory - Microsoft.EntityFrameworkCore.Relational - Microsoft.EntityFrameworkCore.Sqlite - Microsoft.EntityFrameworkCore.SqlServer - Microsoft.EntityFrameworkCore.Tools [1]: https://dev.azure.com/dnceng/internal/_git/dotnet-efcore/branches?baseVersion=GC67f83cd0d31c89365ba73b177e732caf54a0da57&targetVersion=GC60c2e9b8f50634a077d6c4d2a2a73a7f643c9b11&_a=files [DependencyUpdate]: <> (End) [marker]: <> (End:67a6df8f-40a9-4218-839a-e336f1bd1d79) --- NuGet.config | 4 ++-- eng/Version.Details.xml | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/NuGet.config b/NuGet.config index 86a227c7ef4f..27fa359292cc 100644 --- a/NuGet.config +++ b/NuGet.config @@ -9,7 +9,7 @@ - + @@ -32,7 +32,7 @@ - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index ffff6c449e0f..907946afd749 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -11,36 +11,36 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 67f83cd0d31c89365ba73b177e732caf54a0da57 + 60c2e9b8f50634a077d6c4d2a2a73a7f643c9b11 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 67f83cd0d31c89365ba73b177e732caf54a0da57 + 60c2e9b8f50634a077d6c4d2a2a73a7f643c9b11 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 67f83cd0d31c89365ba73b177e732caf54a0da57 + 60c2e9b8f50634a077d6c4d2a2a73a7f643c9b11 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 67f83cd0d31c89365ba73b177e732caf54a0da57 + 60c2e9b8f50634a077d6c4d2a2a73a7f643c9b11 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 67f83cd0d31c89365ba73b177e732caf54a0da57 + 60c2e9b8f50634a077d6c4d2a2a73a7f643c9b11 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 67f83cd0d31c89365ba73b177e732caf54a0da57 + 60c2e9b8f50634a077d6c4d2a2a73a7f643c9b11 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 67f83cd0d31c89365ba73b177e732caf54a0da57 + 60c2e9b8f50634a077d6c4d2a2a73a7f643c9b11 https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 67f83cd0d31c89365ba73b177e732caf54a0da57 + 60c2e9b8f50634a077d6c4d2a2a73a7f643c9b11 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime From ba9cd59b6b8ff0cf149ecd60ee752cdeaf4f7e99 Mon Sep 17 00:00:00 2001 From: Brennan Date: Tue, 12 May 2026 13:18:57 -0700 Subject: [PATCH 23/23] Apply suggestion from @BrennanConroy --- src/Middleware/ResponseCaching/test/TestUtils.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Middleware/ResponseCaching/test/TestUtils.cs b/src/Middleware/ResponseCaching/test/TestUtils.cs index 26844a8d99d0..d489192be16e 100644 --- a/src/Middleware/ResponseCaching/test/TestUtils.cs +++ b/src/Middleware/ResponseCaching/test/TestUtils.cs @@ -301,7 +301,7 @@ internal class LoggedMessage internal static LoggedMessage ResponseNotCached => new LoggedMessage(27, LogLevel.Information); internal static LoggedMessage ResponseContentLengthMismatchNotCached => new LoggedMessage(28, LogLevel.Warning); internal static LoggedMessage ExpirationInfiniteMaxStaleSatisfied => new LoggedMessage(29, LogLevel.Debug); - internal static LoggedMessage RequestContainsInvalidCacheSymbols => new LoggedMessage(30, LogLevel.Warning); + internal static LoggedMessage RequestContainsInvalidCacheSymbols => new LoggedMessage(30, LogLevel.Debug); private LoggedMessage(int evenId, LogLevel logLevel) {