@@ -789,6 +789,9 @@ fn get_metadata_section<'p>(
789789 loader. get_dylib_metadata ( target, filename) . map_err ( MetadataError :: LoadFailure ) ?;
790790 // The header is uncompressed
791791 let header_len = METADATA_HEADER . len ( ) ;
792+ let u32_len = core:: mem:: size_of :: < u32 > ( ) ;
793+ let data_start = header_len + u32_len;
794+
792795 debug ! ( "checking {} bytes of metadata-version stamp" , header_len) ;
793796 let header = & buf[ ..cmp:: min ( header_len, buf. len ( ) ) ] ;
794797 if header != METADATA_HEADER {
@@ -799,14 +802,13 @@ fn get_metadata_section<'p>(
799802 }
800803
801804 // Length of the compressed stream - this allows linkers to pad the section if they want
802- let u32_len = core:: mem:: size_of :: < u32 > ( ) ;
803- let Ok ( len_bytes) = <[ u8 ; 4 ] >:: try_from ( & buf[ header_len..cmp:: min ( header_len + u32_len, buf. len ( ) ) ] ) else {
805+ let Ok ( len_bytes) = <[ u8 ; 4 ] >:: try_from ( & buf[ header_len..cmp:: min ( data_start, buf. len ( ) ) ] ) else {
804806 return Err ( MetadataError :: LoadFailure ( "invalid metadata length found" . to_string ( ) ) ) ;
805807 } ;
806808 let compressed_len = u32:: from_be_bytes ( len_bytes) as usize ;
807809
808810 // Header is okay -> inflate the actual metadata
809- let compressed_bytes = & buf[ ( header_len + u32_len ) ..( compressed_len + header_len + u32_len ) ] ;
811+ let compressed_bytes = & buf[ data_start ..( data_start + compressed_len ) ] ;
810812 debug ! ( "inflating {} bytes of compressed metadata" , compressed_bytes. len( ) ) ;
811813 // Assume the decompressed data will be at least the size of the compressed data, so we
812814 // don't have to grow the buffer as much.
0 commit comments