XMPP: _dispatch herverwerkt hele deferred-backlog per nieuwe stanza — O(N²) in worst-case #1424
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#1424
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Bevinding
lib/xmpp/xmpp_transport.dart—_dispatch(regels 282–309) wordt bij elke nieuwe op/lock-stanza aangeroepen (_onOpStanza,_onLockStanza). Elke aanroep:List<_DeferredStanza>.from(_deferred))_deferred(regel 300)Worst-case complexiteit
Als er N deferred stanzas in de backlog staan die niet geopend kunnen worden (bijv. de afzender is onbekend, of de epoch-sleutel is nog niet aanwezig), en er komen M nieuwe stanzas binnen, dan:
_dispatch-aanroep_dispatchverwerkt N + M stanzasMet
_maxDeferred = 256(regel 170) is de worst-case O(M × 256) — elke nieuwe stanza triggert 256 mislukte open-pogingen (elk met eendirectory.resolve+ eventuele crypto-operatie).Waarom dit in de praktijk slaat
Dit treedt op als een deelnemer stanzas ontvangt van een afzender wiens device-keys nog niet zijn gepubliceerd of geïngest — bijv. een newcomer die net is gejoind en stanzas ontvangt vóór zijn keyshare. De backlog vult zich, en elke nieuwe stanza (ook van bekende afzenders) triggert een herverwerking van de hele backlog. In een drukke kamer met veel stanzas per seconde kan dit de CPU belasten.
Trust boundary
Interne logica — geen externe aanvaller, maar een drukke kamer met trage keying volstaat.
Impact
_maxDeferralRounds = 16(regel 171) beperkt de duur (een stanza wordt na 16 ronden gedropt), maar niet de per-ronde kosten.Oplossingsrichting
syncNow(die al elke seconde draait) of door een signaal als de key-state verandert (een nieuwe device-key ingest of een epoch-sleutel geïnstalleerd). Dit reduceert de per-stanza-kosten tot O(1) voor de fresh stanza.ingestofinstallEpochKey), niet bij elke stanza. Dat is event-gedreven en elimineert de herverwerking volledig.Locatie
lib/xmpp/xmpp_transport.dartregels 282–309 (_dispatch), 170–171 (_maxDeferred,_maxDeferralRounds)Severity
MEDIUM — CPU-belasting in een drukke kamer met trage keying, beperkt door de caps maar O(N²) per definitie.