mirror of
https://github.com/nushell/nushell.git
synced 2025-08-09 13:56:10 +02:00
Limit recursion to avoid stack overflow (#7657)
Add recursion limit to `def` and `block`. Summary of this PR , it will detect if `def` call itself or not . Then execute by using `stack` which I think best choice to use with this design and core as it is available in all crates and mutable and calculate the recursion limit on calling `def`. Set 50 as recursion limit on `Config`. Add some tests too . Fixes #5899 Co-authored-by: Reilly Wood <reilly.wood@icloud.com>
This commit is contained in:
committed by
GitHub
parent
9bc4e6794d
commit
00469de93e
@ -876,6 +876,21 @@ pub fn eval_block(
|
||||
redirect_stdout: bool,
|
||||
redirect_stderr: bool,
|
||||
) -> Result<PipelineData, ShellError> {
|
||||
// if Block contains recursion, make sure we don't recurse too deeply (to avoid stack overflow)
|
||||
if let Some(recursive) = block.recursive {
|
||||
// picked 50 arbitrarily, should work on all architectures
|
||||
const RECURSION_LIMIT: u64 = 50;
|
||||
if recursive {
|
||||
if *stack.recursion_count >= RECURSION_LIMIT {
|
||||
stack.recursion_count = Box::new(0);
|
||||
return Err(ShellError::RecursionLimitReached {
|
||||
recursion_limit: RECURSION_LIMIT,
|
||||
span: block.span,
|
||||
});
|
||||
}
|
||||
*stack.recursion_count += 1;
|
||||
}
|
||||
}
|
||||
let num_pipelines = block.len();
|
||||
for (pipeline_idx, pipeline) in block.pipelines.iter().enumerate() {
|
||||
let mut i = 0;
|
||||
|
Reference in New Issue
Block a user