Skip to content

Introduce PartialRecursionDepthLimit#552

Merged
oformaniuk merged 3 commits intoHandlebars-Net:masterfrom
RoosterDragon:recursion-limit
Apr 1, 2024
Merged

Introduce PartialRecursionDepthLimit#552
oformaniuk merged 3 commits intoHandlebars-Net:masterfrom
RoosterDragon:recursion-limit

Conversation

@RoosterDragon
Copy link
Contributor

When evaluating templates with partials, it is possible to recurse in the evaluation of those partials. This can be useful for dealing with tree like data, such as rendering a list of friends-of-friends-of-friends-of-etc....

The ability to recurse can lead to stack overflows. For example if a sufficiently deep tree is provided as input data, or more simply if the partial calls itself in an infinite loop. As a stack overflow terminates the process, this is not desirable behaviour as it is an unavoidable crash.

To resolve this a configurable PartialRecursionDepthLimit is introduced, defaulting to 100. Now when a template is evaluated a HandlebarsRuntimeException will be thrown if this limit is reached. This allows the caller to catch the exception and recover gracefully, rather than terminating the process.

When evaluating templates with partials, it is possible to recurse in the evaluation of those partials. This can be useful for dealing with tree like data, such as rendering a list of friends-of-friends-of-friends-of-etc....

The ability to recurse can lead to stack overflows. For example if a sufficiently deep tree is provided as input data, or more simply if the partial calls itself in an infinite loop. As a stack overflow terminates the process, this is not desirable behaviour as it is an unavoidable crash.

To resolve this a configurable PartialRecursionDepthLimit is introduced, defaulting to 100. Now when a template is evaluated a HandlebarsRuntimeException will be thrown if this limit is reached. This allows the caller to catch the exception and recover gracefully, rather than terminating the process.
@sonarqubecloud
Copy link

Kudos, SonarCloud Quality Gate passed!    Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 0 Code Smells

95.5% 95.5% Coverage
0.0% 0.0% Duplication

@oformaniuk oformaniuk enabled auto-merge April 1, 2024 01:39
@oformaniuk oformaniuk added the bug label Apr 1, 2024
@sonarqubecloud
Copy link

sonarqubecloud bot commented Apr 1, 2024

@oformaniuk oformaniuk merged commit f3fd1ef into Handlebars-Net:master Apr 1, 2024
@RoosterDragon RoosterDragon deleted the recursion-limit branch April 1, 2024 08:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants