From e791760098b6a9490e19af2b18a3e002f561973b Mon Sep 17 00:00:00 2001 From: Nik Clayton Date: Thu, 5 Mar 2020 11:51:15 +0100 Subject: [PATCH] THRIFT-5131: Require >= 1.1.4 of integer-encoding dependency Client: Rust Patch: Nik Clayton This closes #2045 Versions 1.1.0 - 1.1.3 of the integer-encoding crate had a bug where numbers larger than 0x4000_0000_0000_0000 would cause a panic during decoding. Add a test to be sure that numbers up to i64::maxvalue() encode and decode successfully. --- lib/rs/Cargo.toml | 2 +- lib/rs/src/protocol/compact.rs | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/lib/rs/Cargo.toml b/lib/rs/Cargo.toml index 0c71bab41..0626da8df 100644 --- a/lib/rs/Cargo.toml +++ b/lib/rs/Cargo.toml @@ -13,6 +13,6 @@ keywords = ["thrift"] [dependencies] ordered-float = "1.0" byteorder = "1.3" -integer-encoding = "1.0" +integer-encoding = ">=1.1.4" # https://issues.apache.org/jira/browse/THRIFT-5131 log = "0.4" threadpool = "1.7" diff --git a/lib/rs/src/protocol/compact.rs b/lib/rs/src/protocol/compact.rs index 3e17398a0..029f85041 100644 --- a/lib/rs/src/protocol/compact.rs +++ b/lib/rs/src/protocol/compact.rs @@ -714,6 +714,31 @@ mod tests { assert_eq_written_bytes!(o_prot, expected); } + #[test] + fn must_round_trip_upto_i64_maxvalue() { + // See https://issues.apache.org/jira/browse/THRIFT-5131 + for i in 0..64 { + let (mut i_prot, mut o_prot) = test_objects(); + let val: i64 = ((1u64 << i) - 1) as i64; + + o_prot + .write_field_begin(&TFieldIdentifier::new( + "val", + TType::I64, + 1 + )) + .unwrap(); + o_prot.write_i64(val).unwrap(); + o_prot.write_field_end().unwrap(); + o_prot.flush().unwrap(); + + copy_write_buffer_to_read_buffer!(o_prot); + + i_prot.read_field_begin().unwrap(); + assert_eq!(val, i_prot.read_i64().unwrap()); + } + } + #[test] fn must_round_trip_message_begin() { let (mut i_prot, mut o_prot) = test_objects();