java-topology/defects/strawberry/patch/strawberry-0002-scrobblercache-flush-contains.patch

34 lines
1.4 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# UNDF: UNDF-2026-000000840
# UNDF: (leave blank)
# CWE-407: ScrobblerCache::Flush QList.contains/removeAll O(F×C)
#
# In ScrobblerCache::Flush(), the method iterates cache_items (F items)
# and for each calls scrobbler_cache_.contains() + removeAll() on a
# QList<ScrobblerCacheItemPtr>. Both contains() and removeAll() are O(C)
# on the QList, making the total cost O(F×C).
#
# For a scrobbler cache with 1000 pending scrobbles being flushed after
# a batch submit, this is ~1,000,000 pointer comparisons + list shuffles.
#
# Fix: build a QSet of items to remove, then use a single-pass filter
# to remove all matching items in O(F + C).
#
# Severity: MEDIUM (scrobbler flush, batch operation after network submit)
# Speedup: ~250x at F=C=1000
--- a/src/scrobbler/scrobblercache.cpp
+++ b/src/scrobbler/scrobblercache.cpp
@@ -295,7 +295,6 @@
void ScrobblerCache::Flush(ScrobblerCacheItemPtrList cache_items) {
- for (ScrobblerCacheItemPtr cache_item : cache_items) {
- if (scrobbler_cache_.contains(cache_item)) {
- scrobbler_cache_.removeAll(cache_item);
- }
- }
+ QSet<ScrobblerCacheItemPtr> to_remove(cache_items.begin(), cache_items.end());
+ scrobbler_cache_.erase(
+ std::remove_if(scrobbler_cache_.begin(), scrobbler_cache_.end(),
+ [&to_remove](const ScrobblerCacheItemPtr &item) { return to_remove.contains(item); }),
+ scrobbler_cache_.end());
if (!timer_flush_->isActive()) {