From db89a7e813708c851a1402d067bc87868f8575a0 Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Thu, 12 May 2022 13:09:57 +0100 Subject: [PATCH] Sort and unique --- roomserver/internal/input/input_latest_events.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/roomserver/internal/input/input_latest_events.go b/roomserver/internal/input/input_latest_events.go index eb6bd7f75..a780f3f09 100644 --- a/roomserver/internal/input/input_latest_events.go +++ b/roomserver/internal/input/input_latest_events.go @@ -233,11 +233,16 @@ func (u *latestEventsUpdater) latestState() error { } } - // Get a list of the current latest events. This may or may not - // include the new event from the input path, depending on whether - // it is a forward extremity or not. - combinedExtremities := types.StateAtEventAndReferences(append(u.latest, u.oldLatest...)) - util.Unique(combinedExtremities) + // Take the old set of extremities and the new set of extremities and + // mash them together into a list. This may or may not include the new event + // from the input path, depending on whether it became a forward extremity + // or not. We'll then run state resolution across all of them to determine + // the new current state of the room. Including the old extremities here + // ensures that new forward extremities with bad state snapshots (from + // possible malicious actors) can't completely corrupt the room state + // away from what it was before. + combinedExtremities := types.StateAtEventAndReferences(append(u.oldLatest, u.latest...)) + util.SortAndUnique(combinedExtremities) latestStateAtEvents := make([]types.StateAtEvent, len(combinedExtremities)) for i := range combinedExtremities { latestStateAtEvents[i] = combinedExtremities[i].StateAtEvent