From 9d9a577942e80122cb28e6eb7cde07d30179a484 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Mon, 2 Apr 2018 11:22:00 +0100 Subject: [PATCH] Properly compute size of messages with long packed field fields Fix issue #281 --- protobuf-test/src/common/v2/test_repeated_packed.rs | 11 +++++++++++ .../src/common/v2/test_repeated_packed_pb.proto | 4 ++++ protobuf/src/codegen/field.rs | 4 ++-- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/protobuf-test/src/common/v2/test_repeated_packed.rs b/protobuf-test/src/common/v2/test_repeated_packed.rs index 3831c779d..b67ce7748 100644 --- a/protobuf-test/src/common/v2/test_repeated_packed.rs +++ b/protobuf-test/src/common/v2/test_repeated_packed.rs @@ -70,3 +70,14 @@ fn test_read_packed_to_packed() { test.set_sfixed32s([17i32, 1000].to_vec()); test_deserialize("2a 08 11 00 00 00 e8 03 00 00", &test); } + +#[test] +fn test_issue_281() { + // Data len len was incorrectly computed. + // For 100 elements, bytes len is 400 + // and varint len of 400 is 2, + // while varint len of 100 is 1. + let mut test = TestIssue281::new(); + test.set_values((0..100).collect()); + test_serialize_deserialize_no_hex(&test); +} diff --git a/protobuf-test/src/common/v2/test_repeated_packed_pb.proto b/protobuf-test/src/common/v2/test_repeated_packed_pb.proto index 20011aa39..dafec2524 100644 --- a/protobuf-test/src/common/v2/test_repeated_packed_pb.proto +++ b/protobuf-test/src/common/v2/test_repeated_packed_pb.proto @@ -7,3 +7,7 @@ message TestUnpacked { repeated int32 varints = 4 [packed=false]; repeated sfixed32 sfixed32s = 5 [packed=false]; } + +message TestIssue281 { + repeated fixed32 values = 1 [packed=true]; +} diff --git a/protobuf/src/codegen/field.rs b/protobuf/src/codegen/field.rs index 9842e490b..3df95b823 100644 --- a/protobuf/src/codegen/field.rs +++ b/protobuf/src/codegen/field.rs @@ -1318,9 +1318,9 @@ impl<'a> FieldGen<'a> { fn self_field_vec_packed_fixed_size(&self) -> String { // zero is filtered outside format!( - "{} + ::protobuf::rt::compute_raw_varint32_size({}.len() as u32) + {}", + "{} + ::protobuf::rt::compute_raw_varint32_size({}) + {}", self.tag_size(), - self.self_field(), + self.self_field_vec_packed_fixed_data_size(), self.self_field_vec_packed_fixed_data_size() ) }