Skip to content

Commit 32ef64b

Browse files
authored
follow on updates to new MarkdownParser (#2926)
1 parent efd000f commit 32ef64b

2 files changed

Lines changed: 18 additions & 2 deletions

File tree

  • tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src

tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/markdown/MarkdownParser.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,13 @@ public class MarkdownParser extends AbstractEncodingDetectorParser {
9797
private static final List<Extension> EXTENSIONS =
9898
List.of(TablesExtension.create(), StrikethroughExtension.create());
9999

100-
//immutable and thread-safe
101-
private static final Parser COMMONMARK = Parser.builder().extensions(EXTENSIONS).build();
100+
//immutable and thread-safe.
101+
//maxOpenBlockParsers caps block nesting: deeper blocks are parsed as flat paragraph text
102+
//rather than nested structure, so a pathologically deep block document still extracts.
103+
//Kept below SecureContentHandler's 100-level element-nesting cap so the flattened output
104+
//stays under that limit and is emitted rather than rejected as a suspected zip bomb.
105+
private static final Parser COMMONMARK =
106+
Parser.builder().extensions(EXTENSIONS).maxOpenBlockParsers(64).build();
102107

103108
public MarkdownParser() {
104109
super();
@@ -123,6 +128,9 @@ public void parse(TikaInputStream tis, ContentHandler handler, Metadata metadata
123128
metadata.set(Metadata.CONTENT_TYPE, new MediaType(MARKDOWN, charset).toString());
124129
metadata.set(Metadata.CONTENT_ENCODING, charset.name());
125130
document = COMMONMARK.parseReader(reader);
131+
} catch (StackOverflowError e) {
132+
//for reasons
133+
throw new TikaException("Markdown is too deeply nested to parse", e);
126134
}
127135

128136
XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context);

tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/test/java/org/apache/tika/parser/markdown/MarkdownParserTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,14 @@ public void testDataURIsBecomeEmbeddedDocuments() throws Exception {
115115
metadataList.get(1).get(TikaCoreProperties.EMBEDDED_RESOURCE_TYPE));
116116
}
117117

118+
@Test
119+
public void testDeeplyNestedBlocksAreFlattenedNotFailed() throws Exception {
120+
//maxOpenBlockParsers caps block nesting below SecureContentHandler's 100-level limit,
121+
//so a pathologically deep block document extracts (deeper nesting flattened to text)
122+
//rather than being rejected as a suspected zip bomb or overflowing the stack.
123+
assertContains("deep", parseString("> ".repeat(5000) + "deep\n").xml);
124+
}
125+
118126
@Test
119127
public void testRoundTripsBackToMarkdown() throws Exception {
120128
String markdown = "# Title\n\nSome **bold** and *italic* and ~~struck~~ `inline`.\n";

0 commit comments

Comments
 (0)