AngleSharp / AngleSharp

:angel: The ultimate angle brackets parser library parsing HTML5, MathML, SVG and CSS to construct a DOM based on the official W3C specifications.

Home Page:https://anglesharp.github.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

HtmlParser.Parse throws InvalidOperationException

Metalnem opened this issue · comments

HtmlParser.Parse throws InvalidOperationException on some HTML inputs. Here's the full program to reproduce one such case:

using AngleSharp.Parser.Html;

namespace AngleSharp.Run
{
  public class Program
  {
    public static void Main(string[] args)
    {
      string html = @"<svg><!DOCTYPE html><<template>html><desc><template>><p>p</p></body></html>";
      new HtmlParser().Parse(html);
    }
  }
}

And here is the stack trace:

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Collections.dll: 'Stack empty.'
   at System.Collections.Generic.Stack`1.ThrowForEmptyStack()
   at System.Collections.Generic.Stack`1.Peek()
   at AngleSharp.Parser.Html.HtmlParserExtensions.SelectMode(Element element, Boolean isLast, Stack`1 templateModes)
   at AngleSharp.Parser.Html.HtmlDomBuilder.Reset()
   at AngleSharp.Parser.Html.HtmlDomBuilder.InTemplate(HtmlToken token)
   at AngleSharp.Parser.Html.HtmlDomBuilder.InBody(HtmlToken token)
   at AngleSharp.Parser.Html.HtmlDomBuilder.Parse(HtmlParserOptions options)
   at AngleSharp.Run.Program.Main(String[] args) in 

Found via SharpFuzz.

Hi @Metalnem please report all found cases. It is sufficient to report the HTML source, e.g.,

<svg><!DOCTYPE html><<template>html><desc><template>><p>p</p></body></html>

Thanks for the report!

They are all very similar, and will result in the same exception. I've found five different ones so far:

<svg><!DOCTYPE html><<template>html><desc><template>><p>p</p></body></html>

<svg><!DOCTYPE html><html><template><desc><template>><p>p</p></body></html>

<svg><!DOCTYPE html><<<template>tml><desc><template>><p>p</p></body></html>

<svg><!DOCTYPE html><<frameset>h<template>tml><desc><template>><p>p</p></body></html>

<svg><!DOCTYPE html><template>>html><desc><template>><p>p</p></body></html><pre>