From 4ce2f722177338ff686d293ef7a6fd9be154335a Mon Sep 17 00:00:00 2001 From: EmoSaru Date: Mon, 13 Apr 2026 11:57:01 -0700 Subject: [PATCH] Fix collection modified during enumeration in package update checks Iterate temporary .ToList() snapshots of Repositories and Packages collections in UpdatesAvailable and CurrentPackageHasUpdateAvailable to avoid InvalidOperationException when collections are modified concurrently. Add null checks on entries for safety. Based on codemann8's fix (codemann8/EmoTracker@617da7a). Fixes #14 Co-Authored-By: Claude Opus 4.6 --- EmoTracker.Data/Packages/PackageManager.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/EmoTracker.Data/Packages/PackageManager.cs b/EmoTracker.Data/Packages/PackageManager.cs index e28e383..2e29b2e 100644 --- a/EmoTracker.Data/Packages/PackageManager.cs +++ b/EmoTracker.Data/Packages/PackageManager.cs @@ -8,6 +8,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; +using System.Linq; using System.Net; namespace EmoTracker.Data.Packages @@ -269,11 +270,11 @@ public bool UpdatesAvailable { get { - foreach (PackageRepository repository in Repositories) + foreach (PackageRepository repository in Repositories.ToList()) { - foreach (PackageRepositoryEntry entry in repository.Packages) + foreach (PackageRepositoryEntry entry in repository.Packages.ToList()) { - if (entry.Status == PackageRepositoryEntry.PackageStatus.UpdateAvailable) + if (entry != null && entry.Status == PackageRepositoryEntry.PackageStatus.UpdateAvailable) return true; } } @@ -286,11 +287,11 @@ public bool CurrentPackageHasUpdateAvailable { get { - foreach (PackageRepository repository in Repositories) + foreach (PackageRepository repository in Repositories.ToList()) { - foreach (PackageRepositoryEntry entry in repository.Packages) + foreach (PackageRepositoryEntry entry in repository.Packages.ToList()) { - if (entry.Status == PackageRepositoryEntry.PackageStatus.UpdateAvailable) + if (entry != null && entry.Status == PackageRepositoryEntry.PackageStatus.UpdateAvailable) { if (entry.ExistingPackage == Tracker.Instance.ActiveGamePackage) return true;