Skip to content

Fix thread safety issues in parallel test execution#15514

Merged
nohwnd merged 1 commit intofix/thread-safety-and-xxe-vulnerabilitiesfrom
copilot/sub-pr-15512
Mar 19, 2026
Merged

Fix thread safety issues in parallel test execution#15514
nohwnd merged 1 commit intofix/thread-safety-and-xxe-vulnerabilitiesfrom
copilot/sub-pr-15512

Conversation

Copy link
Contributor

Copilot AI commented Mar 19, 2026

Several data structures shared across concurrent test execution threads were not thread-safe, risking corrupted results and lost updates.

Changes

  • ParallelRunDataAggregator / DiscoveryDataAggregator: Replace TryGetValue + set pattern with ConcurrentDictionary.AddOrUpdate in metrics aggregation to eliminate lost-update races
  • DataCollectionAttachmentManager: Replace List<Task> with ConcurrentBag<Task> for _attachmentTasks; replace ContainsKey + TryAdd TOCTOU pattern with GetOrAdd for both AttachmentSets and _attachmentTasks
  • BlameCollector: Replace List<Guid> / Dictionary<Guid, BlameTestObject> with ConcurrentQueue / ConcurrentDictionary; use Interlocked.Increment for _testEndCount; snapshot collections before passing to WriteTestSequence
  • TrxLogger / HtmlLogger: Use Interlocked.Increment for all test counters (TotalTestCount, PassedTestCount, FailedTestCount, SkippedTests) to prevent lost updates under concurrent result arrival

✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Copilot AI mentioned this pull request Mar 19, 2026
Copilot AI changed the title [WIP] Fix thread safety issues and XXE vulnerability Fix thread safety issues in parallel test execution Mar 19, 2026
Copilot AI requested a review from nohwnd March 19, 2026 11:02
@nohwnd nohwnd marked this pull request as ready for review March 19, 2026 11:17
@nohwnd nohwnd merged commit bf0bc3e into fix/thread-safety-and-xxe-vulnerabilities Mar 19, 2026
4 checks passed
@nohwnd nohwnd deleted the copilot/sub-pr-15512 branch March 19, 2026 11:17
nohwnd added a commit that referenced this pull request Mar 19, 2026
* Fix thread safety in ParallelRunDataAggregator and DiscoveryDataAggregator

- GetAggregatedRunStats() now reads _testRunStatsList under lock
  to prevent InvalidOperationException from concurrent List<T>
  modification during enumeration
- AggregateRunDataMetrics()/AggregateMetrics() now uses
  ConcurrentDictionary.AddOrUpdate instead of TryGetValue+set to
  prevent lost-update race conditions
- Same fix applied to DiscoveryDataAggregator.AggregateMetrics()
- Added concurrency tests that exercise parallel Aggregate + read

* Fix thread safety in DataCollectionAttachmentManager

- Replace List<Task> with ConcurrentBag<Task> for _attachmentTasks
  to prevent corruption when concurrent file transfers call Add()
- Replace ContainsKey+TryAdd TOCTOU pattern with GetOrAdd for both
  AttachmentSets and _attachmentTasks dictionaries
- Existing ParallelAccessShouldNotBreak test covers this scenario

* Fix thread safety in BlameCollector

- Add lock around _testSequence and _testObjectDictionary mutations
  in EventsTestCaseStart and EventsTestCaseEnd to prevent corruption
  under parallel test execution
- Use Interlocked.Increment for _testStartCount and _testEndCount
- Take snapshot under lock in SessionEndedHandler before passing to
  WriteTestSequence
- Added concurrency test with 10 threads x 50 test events each

* Fix thread safety in TrxLogger and HtmlLogger test counters

- TrxLogger: use Interlocked.Increment for TotalTestCount,
  PassedTestCount, and FailedTestCount to prevent lost updates when
  test results arrive concurrently from parallel test runs
- HtmlLogger: same fix for TotalTests, PassedTests, FailedTests,
  SkippedTests counters
- Added thread safety test exercising 10 threads x 100 results each
  verifying exact counter values

* Fix XXE vulnerability in SettingsMigrator

- Set DtdProcessing = DtdProcessing.Prohibit on XmlTextReader in both
  MigrateRunSettings and ReadTestSettingsNodes to prevent XML External
  Entity attacks via crafted .runsettings/.testsettings files
- Set XmlResolver = null on XmlDocument instances
- Added tests verifying DTD content in both runsettings and
  testsettings files is rejected with XmlException

* Revert

* Initial plan (#15514)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>

---------

Co-authored-by: nohwnd <me@jakubjares.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants