From 9fafd50368557e26de82637ab00e52c11c140366 Mon Sep 17 00:00:00 2001 From: Yoonchae Lee Date: Thu, 19 Sep 2024 12:41:52 +0900 Subject: [PATCH] Fix DOCTYPE closing tag recognition in bufread --- src/reader/mod.rs | 7 +++++-- tests/issues.rs | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/reader/mod.rs b/src/reader/mod.rs index 9a81e90e..53647b22 100644 --- a/src/reader/mod.rs +++ b/src/reader/mod.rs @@ -1088,10 +1088,13 @@ impl BangType { Self::DocType => { for i in memchr::memchr_iter(b'>', chunk) { let content = &chunk[..i]; - let balance = memchr::memchr2_iter(b'<', b'>', content) + let balance_buf = memchr::memchr2_iter(b'<', b'>', buf) + .map(|p| if buf[p] == b'<' { 1i32 } else { -1 }) + .sum::(); + let balance_content = memchr::memchr2_iter(b'<', b'>', content) .map(|p| if content[p] == b'<' { 1i32 } else { -1 }) .sum::(); - if balance == 0 { + if balance_buf + balance_content == 0 { return Some((content, i + 1)); // +1 for `>` } } diff --git a/tests/issues.rs b/tests/issues.rs index 95dd64ff..17fea178 100644 --- a/tests/issues.rs +++ b/tests/issues.rs @@ -477,3 +477,19 @@ fn issue776() { Event::End(BytesEnd::new(r#"tag attr=">""#)) ); } + +/// Regression test for https://github.com/tafia/quick-xml/issues/801 +#[test] +fn issue801() { + let xml = BufReader::with_capacity(4, b"]>" as &[u8]); + let mut reader = Reader::from_reader(xml); + let mut buf = Vec::new(); + loop { + buf.clear(); + match reader.read_event_into(&mut buf) { + Err(e) => panic!("Error at position {}: {:?}", reader.error_position(), e), + Ok(Event::Eof) => {break} + Ok(_) => {} + } + } +} \ No newline at end of file