Skip to content

Commit dce3947

Browse files
committed
Try adding metadata length prefix, and obey it while decoding
1 parent 267cd1d commit dce3947

File tree

3 files changed

+10
-2
lines changed

3 files changed

+10
-2
lines changed

compiler/rustc_codegen_ssa/src/back/metadata.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,7 @@ pub fn create_compressed_metadata_file(
305305
symbol_name: &str,
306306
) -> Vec<u8> {
307307
let mut compressed = rustc_metadata::METADATA_HEADER.to_vec();
308+
compressed.write_all(&(metadata.raw_data().len() as u32).to_be_bytes()).unwrap();
308309
FrameEncoder::new(&mut compressed).write_all(metadata.raw_data()).unwrap();
309310
let Some(mut file) = create_object_file(sess) else {
310311
return compressed.to_vec();

compiler/rustc_metadata/src/locator.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -798,8 +798,15 @@ fn get_metadata_section<'p>(
798798
)));
799799
}
800800

801+
// Length of the compressed stream - this allows linkers to pad the section if they want
802+
let usize_len = core::mem::size_of::<u32>();
803+
let Ok(len_bytes) = <[u8; 4]>::try_from(&buf[header_len..cmp::min(header_len + usize_len, buf.len())]) else {
804+
return Err(MetadataError::LoadFailure("invalid metadata length found".to_string()));
805+
};
806+
let compressed_len = u32::from_be_bytes(len_bytes) as usize;
807+
801808
// Header is okay -> inflate the actual metadata
802-
let compressed_bytes = &buf[header_len..];
809+
let compressed_bytes = &buf[header_len..compressed_len + header_len];
803810
debug!("inflating {} bytes of compressed metadata", compressed_bytes.len());
804811
// Assume the decompressed data will be at least the size of the compressed data, so we
805812
// don't have to grow the buffer as much.

compiler/rustc_metadata/src/rmeta/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ pub(crate) fn rustc_version() -> String {
5555
/// Metadata encoding version.
5656
/// N.B., increment this if you change the format of metadata such that
5757
/// the rustc version can't be found to compare with `rustc_version()`.
58-
const METADATA_VERSION: u8 = 6;
58+
const METADATA_VERSION: u8 = 7;
5959

6060
/// Metadata header which includes `METADATA_VERSION`.
6161
///

0 commit comments

Comments
 (0)