From cc1f667c2b00e859aff06371d55671b41ddf7308 Mon Sep 17 00:00:00 2001 From: Ginger Date: Thu, 9 Jul 2026 17:22:36 -0400 Subject: [PATCH] fix: Cap max_depth to 50 in hierarchy endpoint --- src/service/rooms/summary/mod.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/service/rooms/summary/mod.rs b/src/service/rooms/summary/mod.rs index 08b6938f5..e617f6328 100644 --- a/src/service/rooms/summary/mod.rs +++ b/src/service/rooms/summary/mod.rs @@ -19,6 +19,7 @@ use ruma::{ }, room::{JoinRuleSummary, RestrictedSummary, RoomSummary}, serde::Raw, + uint, }; use crate::{Dep, rooms, sending}; @@ -188,6 +189,12 @@ impl Service { // This function traverses the space hierarchy tree depth-first as required by // the specification. + // Limit max depth to 50 to keep cycles in the space graph from blowing up the + // traversal. If you actually have over fifty nested spaces, and you're + // looking at this function to figure out what the issue is, I suggest + // you reconsider some of the choices you made which led you to this point. + let max_depth = max_depth.unwrap_or_else(|| uint!(50)); + // Check accessibility of the root room first, because we need to error out // if it isn't accessible. // TODO refactor this once the Try trait is stable @@ -259,7 +266,7 @@ impl Service { reason = "queue.len() should never be large enough to cause strange behavior \ here" )] - if max_depth.is_some_and(|max_depth| (queue.len() as u64 + 1) > max_depth.into()) { + if (queue.len() as u64 + 1) > max_depth.into() { continue; }