mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-16 17:03:35 +00:00
sparc64: fix crash in ABI code for { f64, f32 } struct
This would trigger a `Size::sub: 0 - 8 would result in negative size` abort, if `data.last_offset > offset`. This is almost hilariously easy to trigger (https://godbolt.org/z/8rbv57xET): ```rust #[repr(C)] pub struct DoubleFloat { f: f64, g: f32, } #[no_mangle] pub extern "C" fn foo(x: DoubleFloat) {} ``` Tests for this will be covered by the cast-target-abi.rs test added in a later commit.
This commit is contained in:
parent
4498cd6a8d
commit
41c6fa812b
@ -35,12 +35,14 @@ where
|
||||
data.last_offset = data.last_offset + Reg::i32().size;
|
||||
}
|
||||
|
||||
for _ in 0..((offset - data.last_offset).bits() / 64)
|
||||
.min((data.prefix.len() - data.prefix_index) as u64)
|
||||
{
|
||||
data.prefix[data.prefix_index] = Some(Reg::i64());
|
||||
data.prefix_index += 1;
|
||||
data.last_offset = data.last_offset + Reg::i64().size;
|
||||
if data.last_offset < offset {
|
||||
for _ in 0..((offset - data.last_offset).bits() / 64)
|
||||
.min((data.prefix.len() - data.prefix_index) as u64)
|
||||
{
|
||||
data.prefix[data.prefix_index] = Some(Reg::i64());
|
||||
data.prefix_index += 1;
|
||||
data.last_offset = data.last_offset + Reg::i64().size;
|
||||
}
|
||||
}
|
||||
|
||||
if data.last_offset < offset {
|
||||
|
Loading…
Reference in New Issue
Block a user