LibWeb/XML: Make namespace getter reject invalid qualified names

Names like ":hi", "wow:", or "a🅱️c" are invalid, so early-out instead
of searching our namespace stack for matching prefixes.

And also rename the function because it's relevant to attributes too.
This commit is contained in:
Sam Atkins 2025-04-11 15:36:53 +01:00
parent 7d797b2c32
commit c99aac4bf0
Notes: github-actions[bot] 2025-04-15 08:40:20 +00:00
2 changed files with 12 additions and 5 deletions

View file

@ -116,7 +116,7 @@ void XMLDocumentBuilder::element_start(const XML::Name& name, HashMap<XML::Name,
m_namespace_stack.last().depth += 1; m_namespace_stack.last().depth += 1;
} }
auto namespace_ = namespace_for_element(name); auto namespace_ = namespace_for_name(name);
auto qualified_name_or_error = DOM::validate_and_extract(m_document->realm(), namespace_, FlyString(MUST(String::from_byte_string(name)))); auto qualified_name_or_error = DOM::validate_and_extract(m_document->realm(), namespace_, FlyString(MUST(String::from_byte_string(name))));
@ -358,10 +358,17 @@ void XMLDocumentBuilder::document_end()
m_document->set_ready_for_post_load_tasks(true); m_document->set_ready_for_post_load_tasks(true);
} }
Optional<FlyString> XMLDocumentBuilder::namespace_for_element(XML::Name const& element_name) Optional<FlyString> XMLDocumentBuilder::namespace_for_name(XML::Name const& name)
{ {
Optional<ByteString> prefix; Optional<StringView> prefix;
if (auto parts = element_name.split_limit(':', 2); parts.size() == 2) {
auto parts = name.split_limit(':', 3);
if (parts.size() > 2)
return {};
if (parts.size() == 2) {
if (parts[0].is_empty() || parts[1].is_empty())
return {};
prefix = parts[0]; prefix = parts[0];
} }

View file

@ -38,7 +38,7 @@ private:
virtual void comment(StringView data) override; virtual void comment(StringView data) override;
virtual void document_end() override; virtual void document_end() override;
Optional<FlyString> namespace_for_element(XML::Name const& element_name); Optional<FlyString> namespace_for_name(XML::Name const&);
GC::Ref<DOM::Document> m_document; GC::Ref<DOM::Document> m_document;
GC::Ptr<DOM::Node> m_current_node; GC::Ptr<DOM::Node> m_current_node;