@@ -1279,10 +1279,12 @@ fn append_long_multibyte() {
1279
1279
let mut x = tar:: Builder :: new ( Vec :: new ( ) ) ;
1280
1280
let mut name = String :: new ( ) ;
1281
1281
let data: & [ u8 ] = & [ ] ;
1282
+ let mut header = Header :: new_gnu ( ) ;
1283
+ header. set_size ( data. len ( ) as u64 ) ;
1282
1284
for _ in 0 ..512 {
1283
1285
name. push ( 'a' ) ;
1284
1286
name. push ( '𑢮' ) ;
1285
- x. append_data ( & mut Header :: new_gnu ( ) , & name, data) . unwrap ( ) ;
1287
+ x. append_data ( & mut header , & name, data) . unwrap ( ) ;
1286
1288
name. pop ( ) ;
1287
1289
}
1288
1290
}
@@ -1385,3 +1387,31 @@ fn header_size_overflow() {
1385
1387
err
1386
1388
) ;
1387
1389
}
1390
+
1391
+ #[ test]
1392
+ fn file_contents_appended_after_header_creation ( ) {
1393
+ let mut data = String :: from ( "Hello" ) ;
1394
+
1395
+ let mut header = Header :: new_gnu ( ) ;
1396
+ header. set_size ( data. len ( ) as u64 ) ;
1397
+ header. set_cksum ( ) ;
1398
+
1399
+ // Additional data is appended after header creation
1400
+ data. push_str ( ", World!" ) ;
1401
+
1402
+ let mut ar = Builder :: new ( Vec :: new ( ) ) ;
1403
+ t ! ( ar. append_data( & mut header, "test2" , data. as_bytes( ) ) ) ;
1404
+
1405
+ let raw = t ! ( ar. into_inner( ) ) ;
1406
+ let mut ar = Archive :: new ( Cursor :: new ( raw) ) ;
1407
+ let mut entries = t ! ( ar. entries( ) ) ;
1408
+ let entry = t ! ( entries. next( ) . unwrap( ) ) ;
1409
+ let offset = entry. raw_file_position ( ) ;
1410
+ let mut raw = ar. into_inner ( ) ;
1411
+
1412
+ let mut s = String :: new ( ) ;
1413
+ raw. set_position ( offset) ;
1414
+ t ! ( raw. read_to_string( & mut s) ) ;
1415
+ let s = s. trim_end_matches ( char:: from ( 0 ) ) ;
1416
+ assert_eq ! ( s, "Hello" ) ;
1417
+ }
0 commit comments