summary refs log tree commit diff
path: root/compiler/rustc_codegen_ssa
diff options
context:
space:
mode:
authorRune Tynan <runetynan@gmail.com>2023-02-13 13:39:28 -0500
committerRune Tynan <runetynan@gmail.com>2023-02-20 13:38:27 -0500
commit7df53d5e18cc5b39d9452e4aa3c653d0efa9f65f (patch)
tree923060a4663cf44d3ca381ba9d727ef145739fdf /compiler/rustc_codegen_ssa
parentdce3947110a73efebb756242d5c775a3ddad32a9 (diff)
downloadrust-7df53d5e18cc5b39d9452e4aa3c653d0efa9f65f.tar.gz
rust-7df53d5e18cc5b39d9452e4aa3c653d0efa9f65f.zip
Fix metadata encoding and decoding to use the right length
Diffstat (limited to 'compiler/rustc_codegen_ssa')
-rw-r--r--compiler/rustc_codegen_ssa/src/back/metadata.rs7
1 files changed, 6 insertions, 1 deletions
diff --git a/compiler/rustc_codegen_ssa/src/back/metadata.rs b/compiler/rustc_codegen_ssa/src/back/metadata.rs
index 190cd69a0e9..75daf33db30 100644
--- a/compiler/rustc_codegen_ssa/src/back/metadata.rs
+++ b/compiler/rustc_codegen_ssa/src/back/metadata.rs
@@ -305,8 +305,13 @@ pub fn create_compressed_metadata_file(
     symbol_name: &str,
 ) -> Vec<u8> {
     let mut compressed = rustc_metadata::METADATA_HEADER.to_vec();
-    compressed.write_all(&(metadata.raw_data().len() as u32).to_be_bytes()).unwrap();
+    // Our length will be backfilled once we're done writing
+    compressed.write_all(&[0; 4]).unwrap();
     FrameEncoder::new(&mut compressed).write_all(metadata.raw_data()).unwrap();
+    let meta_len = rustc_metadata::METADATA_HEADER.len();
+    let data_len = (compressed.len() - meta_len - 4) as u32;
+    compressed[meta_len..meta_len + 4].copy_from_slice(&data_len.to_be_bytes());
+
     let Some(mut file) = create_object_file(sess) else {
         return compressed.to_vec();
     };