@@ -19,9 +19,9 @@ pub(super) struct Header {
1919enum State {
2020 Fixed ( PartialBuffer < [ u8 ; 10 ] > ) ,
2121 ExtraLen ( PartialBuffer < [ u8 ; 2 ] > ) ,
22- Extra ( PartialBuffer < Vec < u8 > > ) ,
23- Filename ( Vec < u8 > ) ,
24- Comment ( Vec < u8 > ) ,
22+ Extra ( usize ) ,
23+ Filename ,
24+ Comment ,
2525 Crc ( PartialBuffer < [ u8 ; 2 ] > ) ,
2626 Done ,
2727}
@@ -78,59 +78,57 @@ impl Parser {
7878
7979 State :: ExtraLen ( data) => {
8080 if !self . header . flags . extra {
81- self . state = State :: Filename ( < _ > :: default ( ) ) ;
81+ self . state = State :: Filename ;
8282 continue ;
8383 }
8484
8585 data. copy_unwritten_from ( input) ;
8686
8787 if data. unwritten ( ) . is_empty ( ) {
8888 let len = u16:: from_le_bytes ( data. take ( ) . into_inner ( ) ) ;
89- self . state = State :: Extra ( vec ! [ 0 ; usize :: from ( len) ] . into ( ) ) ;
89+ self . state = State :: Extra ( len. into ( ) ) ;
9090 } else {
9191 return Ok ( None ) ;
9292 }
9393 }
9494
95- State :: Extra ( data) => {
96- data. copy_unwritten_from ( input) ;
95+ State :: Extra ( bytes_to_consume) => {
96+ let n = input. unwritten ( ) . len ( ) . min ( * bytes_to_consume) ;
97+ * bytes_to_consume -= n;
98+ input. advance ( n) ;
9799
98- if data . unwritten ( ) . is_empty ( ) {
99- self . state = State :: Filename ( < _ > :: default ( ) ) ;
100+ if * bytes_to_consume == 0 {
101+ self . state = State :: Filename ;
100102 } else {
101103 return Ok ( None ) ;
102104 }
103105 }
104106
105- State :: Filename ( data ) => {
107+ State :: Filename => {
106108 if !self . header . flags . filename {
107- self . state = State :: Comment ( < _ > :: default ( ) ) ;
109+ self . state = State :: Comment ;
108110 continue ;
109111 }
110112
111113 if let Some ( len) = memchr:: memchr ( 0 , input. unwritten ( ) ) {
112- data. extend_from_slice ( & input. unwritten ( ) [ ..len] ) ;
113114 input. advance ( len + 1 ) ;
114- self . state = State :: Comment ( < _ > :: default ( ) ) ;
115+ self . state = State :: Comment ;
115116 } else {
116- data. extend_from_slice ( input. unwritten ( ) ) ;
117117 input. advance ( input. unwritten ( ) . len ( ) ) ;
118118 return Ok ( None ) ;
119119 }
120120 }
121121
122- State :: Comment ( data ) => {
122+ State :: Comment => {
123123 if !self . header . flags . comment {
124124 self . state = State :: Crc ( <_ >:: default ( ) ) ;
125125 continue ;
126126 }
127127
128128 if let Some ( len) = memchr:: memchr ( 0 , input. unwritten ( ) ) {
129- data. extend_from_slice ( & input. unwritten ( ) [ ..len] ) ;
130129 input. advance ( len + 1 ) ;
131130 self . state = State :: Crc ( <_ >:: default ( ) ) ;
132131 } else {
133- data. extend_from_slice ( input. unwritten ( ) ) ;
134132 input. advance ( input. unwritten ( ) . len ( ) ) ;
135133 return Ok ( None ) ;
136134 }
0 commit comments