@@ -292,12 +292,13 @@ pub struct ExtendedFileOptions {
292292
293293impl ExtendedFileOptions {
294294 /// Adds an extra data field, unless we detect that it's invalid.
295- pub fn add_extra_data (
295+ pub fn add_extra_data < D : AsRef < [ u8 ] > > (
296296 & mut self ,
297297 header_id : u16 ,
298- data : Box < [ u8 ] > ,
298+ data : D ,
299299 central_only : bool ,
300300 ) -> ZipResult < ( ) > {
301+ let data = data. as_ref ( ) ;
301302 let len = data. len ( ) + 4 ;
302303 if self . extra_data . len ( ) + self . central_extra_data . len ( ) + len > u16:: MAX as usize {
303304 Err ( invalid ! ( "Extra data field would be longer than allowed" ) )
@@ -324,12 +325,12 @@ impl ExtendedFileOptions {
324325 pub ( crate ) fn add_extra_data_unchecked (
325326 vec : & mut Vec < u8 > ,
326327 header_id : u16 ,
327- data : Box < [ u8 ] > ,
328+ data : & [ u8 ] ,
328329 ) -> Result < ( ) , ZipError > {
329330 vec. reserve_exact ( data. len ( ) + 4 ) ;
330331 vec. write_u16_le ( header_id) ?;
331332 vec. write_u16_le ( data. len ( ) as u16 ) ?;
332- vec. write_all ( & data) ?;
333+ vec. write_all ( data) ?;
333334 Ok ( ( ) )
334335 }
335336
@@ -535,10 +536,10 @@ impl<T: FileOptionExtension> FileOptions<'_, T> {
535536}
536537impl FileOptions < ' _ , ExtendedFileOptions > {
537538 /// Adds an extra data field.
538- pub fn add_extra_data (
539+ pub fn add_extra_data < D : AsRef < [ u8 ] > > (
539540 & mut self ,
540541 header_id : u16 ,
541- data : Box < [ u8 ] > ,
542+ data : D ,
542543 central_only : bool ,
543544 ) -> ZipResult < ( ) > {
544545 self . extended_options
@@ -931,27 +932,22 @@ impl<W: Write + Seek> ZipWriter<W> {
931932 let mut aes_extra_data_start = 0 ;
932933 #[ cfg( feature = "aes-crypto" ) ]
933934 if let Some ( EncryptWith :: Aes { mode, .. } ) = options. encrypt_with {
934- let aes_dummy_extra_data =
935- vec ! [ 0x02 , 0x00 , 0x41 , 0x45 , mode as u8 , 0x00 , 0x00 ] . into_boxed_slice ( ) ;
935+ let aes_dummy_extra_data = [ 0x02 , 0x00 , 0x41 , 0x45 , mode as u8 , 0x00 , 0x00 ] ;
936936 aes_extra_data_start = extra_data. len ( ) as u64 ;
937937 ExtendedFileOptions :: add_extra_data_unchecked (
938938 & mut extra_data,
939939 0x9901 ,
940- aes_dummy_extra_data,
940+ & aes_dummy_extra_data,
941941 ) ?;
942942 } else if let Some ( ( mode, vendor, underlying) ) = options. aes_mode {
943943 // For raw copies of AES entries, write the correct AES extra data immediately
944- let mut body = Vec :: with_capacity ( 7 ) ;
945- body. write_u16_le ( vendor as u16 ) ? ; // vendor version (1 or 2)
946- body. extend_from_slice ( b"AE" ) ; // vendor id
947- body. push ( mode as u8 ) ; // strength
948- body. write_u16_le ( underlying. serialize_to_u16 ( ) ) ? ; // real compression method
944+ let mut body = [ 0 ; 7 ] ;
945+ [ body[ 0 ] , body [ 1 ] ] = ( vendor as u16 ) . to_le_bytes ( ) ; // vendor version (1 or 2)
946+ [ body[ 2 ] , body [ 3 ] ] = * b"AE" ; // vendor id
947+ body[ 4 ] = mode as u8 ; // strength
948+ [ body[ 5 ] , body [ 6 ] ] = underlying. serialize_to_u16 ( ) . to_le_bytes ( ) ; // real compression method
949949 aes_extra_data_start = extra_data. len ( ) as u64 ;
950- ExtendedFileOptions :: add_extra_data_unchecked (
951- & mut extra_data,
952- 0x9901 ,
953- body. into_boxed_slice ( ) ,
954- ) ?;
950+ ExtendedFileOptions :: add_extra_data_unchecked ( & mut extra_data, 0x9901 , & body) ?;
955951 }
956952
957953 let ( compression_method, aes_mode) = match options. encrypt_with {
@@ -981,11 +977,7 @@ impl<W: Write + Seek> ZipWriter<W> {
981977 let mut pad_body = vec ! [ 0 ; pad_length - 4 ] ;
982978 debug_assert ! ( pad_body. len( ) >= 2 ) ;
983979 [ pad_body[ 0 ] , pad_body[ 1 ] ] = options. alignment . to_le_bytes ( ) ;
984- ExtendedFileOptions :: add_extra_data_unchecked (
985- & mut extra_data,
986- 0xa11e ,
987- pad_body. into_boxed_slice ( ) ,
988- ) ?;
980+ ExtendedFileOptions :: add_extra_data_unchecked ( & mut extra_data, 0xa11e , & pad_body) ?;
989981 debug_assert_eq ! ( ( extra_data. len( ) as u64 + header_end) % align, 0 ) ;
990982 }
991983 }
0 commit comments