Skip to content

Commit 9927b31

Browse files
committed
detect bad vtables on an upcast
1 parent 0318f07 commit 9927b31

File tree

1 file changed

+5
-2
lines changed
  • compiler/rustc_const_eval/src/interpret

1 file changed

+5
-2
lines changed

compiler/rustc_const_eval/src/interpret/cast.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -297,10 +297,13 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
297297
Immediate::new_slice(ptr, length.eval_usize(*self.tcx, self.param_env), self);
298298
self.write_immediate(val, dest)
299299
}
300-
(&ty::Dynamic(ref _data_a, ..), &ty::Dynamic(ref data_b, ..)) => {
300+
(&ty::Dynamic(ref data_a, ..), &ty::Dynamic(ref data_b, ..)) => {
301301
let (old_data, old_vptr) = self.read_immediate(src)?.to_scalar_pair()?;
302302
let old_vptr = self.scalar_to_ptr(old_vptr)?;
303-
let (ty, _) = self.get_ptr_vtable(old_vptr)?;
303+
let (ty, old_trait) = self.get_ptr_vtable(old_vptr)?;
304+
if old_trait != data_a.principal() {
305+
throw_ub_format!("upcast on a pointer whose vtable does not match its type");
306+
}
304307
let new_vptr = self.get_vtable_ptr(ty, data_b.principal())?;
305308
self.write_immediate(Immediate::new_dyn_trait(old_data, new_vptr, self), dest)
306309
}

0 commit comments

Comments
 (0)