From 2baa575374a21267a59a9d522eafef913e534bbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=96R=C3=96K=20Attila?= Date: Wed, 19 Jun 2024 00:24:09 +0200 Subject: [PATCH 1/2] chore: Update quick-xml to 0.35.0 --- Cargo.lock | 13 +++++++++++-- core/Cargo.toml | 2 +- core/src/avm1/globals/xml.rs | 12 +++++++++--- core/src/avm2/e4x.rs | 12 +++++++----- core/src/html/text_format.rs | 7 +++++-- 5 files changed, 33 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f5a6e7b8bf8f..bc801114fa75 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3976,6 +3976,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "quick-xml" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86e446ed58cef1bbfe847bc2fda0e2e4ea9f0e57b90c507d4781292590d72a4e" +dependencies = [ + "memchr", +] + [[package]] name = "quinn" version = "0.11.2" @@ -4366,7 +4375,7 @@ dependencies = [ "num-traits", "percent-encoding", "png", - "quick-xml", + "quick-xml 0.35.0", "rand", "realfft", "regress", @@ -6211,7 +6220,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67da50b9f80159dec0ea4c11c13e24ef9e7574bd6ce24b01860a175010cea565" dependencies = [ "proc-macro2", - "quick-xml", + "quick-xml 0.31.0", "quote", ] diff --git a/core/Cargo.toml b/core/Cargo.toml index f636864df07c..664293f1ccd3 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -29,7 +29,7 @@ bitflags = { workspace = true } smallvec = { version = "1.13.2", features = ["union"] } num-traits = { workspace = true } num-derive = { workspace = true } -quick-xml = "0.31.0" +quick-xml = "0.35.0" downcast-rs = "1.2.1" url = { workspace = true } weak-table = "0.3.2" diff --git a/core/src/avm1/globals/xml.rs b/core/src/avm1/globals/xml.rs index 033755c5081f..1f52baf0abf9 100644 --- a/core/src/avm1/globals/xml.rs +++ b/core/src/avm1/globals/xml.rs @@ -11,6 +11,7 @@ use crate::context::GcContext; use crate::string::{AvmString, WStr, WString}; use crate::xml::{custom_unescape, XmlNode, ELEMENT_NODE, TEXT_NODE}; use gc_arena::{Collect, GcCell, Mutation}; +use quick_xml::errors::IllFormedError; use quick_xml::events::attributes::AttrError; use quick_xml::{events::Event, Reader}; @@ -141,13 +142,18 @@ impl<'gc> Xml<'gc> { loop { let event = parser.read_event().map_err(|error| { self.0.write(activation.context.gc_context).status = match error { - quick_xml::Error::UnexpectedEof(_) + quick_xml::Error::Syntax(_) | quick_xml::Error::InvalidAttr(AttrError::ExpectedEq(_)) | quick_xml::Error::InvalidAttr(AttrError::Duplicated(_, _)) => { XmlStatus::ElementMalformed } - quick_xml::Error::EndEventMismatch { .. } => XmlStatus::MismatchedEnd, - quick_xml::Error::XmlDeclWithoutVersion(_) => XmlStatus::DeclNotTerminated, + quick_xml::Error::IllFormed( + IllFormedError::MismatchedEndTag { .. } + | IllFormedError::UnmatchedEndTag { .. }, + ) => XmlStatus::MismatchedEnd, + quick_xml::Error::IllFormed(IllFormedError::MissingDeclVersion(_)) => { + XmlStatus::DeclNotTerminated + } quick_xml::Error::InvalidAttr(AttrError::UnquotedValue(_)) => { XmlStatus::AttributeNotTerminated } diff --git a/core/src/avm2/e4x.rs b/core/src/avm2/e4x.rs index eb655edf7d85..0d972f001917 100644 --- a/core/src/avm2/e4x.rs +++ b/core/src/avm2/e4x.rs @@ -5,6 +5,7 @@ use std::{ use gc_arena::{Collect, GcCell, Mutation}; use quick_xml::{ + errors::SyntaxError as XmlSyntaxError, events::{attributes::AttrError as XmlAttrError, BytesStart, Event}, name::ResolveResult, Error as XmlError, NsReader, @@ -59,23 +60,24 @@ fn make_xml_error<'gc>(activation: &mut Activation<'_, 'gc>, err: XmlError) -> E "Error #1104: Attribute was already specified for element.", 1104, ), - XmlError::UnexpectedEof(currently_parsing) => match currently_parsing.as_str() { - "CData" => type_error( + + XmlError::Syntax(syntax_error) => match syntax_error { + XmlSyntaxError::UnclosedCData => type_error( activation, "Error #1091: XML parser failure: Unterminated CDATA section.", 1091, ), - "DOCTYPE" => type_error( + XmlSyntaxError::UnclosedDoctype => type_error( activation, "Error #1093: XML parser failure: Unterminated DOCTYPE declaration.", 1093, ), - "Comment" => type_error( + XmlSyntaxError::UnclosedComment => type_error( activation, "Error #1094: XML parser failure: Unterminated comment.", 1094, ), - "XmlDecl" => type_error( + XmlSyntaxError::UnclosedPIOrXmlDecl => type_error( activation, "Error #1097: XML parser failure: Unterminated processing instruction.", 1097, diff --git a/core/src/html/text_format.rs b/core/src/html/text_format.rs index 8c97d3090a53..62180367b82c 100644 --- a/core/src/html/text_format.rs +++ b/core/src/html/text_format.rs @@ -671,8 +671,11 @@ impl FormatSpans { let mut last_closed_font: Option = None; let mut reader = Reader::from_reader(&raw_bytes[..]); - reader.expand_empty_elements(true); - reader.check_end_names(false); + let reader_config = reader.config_mut(); + reader_config.expand_empty_elements = true; + reader_config.check_end_names = false; + reader_config.allow_unmatched_ends = true; + loop { match reader.read_event() { Ok(Event::Start(ref e)) => { From 0fc509110604b09a5d128b33e394e7b51df047c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=96R=C3=96K=20Attila?= Date: Thu, 20 Jun 2024 15:59:13 +0200 Subject: [PATCH 2/2] tests: No longer mark the Error1090XmlElementMalformed AVMPlus test as a known failure --- .../as3/RuntimeErrors/Error1090XmlElementMalformed/test.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/tests/swfs/from_avmplus/as3/RuntimeErrors/Error1090XmlElementMalformed/test.toml b/tests/tests/swfs/from_avmplus/as3/RuntimeErrors/Error1090XmlElementMalformed/test.toml index 29f3cef79022..cf6123969a1d 100644 --- a/tests/tests/swfs/from_avmplus/as3/RuntimeErrors/Error1090XmlElementMalformed/test.toml +++ b/tests/tests/swfs/from_avmplus/as3/RuntimeErrors/Error1090XmlElementMalformed/test.toml @@ -1,2 +1 @@ num_ticks = 1 -known_failure = true