diff options
author | Daniel Grunwald <daniel@danielgrunwald.de> | 2014-08-10 14:50:55 +0400 |
---|---|---|
committer | Daniel Grunwald <daniel@danielgrunwald.de> | 2014-08-10 14:50:55 +0400 |
commit | f972403e28c165674fc0a94c10bbf23902159597 (patch) | |
tree | caab42dfc84a34bf5098f8d61f8a49a13a54c472 /ICSharpCode.NRefactory | |
parent | ccecc31466e652f70cc4dbefabe7914c7c73f6cd (diff) |
Protect against cyclic type forwarders.
Diffstat (limited to 'ICSharpCode.NRefactory')
-rw-r--r-- | ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAssembly.cs | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAssembly.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAssembly.cs index 0999c843..d1cbb4f7 100644 --- a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAssembly.cs +++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAssembly.cs @@ -344,10 +344,14 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation ITypeReference typeRef; if (unresolvedAssembly.typeDefinitions.TryGetValue(topLevelTypeName, out td)) return GetTypeDefinition(td); - else if (unresolvedAssembly.typeForwarders.TryGetValue(topLevelTypeName, out typeRef)) - return typeRef.Resolve(compilation.TypeResolveContext).GetDefinition(); - else - return null; + if (unresolvedAssembly.typeForwarders.TryGetValue(topLevelTypeName, out typeRef)) { + // Protect against cyclic type forwarders: + using (var busyLock = BusyManager.Enter(typeRef)) { + if (busyLock.Success) + return typeRef.Resolve(compilation.TypeResolveContext).GetDefinition(); + } + } + return null; } ITypeDefinition GetTypeDefinition(IUnresolvedTypeDefinition unresolved) |