Markdown.ToHtml throws IndexOutOfRangeException for lastBlock in GetCurrentDefinitionList #712

Closed
opened 2026-01-29 14:43:40 +00:00 by claunia · 0 comments
Owner

Originally created by @mschessler on GitHub (Jan 1, 2025).

Tested Version: newest commit d1233ffe66 on main

I did not really take a closer look why this is happening but the problem is DefinitionListParser.GetCurrentDefinitionList() calling previousParent with index = -1 if the lastBlock is a BlankLineBlock.

if (lastBlock is BlankLineBlock)
{
    lastBlock = previousParent[index - 1];
    previousParent.RemoveAt(index);
}

Casting -1 to an unsigned int is then problematic.

grafik

Reproducer:

var pipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions().Build();
var result = Markdown.ToHtml("+\r\n\r\n+\r\n\r\n\t\f\r\n~\t", pipeline);

or

var pipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions().Build();
var result = Markdown.ToHtml("- \r\n\r\n\t\f\r\n~\t", pipeline);

Stacktrace:

ThrowHelper removed for Stacktrace.

at Markdig.Syntax.ContainerBlock.get_Item(Int32 index) in \src\Markdig\Syntax\ContainerBlock.cs:line 220
at Markdig.Extensions.DefinitionLists.DefinitionListParser.GetCurrentDefinitionList(ParagraphBlock paragraphBlock, ContainerBlock previousParent) in \src\Markdig\Extensions\DefinitionLists\DefinitionListParser.cs:line 111
at Markdig.Extensions.DefinitionLists.DefinitionListParser.TryOpen(BlockProcessor processor) in \src\Markdig\Extensions\DefinitionLists\DefinitionListParser.cs:line 53
at Markdig.Parsers.BlockProcessor.TryOpenBlocks(BlockParser[] parsers) in \src\Markdig\Parsers\BlockProcessor.cs:line 821
at Markdig.Parsers.BlockProcessor.TryOpenBlocks() in \src\Markdig\Parsers\BlockProcessor.cs:line 763
at Markdig.Parsers.BlockProcessor.ProcessLine(StringSlice newLine) in \src\Markdig\Parsers\BlockProcessor.cs:line 501
at Markdig.Parsers.MarkdownParser.ProcessBlocks(BlockProcessor blockProcessor, String text) in \src\Markdig\Parsers\MarkdownParser.cs:line 113
at Markdig.Parsers.MarkdownParser.Parse(String text, MarkdownPipeline pipeline, MarkdownParserContext context) in \src\Markdig\Parsers\MarkdownParser.cs:line 56
at Markdig.Markdown.ToHtml(String markdown, MarkdownPipeline pipeline, MarkdownParserContext context) in \src\Markdig\Markdown.cs:line 101
at FuzzTest.Program.Main(String[] args) in \FuzzingTargets\MarkdigFuzzer\Program.cs:line 14

Originally created by @mschessler on GitHub (Jan 1, 2025). Tested Version: newest commit d1233ffe66dae3944375b78d2b05d966cd597070 on main I did not really take a closer look why this is happening but the problem is DefinitionListParser.GetCurrentDefinitionList() calling previousParent with index = -1 if the lastBlock is a BlankLineBlock. ``` if (lastBlock is BlankLineBlock) { lastBlock = previousParent[index - 1]; previousParent.RemoveAt(index); } ``` Casting -1 to an unsigned int is then problematic. ![grafik](https://github.com/user-attachments/assets/e61d59cf-6064-4589-801f-98611cbce1a3) ### **Reproducer:** ``` var pipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions().Build(); var result = Markdown.ToHtml("+\r\n\r\n+\r\n\r\n\t\f\r\n~\t", pipeline); ``` or ``` var pipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions().Build(); var result = Markdown.ToHtml("- \r\n\r\n\t\f\r\n~\t", pipeline); ``` ### **Stacktrace:** _ThrowHelper removed for Stacktrace._ > at Markdig.Syntax.ContainerBlock.get_Item(Int32 index) in \src\Markdig\Syntax\ContainerBlock.cs:line 220 > at Markdig.Extensions.DefinitionLists.DefinitionListParser.GetCurrentDefinitionList(ParagraphBlock paragraphBlock, ContainerBlock previousParent) in \src\Markdig\Extensions\DefinitionLists\DefinitionListParser.cs:line 111 > at Markdig.Extensions.DefinitionLists.DefinitionListParser.TryOpen(BlockProcessor processor) in \src\Markdig\Extensions\DefinitionLists\DefinitionListParser.cs:line 53 > at Markdig.Parsers.BlockProcessor.TryOpenBlocks(BlockParser[] parsers) in \src\Markdig\Parsers\BlockProcessor.cs:line 821 > at Markdig.Parsers.BlockProcessor.TryOpenBlocks() in \src\Markdig\Parsers\BlockProcessor.cs:line 763 > at Markdig.Parsers.BlockProcessor.ProcessLine(StringSlice newLine) in \src\Markdig\Parsers\BlockProcessor.cs:line 501 > at Markdig.Parsers.MarkdownParser.ProcessBlocks(BlockProcessor blockProcessor, String text) in \src\Markdig\Parsers\MarkdownParser.cs:line 113 > at Markdig.Parsers.MarkdownParser.Parse(String text, MarkdownPipeline pipeline, MarkdownParserContext context) in \src\Markdig\Parsers\MarkdownParser.cs:line 56 > at Markdig.Markdown.ToHtml(String markdown, MarkdownPipeline pipeline, MarkdownParserContext context) in \src\Markdig\Markdown.cs:line 101 > at FuzzTest.Program.Main(String[] args) in \FuzzingTargets\MarkdigFuzzer\Program.cs:line 14
claunia added the bugPR Welcome! labels 2026-01-29 14:43:40 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/markdig#712