@@ -197,7 +197,7 @@ pub struct Header {
197197#[ derive( Serialize , Deserialize , Clone , Debug ) ]
198198#[ repr( C ) ]
199199pub struct Directory {
200- pub manifest : Manifest ,
200+ pub manifest : ( Manifest , Vec < u8 > ) ,
201201 pub header : Header ,
202202 pub modules : Vec < Module > ,
203203 pub offset : usize ,
@@ -210,7 +210,7 @@ impl Display for Directory {
210210 let n = & self . name ;
211211 let o = self . offset ;
212212 let s = self . size ;
213- let m = self . manifest ;
213+ let ( m , _ ) = self . manifest ;
214214 write ! ( f, "{n} @ {o:08x}, {s} bytes, {m}" )
215215 }
216216}
@@ -222,32 +222,36 @@ impl Directory {
222222 let Ok ( manifest) = Manifest :: new ( data) else {
223223 return Err ( "cannot parse Gen 2 directory manifest" . to_string ( ) ) ;
224224 } ;
225- let count = manifest. header . entries as usize ;
226- let d = & data[ man:: MANIFEST_SIZE ..] ;
227- let Ok ( ( header, _) ) = Header :: read_from_prefix ( d) else {
225+
226+ let data_len = manifest. data_len ( ) ;
227+ let mdata = & data[ man:: MANIFEST_SIZE ..man:: MANIFEST_SIZE + data_len] ;
228+
229+ let Ok ( ( header, _) ) = Header :: read_from_prefix ( mdata) else {
228230 return Err ( "cannot parse ME FW Gen 2 directory header" . to_string ( ) ) ;
229231 } ;
230- let pos = man:: MANIFEST_SIZE + HEADER_SIZE ;
231- let m = & data[ pos..pos + 4 ] ;
232+ let name = match from_utf8 ( & header. name ) {
233+ Ok ( n) => n. trim_end_matches ( '\0' ) . to_string ( ) ,
234+ Err ( _) => format ! ( "{:02x?}" , header. name) ,
235+ } ;
232236
237+ // Check magic bytes of first entry.
238+ let pos = HEADER_SIZE ;
239+ let m = & mdata[ pos..pos + 4 ] ;
233240 if !m. eq ( MODULE_MAGIC_BYTES ) {
234241 return Err ( format ! (
235242 "entry magic not found, got {m:02x?}, wanted {MODULE_MAGIC_BYTES:02x?} ({MODULE_MAGIC})"
236243 ) ) ;
237244 }
238-
239- let slice = & data[ pos..] ;
245+ // Parse the entries themselves.
246+ let slice = & mdata[ pos..] ;
247+ let count = manifest. header . entries as usize ;
240248 let Ok ( ( r, _) ) = Ref :: < _ , [ Entry ] > :: from_prefix_with_elems ( slice, count) else {
241249 return Err ( format ! (
242250 "cannot parse ME FW Gen 2 directory entries @ {:08x}" ,
243251 pos
244252 ) ) ;
245253 } ;
246254 let entries = r. to_vec ( ) ;
247- let name = match from_utf8 ( & header. name ) {
248- Ok ( n) => n. trim_end_matches ( '\0' ) . to_string ( ) ,
249- Err ( _) => format ! ( "{:02x?}" , header. name) ,
250- } ;
251255
252256 // Check for consistency and wrap entries with additional information.
253257 let modules = entries
@@ -295,7 +299,7 @@ impl Directory {
295299
296300 let size = data. len ( ) ;
297301 Ok ( Self {
298- manifest,
302+ manifest : ( manifest , mdata . to_vec ( ) ) ,
299303 header,
300304 modules,
301305 offset,
0 commit comments