Skip to content

Commit 37c4258

Browse files
committed
test: derived encoded_len, only checked fields
Add a test Protobuf message that only has unlimited length fields, to check that the derived encoded_len method implementation is correct in this case, confirmed with a few test cases.
1 parent 4901e1a commit 37c4258

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

Diff for: tests/overflow/src/encoded_len.proto

+5
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ message Testbed {
3333
map<uint32, int32> map = 19;
3434
}
3535

36+
message TwoUnlimited {
37+
repeated Empty repeated_empty = 536870911; // MAX_TAG
38+
string string = 16;
39+
}
40+
3641
message Empty {}
3742

3843
enum BadEnum {

Diff for: tests/overflow/src/encoded_len/overflow.rs

+31
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,21 @@ mod derived {
252252
assert!(verify_overflowing_encoded_len(encoded_len, expected_len));
253253
}
254254

255+
#[test]
256+
#[cfg_attr(target_pointer_width = "32", should_panic)]
257+
fn encoded_len_can_overflow_u32_all_checked_with_repeated_field() {
258+
let filler = proto::Empty {};
259+
let filler_len = message::encoded_len(MAX_TAG, &filler);
260+
let supercritical = vec![filler; u32::MAX as usize / filler_len + 1];
261+
let expected_len = supercritical.len() as u64 * filler_len as u64;
262+
let bomb32 = proto::TwoUnlimited {
263+
repeated_empty: supercritical,
264+
..Default::default()
265+
};
266+
let encoded_len = bomb32.encoded_len();
267+
assert!(verify_overflowing_encoded_len(encoded_len, expected_len));
268+
}
269+
255270
#[test]
256271
#[cfg_attr(target_pointer_width = "32", should_panic)]
257272
fn encoded_len_can_overflow_u32_with_string() {
@@ -271,6 +286,22 @@ mod derived {
271286
assert!(verify_overflowing_encoded_len(encoded_len, expected_len));
272287
}
273288

289+
#[test]
290+
#[cfg_attr(target_pointer_width = "32", should_panic)]
291+
fn encoded_len_can_overflow_u32_all_checked_with_string() {
292+
let filler = proto::Empty {};
293+
let filler_len = message::encoded_len(MAX_TAG, &filler);
294+
let padding = vec![filler; u32::MAX as usize / filler_len];
295+
let padding_len = padding.len() * filler_len;
296+
let bomb32 = proto::TwoUnlimited {
297+
repeated_empty: padding,
298+
string: " ".repeat(filler_len - 2 - 1),
299+
};
300+
let encoded_len = bomb32.encoded_len();
301+
let expected_len = padding_len as u64 + filler_len as u64;
302+
assert!(verify_overflowing_encoded_len(encoded_len, expected_len));
303+
}
304+
274305
#[test]
275306
#[cfg_attr(target_pointer_width = "32", should_panic)]
276307
fn encoded_len_can_overflow_u32_with_bytes() {

0 commit comments

Comments
 (0)