commonmark-java icon indicating copy to clipboard operation
commonmark-java copied to clipboard

Stackoverflow while rendering ListItem

Open sperol69 opened this issue 3 months ago • 0 comments

Steps to reproduce the problem (provide example Markdown if applicable):

#Title
List:
1. 2. 3. -> until some jvm limit
end

Expected behavior: it renders

Actual behavior:

java.lang.StackOverflowError: null
	at java.base/java.util.LinkedList.addLast(Unknown Source)
	at org.commonmark.renderer.text.TextContentWriter.pushTight(TextContentWriter.java:73)
	at org.commonmark.renderer.text.CoreTextContentNodeRenderer.visit(CoreTextContentNodeRenderer.java:182)
	at org.commonmark.node.OrderedList.accept(OrderedList.java:22)
	at org.commonmark.renderer.text.CoreTextContentNodeRenderer.render(CoreTextContentNodeRenderer.java:54)
	at org.commonmark.internal.renderer.NodeRendererMap.render(NodeRendererMap.java:30)
	at org.commonmark.renderer.text.TextContentRenderer$RendererContext.render(TextContentRenderer.java:166)
	at org.commonmark.renderer.text.CoreTextContentNodeRenderer.visitChildren(CoreTextContentNodeRenderer.java:215)
	at org.commonmark.renderer.text.CoreTextContentNodeRenderer.visit(CoreTextContentNodeRenderer.java:167)
	at org.commonmark.node.ListItem.accept(ListItem.java:15)
	at org.commonmark.renderer.text.CoreTextContentNodeRenderer.render(CoreTextContentNodeRenderer.java:54)
	at org.commonmark.internal.renderer.NodeRendererMap.render(NodeRendererMap.java:30)
	at org.commonmark.renderer.text.TextContentRenderer$RendererContext.render(TextContentRenderer.java:166)
	at org.commonmark.renderer.text.CoreTextContentNodeRenderer.visitChildren(CoreTextContentNodeRenderer.java:215)
	at org.commonmark.renderer.text.CoreTextContentNodeRenderer.visit(CoreTextContentNodeRenderer.java:184)
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertAll;

import java.util.stream.Collectors;
import java.util.stream.IntStream;

import org.commonmark.node.Node;
import org.commonmark.parser.Parser;
import org.commonmark.renderer.text.LineBreakRendering;
import org.commonmark.renderer.text.TextContentRenderer;
import org.junit.jupiter.api.Test;

public class CommonMarkTest {

    String parse(String markdown) {
        Parser parser = Parser.builder() .build();

        Node document = parser.parse(markdown);
        TextContentRenderer renderer = TextContentRenderer.builder() //
                .lineBreakRendering(LineBreakRendering.COMPACT) //
                .build();
        return renderer.render(document);
    }

    @Test
    void listTest_inline_stackoverflow() {
        String hugeListItem = IntStream.range(1, 3000) //
                .mapToObj(i -> i + ".") //
                .collect(Collectors.joining(" "));
        assertThat(parse("""
                List:
                %s
                end""".formatted(hugeListItem))) //
                .isNotEmpty();
    }

}

sperol69 avatar Nov 18 '25 10:11 sperol69