feat: add router cycle detection to prevent infinite loops#183
Open
aprici7y wants to merge 1 commit intopillarjs:masterfrom
Open
feat: add router cycle detection to prevent infinite loops#183aprici7y wants to merge 1 commit intopillarjs:masterfrom
aprici7y wants to merge 1 commit intopillarjs:masterfrom
Conversation
Router cycles cause silent runtime hangs when a router is mounted on itself (directly or indirectly). This change detects such cycles and emits a warning to help developers identify the issue quickly. The implementation: - Detects cycles in Router.prototype.use before mounting - Uses recursive traversal with visited set to avoid infinite loops - Detects both direct self-mounts and indirect cycles - Emits process warning but keeps behavior unchanged (warn-only) - Can be turned into an error in future major version Tests added for: - Direct self-loop (router.use(router)) - Indirect cycle (routerA -> routerB -> routerA) - Nested indirect cycles (routerA -> routerB -> routerC -> routerA) - Ensuring non-cyclic mounts don't trigger warnings - Verifying behavior remains unchanged (mount succeeds with warning) Related to expressjs/express#6809
IlyasShabi
reviewed
Dec 3, 2025
| * @private | ||
| */ | ||
|
|
||
| function detectRouterCycle (parentRouter, childRouter, visited) { |
There was a problem hiding this comment.
You run this function each time, so why not adding a Set/Map to avoid repetitive code?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Detects when a router is mounted on itself (directly or indirectly) and emits a warning to help developers identify cycles that cause requests to hang indefinitely.
When a router is mounted on itself through a chain of routers, requests that traverse the cycle hang indefinitely and eventually cause a stack overflow. This is difficult to debug because the application appears to work fine until a request hits the cyclic path.
This implements cycle detection in Router.prototype.use that:
Manual Test
Fixes expressjs/express#6809