Skip to content

Commit c7a08c9

Browse files
authored
Harden metadata handler invoker against bad metadata (#47433)
1 parent 3745af8 commit c7a08c9

File tree

1 file changed

+36
-5
lines changed

1 file changed

+36
-5
lines changed

src/BuiltInTools/HotReloadAgent/MetadataUpdateHandlerInvoker.cs

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ internal static List<Assembly> TopologicalSort(Assembly[] assemblies)
318318
{
319319
var sortedAssemblies = new List<Assembly>(assemblies.Length);
320320

321-
var visited = new HashSet<string>(StringComparer.Ordinal);
321+
var visited = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
322322

323323
foreach (var assembly in assemblies)
324324
{
@@ -327,15 +327,46 @@ internal static List<Assembly> TopologicalSort(Assembly[] assemblies)
327327

328328
static void Visit(Assembly[] assemblies, Assembly assembly, List<Assembly> sortedAssemblies, HashSet<string> visited)
329329
{
330-
var assemblyIdentifier = assembly.GetName().Name!;
331-
if (!visited.Add(assemblyIdentifier))
330+
string assemblyIdentifier;
331+
332+
try
333+
{
334+
assemblyIdentifier = assembly.GetName().Name;
335+
}
336+
catch
337+
{
338+
return;
339+
}
340+
341+
if (assemblyIdentifier == null || !visited.Add(assemblyIdentifier))
332342
{
333343
return;
334344
}
335345

336-
foreach (var dependencyName in assembly.GetReferencedAssemblies())
346+
AssemblyName[] referencedAssemblies;
347+
try
337348
{
338-
var dependency = Array.Find(assemblies, a => a.GetName().Name == dependencyName.Name);
349+
referencedAssemblies = assembly.GetReferencedAssemblies();
350+
}
351+
catch
352+
{
353+
referencedAssemblies = [];
354+
}
355+
356+
foreach (var dependencyName in referencedAssemblies)
357+
{
358+
var dependency = Array.Find(assemblies, a =>
359+
{
360+
try
361+
{
362+
return string.Equals(a.GetName().Name, dependencyName.Name, StringComparison.OrdinalIgnoreCase);
363+
}
364+
catch
365+
{
366+
return false;
367+
}
368+
});
369+
339370
if (dependency is not null)
340371
{
341372
Visit(assemblies, dependency, sortedAssemblies, visited);

0 commit comments

Comments
 (0)