Skip to content

Commit

Permalink
Properly compute size of messages with long packed field fields
Browse files Browse the repository at this point in the history
Fix issue #281
  • Loading branch information
stepancheg committed Apr 2, 2018
1 parent f7e7c75 commit 9d9a577
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 2 deletions.
11 changes: 11 additions & 0 deletions protobuf-test/src/common/v2/test_repeated_packed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
4 changes: 4 additions & 0 deletions protobuf-test/src/common/v2/test_repeated_packed_pb.proto
Original file line number Diff line number Diff line change
Expand Up @@ -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];
}
4 changes: 2 additions & 2 deletions protobuf/src/codegen/field.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()
)
}
Expand Down

0 comments on commit 9d9a577

Please sign in to comment.