Enumerate a config snapshot under the lock (#1357)

ConfigFile documents its public methods as thread-safe, but GetEnumerator
returned the live Dictionary enumerator with no lock, so a concurrent
Bind/Reload could invalidate it mid-foreach. Snapshot under _ioLock instead.
This commit is contained in:
HetCreep authored and GitHub committed 2026-06-21 12:13:51 +02:00
1 parent 32fb12f2e9
commit fb5f191b36
1 file changed
+6 -3
+6 -3
View File
@@ -92,9 +92,12 @@ public class ConfigFile : IDictionary<ConfigDefinition, ConfigEntryBase>
public ConfigEntryBase this[string section, string key] => this[new ConfigDefinition(section, key)];
/// <inheritdoc />
public IEnumerator<KeyValuePair<ConfigDefinition, ConfigEntryBase>> GetEnumerator() =>
// We can't really do a read lock for this
Entries.GetEnumerator();
public IEnumerator<KeyValuePair<ConfigDefinition, ConfigEntryBase>> GetEnumerator()
{
// Enumerate a snapshot taken under the lock so a concurrent mutation cannot invalidate the iterator.
lock (_ioLock)
return Entries.ToList().GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();