File tree 2 files changed +17
-2
lines changed
2 files changed +17
-2
lines changed Original file line number Diff line number Diff line change @@ -298,8 +298,10 @@ impl<'a> EntriesFields<'a> {
298
298
299
299
// Store where the next entry is, rounding up by 512 bytes (the size of
300
300
// a header);
301
- let size = ( size + 511 ) & !( 512 - 1 ) ;
302
- self . next += size;
301
+ let size = size
302
+ . checked_add ( 511 )
303
+ . ok_or_else ( || other ( "size overflow" ) ) ?;
304
+ self . next += size & !( 512 - 1 ) ;
303
305
304
306
Ok ( Some ( ret. into_entry ( ) ) )
305
307
}
Original file line number Diff line number Diff line change @@ -1245,3 +1245,16 @@ fn tar_directory_containing_special_files() {
1245
1245
t ! ( ar. append_path( "null" ) ) ;
1246
1246
t ! ( ar. finish( ) ) ;
1247
1247
}
1248
+
1249
+ #[ test]
1250
+ fn header_size_overflow ( ) {
1251
+ let mut ar = Builder :: new ( Vec :: new ( ) ) ;
1252
+ let mut header = Header :: new_gnu ( ) ;
1253
+ header. set_size ( 0xffffffffffffffff ) ;
1254
+ header. set_cksum ( ) ;
1255
+ ar. append ( & mut header, "x" . as_bytes ( ) ) . unwrap ( ) ;
1256
+ let result = t ! ( ar. into_inner( ) ) ;
1257
+ let mut ar = Archive :: new ( & result[ ..] ) ;
1258
+ let mut e = ar. entries ( ) . unwrap ( ) ;
1259
+ assert ! ( e. next( ) . unwrap( ) . is_err( ) ) ;
1260
+ }
You can’t perform that action at this time.
0 commit comments