Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
# CHANGELOG

0.2.12 (TBD)
============
TODO
0.2.12 (2025-05-03)
===================
This release fixes a couple bugs in Jiff's parser. In particular, a regression
was introduced in `jiff 0.2.11` where its RFC 2822 parser could panic on some
inputs. Previous releases of Jiff are unaffected.

Bug fixes:

* [#357](https://github.com/BurntSushi/jiff/issues/357):
Fix a bug where parsing `1970-06-01T00-00:45:00[Africa/Monrovia]` succeeded
but it should fail.
* [#359](https://github.com/BurntSushi/jiff/issues/359):
Fix a bug where the RFC 2822 parser could panic on some inputs.


0.2.11 (2025-05-01)
Expand Down
32 changes: 24 additions & 8 deletions src/fmt/rfc2822.rs
Original file line number Diff line number Diff line change
Expand Up @@ -554,15 +554,19 @@ impl DateTimeParser {
}
};
let Parsed { input, .. } = self.skip_whitespace(&input[3..]);
if input[0] != b',' {
let Some(should_be_comma) = input.get(0).copied() else {
return Err(err!(
"expected day at beginning of RFC 2822 datetime \
since first non-whitespace byte, {first:?}, \
is not a digit, but found {got:?} after parsed \
weekday {wd:?} and expected a comma",
first = escape::Byte(b1),
got = escape::Byte(input[0]),
wd = escape::Bytes(&[b1, b2, b3]),
"expected comma after parsed weekday `{weekday}` in \
RFC 2822 datetime, but found end of string instead",
weekday = escape::Bytes(&[b1, b2, b3]),
));
};
if should_be_comma != b',' {
return Err(err!(
"expected comma after parsed weekday `{weekday}` in \
RFC 2822 datetime, but found `{got:?}` instead",
weekday = escape::Bytes(&[b1, b2, b3]),
got = escape::Byte(should_be_comma),
));
}
let Parsed { input, .. } = self.skip_whitespace(&input[1..]);
Expand Down Expand Up @@ -1786,6 +1790,18 @@ mod tests {
p("Wed"),
@r###"failed to parse RFC 2822 datetime into Jiff zoned datetime: expected day at beginning of RFC 2822 datetime since first non-whitespace byte, "W", is not a digit, but given string is too short (length is 3)"###,
);
insta::assert_snapshot!(
p("Wed "),
@"failed to parse RFC 2822 datetime into Jiff zoned datetime: expected comma after parsed weekday `Wed` in RFC 2822 datetime, but found end of string instead",
);
insta::assert_snapshot!(
p("Wed ,"),
@"failed to parse RFC 2822 datetime into Jiff zoned datetime: expected day, but found end of input",
);
insta::assert_snapshot!(
p("Wed , "),
@"failed to parse RFC 2822 datetime into Jiff zoned datetime: expected day, but found end of input",
);
insta::assert_snapshot!(
p("Wat, "),
@r###"failed to parse RFC 2822 datetime into Jiff zoned datetime: expected day at beginning of RFC 2822 datetime since first non-whitespace byte, "W", is not a digit, but did not recognize "Wat" as a valid weekday abbreviation"###,
Expand Down
Loading