@@ -252,6 +252,21 @@ mod derived {
252
252
assert ! ( verify_overflowing_encoded_len( encoded_len, expected_len) ) ;
253
253
}
254
254
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
+
255
270
#[ test]
256
271
#[ cfg_attr( target_pointer_width = "32" , should_panic) ]
257
272
fn encoded_len_can_overflow_u32_with_string ( ) {
@@ -271,6 +286,22 @@ mod derived {
271
286
assert ! ( verify_overflowing_encoded_len( encoded_len, expected_len) ) ;
272
287
}
273
288
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
+
274
305
#[ test]
275
306
#[ cfg_attr( target_pointer_width = "32" , should_panic) ]
276
307
fn encoded_len_can_overflow_u32_with_bytes ( ) {
0 commit comments