Ensure limits for prev and auth events are respected.

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk
2026-03-06 23:06:29 +00:00
parent 513c1184fe
commit 3fa22ea9d9
3 changed files with 28 additions and 19 deletions

View File

@@ -11,7 +11,7 @@ use ruma::{
}; };
use tuwunel_core::{ use tuwunel_core::{
debug, debug_error, debug_warn, implement, debug, debug_error, debug_warn, implement,
matrix::{PduEvent, event::gen_event_id_canonical_json}, matrix::{PduEvent, event::gen_event_id_canonical_json, pdu::MAX_AUTH_EVENTS},
trace, trace,
utils::stream::{BroadbandExt, IterStream, ReadyExt}, utils::stream::{BroadbandExt, IterStream, ReadyExt},
warn, warn,
@@ -181,23 +181,16 @@ async fn fetch_auth_chain(
); );
} }
if let Some(auth_events) = value value
.get("auth_events") .get("auth_events")
.and_then(CanonicalJsonValue::as_array) .and_then(CanonicalJsonValue::as_array)
{ .into_iter()
for auth_event in auth_events { .flatten()
match serde_json::from_value::<OwnedEventId>(auth_event.clone().into()) { .filter_map(|auth_event| auth_event.try_into().ok())
| Ok(auth_event) => { .take(MAX_AUTH_EVENTS)
todo_auth_events.push_back(auth_event); .for_each(|auth_event: &EventId| {
}, todo_auth_events.push_back(auth_event.to_owned());
| _ => { });
warn!("Auth event id is not valid");
},
}
}
} else {
warn!("Auth event list invalid");
}
events_in_reverse_order.push((next_id.clone(), value)); events_in_reverse_order.push((next_id.clone(), value));
events_all.insert(next_id); events_all.insert(next_id);

View File

@@ -7,7 +7,7 @@ use ruma::{
}; };
use tuwunel_core::{ use tuwunel_core::{
Result, debug_warn, err, implement, Result, debug_warn, err, implement,
matrix::{Event, PduEvent}, matrix::{Event, PduEvent, pdu::MAX_PREV_EVENTS},
utils::stream::IterStream, utils::stream::IterStream,
}; };
@@ -91,6 +91,11 @@ where
if pdu.origin_server_ts() > first_ts_in_room { if pdu.origin_server_ts() > first_ts_in_room {
amount = amount.saturating_add(1); amount = amount.saturating_add(1);
debug_assert!(
pdu.prev_events().count() <= MAX_PREV_EVENTS,
"PduEvent {prev_event_id} has too many prev_events"
);
for prev_prev in pdu.prev_events() { for prev_prev in pdu.prev_events() {
if graph.contains_key(prev_prev) { if graph.contains_key(prev_prev) {
continue; continue;
@@ -136,5 +141,16 @@ where
.await .await
.map_err(|e| err!(Database(error!("Error sorting prev events: {e}"))))?; .map_err(|e| err!(Database(error!("Error sorting prev events: {e}"))))?;
debug_assert_eq!(
sorted.len(),
graph.len(),
"topological sort returned a different number of outputs than inputs"
);
debug_assert!(
sorted.len() >= eventid_info.len(),
"returned topologically sorted events differ from eventid_info"
);
Ok((sorted, eventid_info)) Ok((sorted, eventid_info))
} }

View File

@@ -110,7 +110,7 @@ pub async fn handle_incoming_pdu<'a>(
let room_version = room_version::from_create_event(create_event)?; let room_version = room_version::from_create_event(create_event)?;
let (incoming_pdu, val) = self let (incoming_pdu, pdu) = self
.handle_outlier_pdu(origin, room_id, event_id, pdu, &room_version, false) .handle_outlier_pdu(origin, room_id, event_id, pdu, &room_version, false)
.await?; .await?;
@@ -183,7 +183,7 @@ pub async fn handle_incoming_pdu<'a>(
origin, origin,
room_id, room_id,
incoming_pdu, incoming_pdu,
val, pdu,
&room_version, &room_version,
create_event.event_id(), create_event.event_id(),
) )