@@ -1248,13 +1248,40 @@ fn tar_directory_containing_special_files() {
1248
1248
1249
1249
#[ test]
1250
1250
fn header_size_overflow ( ) {
1251
+ // maximal file size doesn't overflow anything
1251
1252
let mut ar = Builder :: new ( Vec :: new ( ) ) ;
1252
1253
let mut header = Header :: new_gnu ( ) ;
1253
- header. set_size ( 0xffffffffffffffff ) ;
1254
+ header. set_size ( u64 :: MAX ) ;
1254
1255
header. set_cksum ( ) ;
1255
1256
ar. append ( & mut header, "x" . as_bytes ( ) ) . unwrap ( ) ;
1256
1257
let result = t ! ( ar. into_inner( ) ) ;
1257
1258
let mut ar = Archive :: new ( & result[ ..] ) ;
1258
1259
let mut e = ar. entries ( ) . unwrap ( ) ;
1259
- assert ! ( e. next( ) . unwrap( ) . is_err( ) ) ;
1260
+ let err = e. next ( ) . unwrap ( ) . err ( ) . unwrap ( ) ;
1261
+ assert ! (
1262
+ err. to_string( ) . contains( "size overflow" ) ,
1263
+ "bad error: {}" ,
1264
+ err
1265
+ ) ;
1266
+
1267
+ // back-to-back entries that would overflow also don't panic
1268
+ let mut ar = Builder :: new ( Vec :: new ( ) ) ;
1269
+ let mut header = Header :: new_gnu ( ) ;
1270
+ header. set_size ( 1_000 ) ;
1271
+ header. set_cksum ( ) ;
1272
+ ar. append ( & mut header, & [ 0u8 ; 1_000 ] [ ..] ) . unwrap ( ) ;
1273
+ let mut header = Header :: new_gnu ( ) ;
1274
+ header. set_size ( u64:: MAX - 513 ) ;
1275
+ header. set_cksum ( ) ;
1276
+ ar. append ( & mut header, "x" . as_bytes ( ) ) . unwrap ( ) ;
1277
+ let result = t ! ( ar. into_inner( ) ) ;
1278
+ let mut ar = Archive :: new ( & result[ ..] ) ;
1279
+ let mut e = ar. entries ( ) . unwrap ( ) ;
1280
+ e. next ( ) . unwrap ( ) . unwrap ( ) ;
1281
+ let err = e. next ( ) . unwrap ( ) . err ( ) . unwrap ( ) ;
1282
+ assert ! (
1283
+ err. to_string( ) . contains( "size overflow" ) ,
1284
+ "bad error: {}" ,
1285
+ err
1286
+ ) ;
1260
1287
}
0 commit comments