Skip to content

Commit a72a057

Browse files
author
Ellen Arteca
committed
double free detected in tcache 2: could not compile core in stage 1 compilation
1 parent 0ddff36 commit a72a057

File tree

2 files changed

+13
-9
lines changed

2 files changed

+13
-9
lines changed

compiler/rustc_middle/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
//! This API is completely unstable and subject to change.
2424
2525
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
26+
#![feature(maybe_uninit_write_slice)]
2627
#![feature(allocator_api)]
2728
#![feature(array_windows)]
2829
#![feature(assert_matches)]

compiler/rustc_middle/src/mir/interpret/allocation.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use std::hash;
77
use std::iter;
88
use std::ops::{Deref, Range};
99
use std::ptr;
10+
use std::mem::MaybeUninit;
1011

1112
use rustc_ast::Mutability;
1213
use rustc_data_structures::intern::Interned;
@@ -211,14 +212,15 @@ impl<Prov> Allocation<Prov> {
211212
let size = Size::from_bytes(slice.len());
212213
let align_usize: usize = align.bytes().try_into().unwrap();
213214
let layout = std::alloc::Layout::from_size_align(slice.len(), align_usize).unwrap();
214-
let vec_align = unsafe {
215+
let bytes = unsafe {
215216
let buf = std::alloc::alloc(layout);
216-
Vec::from_raw_parts(buf as *mut u8, size.bytes_usize(), size.bytes_usize())
217+
let mut uninit_bytes = Vec::from_raw_parts(buf as *mut MaybeUninit<u8>, slice.len(), slice.len());
218+
let mut boxed = Box::<[MaybeUninit<u8>]>::from_raw(&mut *uninit_bytes);
219+
MaybeUninit::write_slice(&mut boxed, &slice);
220+
boxed.assume_init()
217221
};
218222

219-
let mut bytes = vec_align.into_boxed_slice();
220223
assert!(bytes.as_ptr() as u64 % align.bytes() == 0);
221-
bytes.copy_from_slice(&slice);
222224

223225
Self {
224226
bytes,
@@ -286,14 +288,15 @@ impl Allocation {
286288
// Realign the pointer
287289
let align_usize: usize = self.align.bytes().try_into().unwrap();
288290
let layout = std::alloc::Layout::from_size_align(self.bytes.len(), align_usize).unwrap();
289-
let mut vec_align = unsafe {
291+
let mut bytes = unsafe {
290292
let buf = std::alloc::alloc(layout);
291-
Vec::from_raw_parts(buf as *mut u8, self.bytes.len(), self.bytes.len())
293+
let mut uninit_bytes = Vec::from_raw_parts(buf as *mut MaybeUninit<u8>, self.bytes.len(), self.bytes.len());
294+
let mut boxed = Box::<[MaybeUninit<u8>]>::from_raw(&mut *uninit_bytes);
295+
MaybeUninit::write_slice(&mut boxed, &self.bytes);
296+
boxed.assume_init()
292297
};
293-
assert!(vec_align.as_ptr() as usize % align_usize == 0);
298+
assert!(bytes.as_ptr() as usize % align_usize == 0);
294299

295-
vec_align[..self.bytes.len()].copy_from_slice(&self.bytes);
296-
let mut bytes = vec_align.into_boxed_slice();
297300
let mut new_relocations = Vec::with_capacity(self.relocations.0.len());
298301
let ptr_size = cx.data_layout().pointer_size.bytes_usize();
299302
let endian = cx.data_layout().endian;

0 commit comments

Comments
 (0)