From 5c7e45e94d1f56d44e5170aa63d9e184234e2449 Mon Sep 17 00:00:00 2001
From: Philipp Korber
Date: Tue, 26 Mar 2019 16:01:12 +0100
Subject: fix(internals): max line length error breached triggered wrongly
- if the soft line length limit was breached and braking the line
failed and the buffer had already reached a certain size a
hard line length limit breached error was triggered (but should
not have)
---
internals/src/encoder/mod.rs | 40 +++++++++++++++++++++++++++++++++-------
1 file changed, 33 insertions(+), 7 deletions(-)
diff --git a/internals/src/encoder/mod.rs b/internals/src/encoder/mod.rs
index 8903899..760da2f 100644
--- a/internals/src/encoder/mod.rs
+++ b/internals/src/encoder/mod.rs
@@ -721,13 +721,13 @@ impl<'inner> EncodingWriter<'inner> {
}
if self.current_line_byte_length() >= LINE_LEN_SOFT_LIMIT {
- if !self.break_line_on_fws() {
- if self.buffer.len() == LINE_LEN_HARD_LIMIT {
- ec_bail!(
- mail_type: self.mail_type(),
- kind: HardLineLengthLimitBreached
- );
- }
+ self.break_line_on_fws();
+
+ if self.current_line_byte_length() >= LINE_LEN_HARD_LIMIT {
+ ec_bail!(
+ mail_type: self.mail_type(),
+ kind: HardLineLengthLimitBreached
+ );
}
}
@@ -1097,6 +1097,32 @@ mod test {
assert_eq!(encoder.as_slice(), b"H: a\r\n");
}
+ #[test]
+ fn soft_line_limit_can_be_breached() {
+ let mut encoder = EncodingBuffer::new(MailType::Ascii);
+ {
+ let mut handle = encoder.writer();
+ for _ in 0u32..500 {
+ assert_ok!(handle.internal_write_char("a"));
+ }
+ handle.finish_header();
+ }
+ }
+
+ #[test]
+ fn hard_line_limit_can_not_be_breached() {
+ let mut encoder = EncodingBuffer::new(MailType::Ascii);
+ {
+ let mut handle = encoder.writer();
+ for _ in 0u32..998 {
+ assert_ok!(handle.internal_write_char("a"));
+ }
+
+ assert_err!(handle.internal_write_char("b"));
+ handle.finish_header();
+ }
+ }
+
#[test]
fn break_line_on_fws() {
let mut encoder = EncodingBuffer::new(MailType::Ascii);
--
cgit v1.2.3