New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Stackoverflow error in reader.rb in Asciidoctor 2.0.17 #4368
Comments
In order to address this, I need a sample document. Without that, I have no way to develop or verify a fix. |
Ok, then I'll close this issue as I won't be able to retrieve it as this is not available from the automatic error report. |
It looks like an infinite loop between: asciidoctor/lib/asciidoctor/reader.rb Line 137 in 102f364
and: asciidoctor/lib/asciidoctor/reader.rb Line 652 in 102f364
I can reproduce it using the following document (in Intellij IDEA): ifeval::[2 > 3]
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
endif::[]
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data |
Using the Asciidoctor Browser Extension, I get a weird error:
You need to add more lines in the
And we get more or less the same error in Asciidoctor.js:
|
If I try that document with Asciidoctor (core), I don't see any problems. Can you submit a test to demonstrate the problem? And if so, do you have any idea why it might be happening (if it is happening in core?). |
Add a few thousand lines in the |
|
I believe this is the recursive call between |
Okay, I see it now. If the contents of the ifeval is big enough, we hit the stack level depth limit in Ruby. This seems to be one of those academic problems that would never happen in the real world. And we are able to rely on the interpreter to prevent abuse if this is the result of an attack. We expect it to fail because it is asking the program to do something unreasonable. |
FYI, the exact number of lines it fails in Ruby 3.2.1 is 4666. |
Okay, I understand what's going on. To find the next line to process, the reader uses recursion. There are recursion limits in Ruby. Hence why we run out of stack. The fix (I think) would be to switch to a while loop in the case that process_line returns nil. That would short-circuit the recursive calls and allow the reader to find the next line to process. |
(4)666 😈 😈 😈 😈 |
Thank you @Mogztter for creating a snippet to reproduce it! I assume this is happening to a user when editing a document with a non-closing |
It's not about whether ifeval is open or closed. The logic the processor uses to find the next line to process is recursive. And there are recursive limits in Ruby. (We've actually hit this before). The user was pushing the processor to the extreme because it can only happen if they had more than 4666 lines inside the ifeval. |
...but I see what you're saying. If you open a very large document, then add I'm going to take a shot at unwrapping this recursive call. But if someone else has an idea, then please give it a go. |
…cate next line to process
So the situation is that the stack limit equates to the number of lines Asciidoctor can process in a preprocessor conditional that evaluates to false. The mistake was to use recursion for this scenario. I have submitted a proposed change to replays the current loop until a line is found, thus avoiding the overhead of a stack. |
…cate next line to process
…cate next line to process
…cate next line to process
Thanks @ahus1 for making us aware of this problem and thanks to @Mogztter for demonstrating how it can be reproduced. Nice team work! |
A user of the AsciiDoc plugin for IntelliJ reported anonymously the following exception via the Sentry error reporter.
I don't know the input that caused this, still I hope this stack trace reals helpful information.
Looking at the classes this happens with Asciidoctor 2.0.17.
The text was updated successfully, but these errors were encountered: