Skip to content

Commit 5f0a1ff

Browse files
authored
fix(yaml): Fix stack overflow in deepHashCode for self-referential lists (#2365)
Replaces #2362 Replace a nested call to `deepHashCode` with `deepHashCodeInner` to fix a stack overflow with self referential iterables.
1 parent b0a31c6 commit 5f0a1ff

3 files changed

Lines changed: 19 additions & 1 deletion

File tree

pkgs/yaml/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
## 3.1.4-wip
22

3+
* Fix a stack overflow in `deepHashCode` when handling self-referential lists.
4+
35
## 3.1.3
46

57
* Require Dart 3.4

pkgs/yaml/lib/src/equality.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,8 @@ int deepHashCode(Object? obj) {
113113
return equality.hash(value.keys.map(deepHashCodeInner)) ^
114114
equality.hash(value.values.map(deepHashCodeInner));
115115
} else if (value is Iterable) {
116-
return const IterableEquality<Object?>().hash(value.map(deepHashCode));
116+
return const IterableEquality<Object?>()
117+
.hash(value.map(deepHashCodeInner));
117118
} else if (value is YamlScalar) {
118119
return (value.value as Object?).hashCode;
119120
} else {

pkgs/yaml/test/yaml_test.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,6 +1122,21 @@ void main() {
11221122
expect(anchorList, same(aliasList));
11231123
});
11241124

1125+
test('self-referential list does not cause stack overflow in deepHashCode',
1126+
() {
1127+
var doc = loadYaml(cleanUpLiteral('''
1128+
? &anchor [*anchor]
1129+
: value'''));
1130+
expect(doc, isNotNull);
1131+
var key = doc.keys.first;
1132+
expect(key, isA<YamlList>());
1133+
expect(key[0], same(key));
1134+
1135+
var map = deepEqualsMap();
1136+
map[key] = 'value';
1137+
expect(map[key], 'value');
1138+
});
1139+
11251140
test('[Example 7.1]', () {
11261141
expectYamlLoads({
11271142
'First occurrence': 'Foo',

0 commit comments

Comments
 (0)