diff --git a/Userland/Libraries/LibWeb/SVG/AttributeParser.cpp b/Userland/Libraries/LibWeb/SVG/AttributeParser.cpp index fcefba110c..1a4da9a857 100644 --- a/Userland/Libraries/LibWeb/SVG/AttributeParser.cpp +++ b/Userland/Libraries/LibWeb/SVG/AttributeParser.cpp @@ -16,14 +16,17 @@ AttributeParser::AttributeParser(StringView source) { } -Vector AttributeParser::parse_path_data() +Vector AttributeParser::parse_path_data(StringView input) { - parse_whitespace(); - while (!done()) - parse_drawto(); - if (!m_instructions.is_empty() && m_instructions[0].type != PathInstructionType::Move) - VERIFY_NOT_REACHED(); - return m_instructions; + AttributeParser parser { input }; + parser.parse_whitespace(); + while (!parser.done()) + parser.parse_drawto(); + if (!parser.m_instructions.is_empty() && parser.m_instructions[0].type != PathInstructionType::Move) { + // Invalid. "A path data segment (if there is one) must begin with a "moveto" command." + return {}; + } + return parser.m_instructions; } Optional AttributeParser::parse_coordinate(StringView input) diff --git a/Userland/Libraries/LibWeb/SVG/AttributeParser.h b/Userland/Libraries/LibWeb/SVG/AttributeParser.h index 55b152750c..d276a2c9bc 100644 --- a/Userland/Libraries/LibWeb/SVG/AttributeParser.h +++ b/Userland/Libraries/LibWeb/SVG/AttributeParser.h @@ -35,19 +35,18 @@ struct PathInstruction { class AttributeParser final { public: - AttributeParser(StringView source); ~AttributeParser() = default; - Vector parse_path_data(); - static Optional parse_coordinate(StringView input); static Optional parse_length(StringView input); static Optional parse_positive_length(StringView input); static Vector parse_points(StringView input); + static Vector parse_path_data(StringView input); private: - void parse_drawto(); + AttributeParser(StringView source); + void parse_drawto(); void parse_moveto(); void parse_closepath(); void parse_lineto(); diff --git a/Userland/Libraries/LibWeb/SVG/SVGPathElement.cpp b/Userland/Libraries/LibWeb/SVG/SVGPathElement.cpp index bf64a60271..8387f031b2 100644 --- a/Userland/Libraries/LibWeb/SVG/SVGPathElement.cpp +++ b/Userland/Libraries/LibWeb/SVG/SVGPathElement.cpp @@ -93,7 +93,7 @@ void SVGPathElement::parse_attribute(const FlyString& name, const String& value) SVGGeometryElement::parse_attribute(name, value); if (name == "d") - m_instructions = AttributeParser(value).parse_path_data(); + m_instructions = AttributeParser::parse_path_data(value); } Gfx::Path& SVGPathElement::get_path()