groovy-sandbox icon indicating copy to clipboard operation
groovy-sandbox copied to clipboard

Stack overflow on long chained method calls

Open ulises opened this issue 6 years ago • 0 comments

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.

ulises avatar Nov 07 '18 09:11 ulises