diff --git a/Changelog.md b/Changelog.md index 3f4ae2ec..3a5090d5 100644 --- a/Changelog.md +++ b/Changelog.md @@ -18,8 +18,12 @@ ### Bug Fixes +- [#624]: Fix corruption of parser state after cancelling of async reading. + ### Misc Changes +[#624]: https://github.com/tafia/quick-xml/issues/624 + ## 0.39.0 -- 2026-01-11 diff --git a/src/reader/mod.rs b/src/reader/mod.rs index e227e189..cb2d35c6 100644 --- a/src/reader/mod.rs +++ b/src/reader/mod.rs @@ -405,10 +405,15 @@ macro_rules! read_until_close { $reader:expr $(, $await:ident)? ) => {{ - $self.state.state = ParseState::InsideText; - let start = $self.state.offset; - match $reader.peek_one() $(.$await)? { + // It is important to change state only after .await point, because future + // may be cancelled only at .await points + // + // See https://github.com/tafia/quick-xml/issues/624 + let lookahead = $reader.peek_one() $(.$await)?; + + $self.state.state = ParseState::InsideText; + match lookahead { // ` match $reader .read_bang_element($buf, &mut $self.state.offset)