From 1eebb00ac2b318cc897183a0a31018efbed449fd Mon Sep 17 00:00:00 2001 From: Kartikaya Gupta Date: Wed, 31 Jul 2019 21:50:25 -0400 Subject: =?UTF-8?q?Skip=20past=20unterminated=20=3D=3F=20escape=20string?= This fixes a panic where we stupidly advance our byte index by 2 when encountering an unterminated escape. Doing this is inefficient because we'll probably just find the same unterminated escape a bunch of times, but can also put our byte index in the middle of a UTF-8 character which causes a panic. Fixes #41 --- src/lib.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 7af26bc..87bac95 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -229,6 +229,7 @@ impl<'a> MailHeader<'a> { } None => { result.push_str(&"=?"); + ix_search = ix_begin - 2; } }; break; @@ -1418,4 +1419,15 @@ mod tests { _ => assert!(false), }; } + + #[test] + fn test_fuzzer_testcase() { + const INPUT: &'static str = "U3ViamVjdDplcy1UeXBlOiBtdW50ZW50LVV5cGU6IW11bAAAAAAAAAAAamVjdDplcy1UeXBlOiBtdW50ZW50LVV5cGU6IG11bAAAAAAAAAAAAAAAAABTTUFZdWJqZf86OiP/dCBTdWJqZWN0Ol8KRGF0ZTog/////////////////////wAAAAAAAAAAAHQgYnJmAHQgYnJmZXItRW5jeXBlOnY9NmU3OjA2OgAAAAAAAAAAAAAAADEAAAAAAP/8mAAAAAAAAAAA+f///wAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAPT0/PzEAAAEAAA=="; + + if let Ok(parsed) = parse_mail(&base64::decode(INPUT).unwrap()) { + if let Ok(Some(date)) = parsed.headers.get_first_value("Date") { + let _ = dateparse(&date); + } + } + } } -- cgit v1.2.3