groovy-sandbox
groovy-sandbox copied to clipboard
Stack overflow on long chained method calls
Consider the following test:
{
interceptedEval("'blah'.toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()" +
".toString().toString().toString().toString().toString().toString()"
)
}```
This will result in a stack overflow here https://github.com/jenkinsci/groovy-sandbox/blob/master/src/main/java/org/kohsuke/groovy/sandbox/SandboxTransformer.java#L396 since all the left hand side expression needs to be resolved before you can evaluate the last `toString()`.
The solution is to unroll the recursion, however this is easier said than done.