From 7db16a0602c7afa8bc0111082433836e2b82122e Mon Sep 17 00:00:00 2001 From: tompro Date: Tue, 23 Dec 2025 00:47:42 +0100 Subject: [PATCH] avm2: Return correct error for unclosed tags --- Cargo.lock | 16 ++++++++++++---- Cargo.toml | 2 +- core/src/avm2/e4x.rs | 6 +++--- core/src/avm2/error.rs | 7 ++++++- .../output.ruffle.txt | 1 - .../Error1092XmlUnterminatedXmlDecl/test.toml | 1 - 6 files changed, 22 insertions(+), 11 deletions(-) delete mode 100644 tests/tests/swfs/from_avmplus/as3/RuntimeErrors/Error1092XmlUnterminatedXmlDecl/output.ruffle.txt diff --git a/Cargo.lock b/Cargo.lock index e944edf3edbe..22064c4e6c05 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3911,7 +3911,7 @@ checksum = "546b279bf0638ee811d9e47de2ca5b66575a543035d79fdf83959dd2f5c3b4c3" dependencies = [ "base64", "indexmap", - "quick-xml", + "quick-xml 0.37.5", "serde", "time", ] @@ -4098,6 +4098,14 @@ dependencies = [ "memchr", ] +[[package]] +name = "quick-xml" +version = "0.38.4" +source = "git+https://github.com/SuchAFuriousDeath/quick-xml?branch=unclosed-xml-decl-pi-split#cf623245cc204edfc19845fc3d5cb1cebb19541f" +dependencies = [ + "memchr", +] + [[package]] name = "quinn" version = "0.11.9" @@ -4422,7 +4430,7 @@ dependencies = [ "fnv", "gc-arena", "hashbrown 0.14.5", - "quick-xml", + "quick-xml 0.38.4", "regress", "ruffle_macros", "ruffle_wstr", @@ -4472,7 +4480,7 @@ dependencies = [ "num-traits", "percent-encoding", "png", - "quick-xml", + "quick-xml 0.38.4", "rand", "realfft", "regress", @@ -6348,7 +6356,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" dependencies = [ "proc-macro2", - "quick-xml", + "quick-xml 0.37.5", "quote", ] diff --git a/Cargo.toml b/Cargo.toml index 91690e440c6a..7a2e8314f979 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -75,7 +75,7 @@ num-traits = "0.2.19" serde = "1.0.228" thiserror = "2.0.17" url = "2.5.7" -quick-xml = "0.37.5" +quick-xml = { git = "https://github.com/SuchAFuriousDeath/quick-xml", branch = "unclosed-xml-decl-pi-split" } regress = { git = "https://github.com/ruffle-rs/regras3", rev = "5fcb02513c5ab4e00df4346459f5a8d0521d8fed" } # Make sure to match wasm-bindgen-cli version to this everywhere. wasm-bindgen = "=0.2.101" diff --git a/core/src/avm2/e4x.rs b/core/src/avm2/e4x.rs index 6e1149b3488a..6249a6446e67 100644 --- a/core/src/avm2/e4x.rs +++ b/core/src/avm2/e4x.rs @@ -886,7 +886,7 @@ impl<'gc> E4XNode<'gc> { push_childless_node(node, &mut open_tags, &mut top_level, activation); } // These are completely ignored by AVM2 - Event::Decl(_) | Event::DocType(_) => {} + Event::Decl(_) | Event::DocType(_) | Event::GeneralRef(_) => {} Event::Eof => break, } } @@ -923,7 +923,7 @@ impl<'gc> E4XNode<'gc> { .map_err(|e| make_xml_error(activation, e))?; let value = AvmString::new_utf8_bytes(activation.gc(), value_str.as_bytes()); - let (ns, local_name) = parser.resolve_attribute(attribute.key); + let (ns, local_name) = parser.resolver().resolve_attribute(attribute.key); let local_name = ruffle_wstr::from_utf8_bytes(local_name.into_inner()); let name = activation.strings().intern_wstr(local_name).into(); @@ -972,7 +972,7 @@ impl<'gc> E4XNode<'gc> { attribute_nodes.push(attribute); } - let (ns, local_name) = parser.resolve_element(bs.name()); + let (ns, local_name) = parser.resolver().resolve_attribute(bs.name()); let local_name = ruffle_wstr::from_utf8_bytes(local_name.into_inner()); let name = activation.strings().intern_wstr(local_name).into(); diff --git a/core/src/avm2/error.rs b/core/src/avm2/error.rs index 72ef6821dea6..001d182c2500 100644 --- a/core/src/avm2/error.rs +++ b/core/src/avm2/error.rs @@ -205,11 +205,16 @@ pub fn make_xml_error<'gc>(activation: &mut Activation<'_, 'gc>, err: XmlError) "Error #1094: XML parser failure: Unterminated comment.", 1094, ), - XmlSyntaxError::UnclosedPIOrXmlDecl => type_error( + XmlSyntaxError::UnclosedPI => type_error( activation, "Error #1097: XML parser failure: Unterminated processing instruction.", 1097, ), + XmlSyntaxError::UnclosedXmlDecl => type_error( + activation, + "Error #1092: XML parser failure: Unterminated XML declaration.", + 1092, + ), _ => type_error( activation, "Error #1090: XML parser failure: element is malformed.", diff --git a/tests/tests/swfs/from_avmplus/as3/RuntimeErrors/Error1092XmlUnterminatedXmlDecl/output.ruffle.txt b/tests/tests/swfs/from_avmplus/as3/RuntimeErrors/Error1092XmlUnterminatedXmlDecl/output.ruffle.txt deleted file mode 100644 index 2c8f80c3e8da..000000000000 --- a/tests/tests/swfs/from_avmplus/as3/RuntimeErrors/Error1092XmlUnterminatedXmlDecl/output.ruffle.txt +++ /dev/null @@ -1 +0,0 @@ -Runtime Error FAILED! expected: TypeError: Error #1092 got: TypeError: Error #1097 diff --git a/tests/tests/swfs/from_avmplus/as3/RuntimeErrors/Error1092XmlUnterminatedXmlDecl/test.toml b/tests/tests/swfs/from_avmplus/as3/RuntimeErrors/Error1092XmlUnterminatedXmlDecl/test.toml index 29f3cef79022..cf6123969a1d 100644 --- a/tests/tests/swfs/from_avmplus/as3/RuntimeErrors/Error1092XmlUnterminatedXmlDecl/test.toml +++ b/tests/tests/swfs/from_avmplus/as3/RuntimeErrors/Error1092XmlUnterminatedXmlDecl/test.toml @@ -1,2 +1 @@ num_ticks = 1 -known_failure = true