From bdb3f557acde26712388aba5ebebe6d24100e2f0 Mon Sep 17 00:00:00 2001 From: stammw Date: Thu, 31 Jan 2019 19:58:03 +0100 Subject: [PATCH] QPACK: fix a prefi_int bug when integer encoding has a perfect fit --- quinn-h3/src/qpack/prefix_int.rs | 7 ++++++- quinn-h3/src/qpack/prefix_string/encode.rs | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/quinn-h3/src/qpack/prefix_int.rs b/quinn-h3/src/qpack/prefix_int.rs index 1b4099597..fd5048719 100644 --- a/quinn-h3/src/qpack/prefix_int.rs +++ b/quinn-h3/src/qpack/prefix_int.rs @@ -58,7 +58,7 @@ pub fn encode(size: u8, flags: u8, value: usize, buf: &mut B) { buf.write(mask | flags); let mut remaining = value - mask as usize; - while remaining > 128 { + while remaining >= 128 { let rest = (remaining % 128) as u8; buf.write(rest + 128); remaining /= 128; @@ -138,4 +138,9 @@ mod test { let mut read = Cursor::new(&buf); assert!(super::decode(8, &mut read).is_err()); } + + #[test] + fn number_never_ends_with_0x80() { + check_codec(4, 0b0001, 143, &[31, 128, 1]); + } } diff --git a/quinn-h3/src/qpack/prefix_string/encode.rs b/quinn-h3/src/qpack/prefix_string/encode.rs index 2dfd43ef3..9ee4798dc 100644 --- a/quinn-h3/src/qpack/prefix_string/encode.rs +++ b/quinn-h3/src/qpack/prefix_string/encode.rs @@ -56,7 +56,9 @@ impl HuffmanEncoder { self.buffer.reserve(((7 * end_range.byte) / 4) as usize); } - while self.buffer.len() <= end_range.byte as usize { + let forward = + end_range.byte as usize - self.buffer.len() + if end_range.bit > 0 { 1 } else { 0 }; + for _ in 0..forward { // push filler value that will ends huffman decoding if not // modified self.buffer.push(255);