diff --git a/src/fn_call.rs b/src/fn_call.rs index 062cc900e176..2db23bd48c54 100644 --- a/src/fn_call.rs +++ b/src/fn_call.rs @@ -95,25 +95,16 @@ pub trait EvalContextExt<'a, 'mir, 'tcx: 'a + 'mir>: crate::MiriEvalContextExt<' } "calloc" => { let items = this.read_scalar(args[0])?.to_usize(this)?; - let count = this.read_scalar(args[1])?.to_usize(this)?; - let size = if let Some(size) = items.checked_add(count) { - size - } else { - return err!(MachineError(format!( - "calloc: overflow of items * count: {} * {}", - items, count, - ))); - }; - if size == 0 { + let len = this.read_scalar(args[1])?.to_usize(this)?; + let bytes = items.checked_mul(len).ok_or_else(|| InterpError::Overflow(mir::BinOp::Mul))?; + + if bytes== 0 { this.write_null(dest)?; } else { + let size = Size::from_bytes(bytes); let align = this.tcx.data_layout.pointer_align.abi; - let ptr = this.memory_mut() - .allocate(Size::from_bytes(size), align, MiriMemoryKind::C.into()) - .with_default_tag(); - this.memory_mut() - .get_mut(ptr.alloc_id)? - .write_repeat(tcx, ptr, 0, Size::from_bytes(size))?; + let ptr = this.memory_mut().allocate(size, align, MiriMemoryKind::C.into()).with_default_tag(); + this.memory_mut().get_mut(ptr.alloc_id)?.write_repeat(tcx, ptr, 0, size)?; this.write_scalar(Scalar::Ptr(ptr), dest)?; } }