This is an automated email from the ASF dual-hosted git repository.
tballison pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git
The following commit(s) were added to refs/heads/main by this push:
new 32ef64bc07 follow on updates to new MarkdownParser (#2926)
32ef64bc07 is described below
commit 32ef64bc0703971ce837b11ea639c07c42c38546
Author: Tim Allison <[email protected]>
AuthorDate: Tue Jul 7 11:18:57 2026 -0400
follow on updates to new MarkdownParser (#2926)
---
.../java/org/apache/tika/parser/markdown/MarkdownParser.java | 12 ++++++++++--
.../org/apache/tika/parser/markdown/MarkdownParserTest.java | 8 ++++++++
2 files changed, 18 insertions(+), 2 deletions(-)
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/markdown/MarkdownParser.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/markdown/MarkdownParser.java
index 1c3266a7b4..2a91c69061 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/markdown/MarkdownParser.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java/org/apache/tika/parser/markdown/MarkdownParser.java
@@ -97,8 +97,13 @@ public class MarkdownParser extends
AbstractEncodingDetectorParser {
private static final List<Extension> EXTENSIONS =
List.of(TablesExtension.create(), StrikethroughExtension.create());
- //immutable and thread-safe
- private static final Parser COMMONMARK =
Parser.builder().extensions(EXTENSIONS).build();
+ //immutable and thread-safe.
+ //maxOpenBlockParsers caps block nesting: deeper blocks are parsed as flat
paragraph text
+ //rather than nested structure, so a pathologically deep block document
still extracts.
+ //Kept below SecureContentHandler's 100-level element-nesting cap so the
flattened output
+ //stays under that limit and is emitted rather than rejected as a
suspected zip bomb.
+ private static final Parser COMMONMARK =
+
Parser.builder().extensions(EXTENSIONS).maxOpenBlockParsers(64).build();
public MarkdownParser() {
super();
@@ -123,6 +128,9 @@ public class MarkdownParser extends
AbstractEncodingDetectorParser {
metadata.set(Metadata.CONTENT_TYPE, new MediaType(MARKDOWN,
charset).toString());
metadata.set(Metadata.CONTENT_ENCODING, charset.name());
document = COMMONMARK.parseReader(reader);
+ } catch (StackOverflowError e) {
+ //for reasons
+ throw new TikaException("Markdown is too deeply nested to parse",
e);
}
XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata,
context);
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/test/java/org/apache/tika/parser/markdown/MarkdownParserTest.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/test/java/org/apache/tika/parser/markdown/MarkdownParserTest.java
index 88bcb14448..dfe8ffd5b8 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/test/java/org/apache/tika/parser/markdown/MarkdownParserTest.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/test/java/org/apache/tika/parser/markdown/MarkdownParserTest.java
@@ -115,6 +115,14 @@ public class MarkdownParserTest extends TikaTest {
metadataList.get(1).get(TikaCoreProperties.EMBEDDED_RESOURCE_TYPE));
}
+ @Test
+ public void testDeeplyNestedBlocksAreFlattenedNotFailed() throws Exception
{
+ //maxOpenBlockParsers caps block nesting below SecureContentHandler's
100-level limit,
+ //so a pathologically deep block document extracts (deeper nesting
flattened to text)
+ //rather than being rejected as a suspected zip bomb or overflowing
the stack.
+ assertContains("deep", parseString("> ".repeat(5000) + "deep\n").xml);
+ }
+
@Test
public void testRoundTripsBackToMarkdown() throws Exception {
String markdown = "# Title\n\nSome **bold** and *italic* and
~~struck~~ `inline`.\n";