Skip to content

Commit 38c4680

Browse files
committed
Fixes stackoverflow when sending NewReturnRequestStoreOwnerNotification
1 parent 98c131b commit 38c4680

File tree

1 file changed

+16
-4
lines changed

1 file changed

+16
-4
lines changed

src/Libraries/SmartStore.Services/Messages/MessageModelProvider.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1152,7 +1152,7 @@ private TreeNode<ModelTreeMember> BuildModelTreePart(string modelName, object in
11521152
return node;
11531153
}
11541154

1155-
private IEnumerable<TreeNode<ModelTreeMember>> BuildModelTreePartForClass(object instance)
1155+
private IEnumerable<TreeNode<ModelTreeMember>> BuildModelTreePartForClass(object instance, HashSet<object> instanceLookup = null)
11561156
{
11571157
var type = instance?.GetType();
11581158

@@ -1179,9 +1179,21 @@ private IEnumerable<TreeNode<ModelTreeMember>> BuildModelTreePartForClass(object
11791179
}
11801180
else
11811181
{
1182-
var node = new TreeNode<ModelTreeMember>(new ModelTreeMember { Name = prop.Name, Kind = ModelTreeMemberKind.Complex });
1183-
node.AppendRange(BuildModelTreePartForClass(prop.GetValue(instance)));
1184-
yield return node;
1182+
if (instanceLookup == null)
1183+
{
1184+
instanceLookup = new HashSet<object>(ReferenceEqualityComparer.Default);
1185+
}
1186+
1187+
var exists = !type.IsValueType && instanceLookup.Contains(instance);
1188+
1189+
if (!exists)
1190+
{
1191+
instanceLookup.Add(instance);
1192+
1193+
var node = new TreeNode<ModelTreeMember>(new ModelTreeMember { Name = prop.Name, Kind = ModelTreeMemberKind.Complex });
1194+
node.AppendRange(BuildModelTreePartForClass(prop.GetValue(instance), instanceLookup));
1195+
yield return node;
1196+
}
11851197
}
11861198
}
11871199
}

0 commit comments

Comments
 (0)