Skip to content

Commit 41c6fa8

Browse files
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.
1 parent 4498cd6 commit 41c6fa8

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

compiler/rustc_target/src/abi/call/sparc64.rs

+8-6
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,14 @@ where
3535
data.last_offset = data.last_offset + Reg::i32().size;
3636
}
3737

38-
for _ in 0..((offset - data.last_offset).bits() / 64)
39-
.min((data.prefix.len() - data.prefix_index) as u64)
40-
{
41-
data.prefix[data.prefix_index] = Some(Reg::i64());
42-
data.prefix_index += 1;
43-
data.last_offset = data.last_offset + Reg::i64().size;
38+
if data.last_offset < offset {
39+
for _ in 0..((offset - data.last_offset).bits() / 64)
40+
.min((data.prefix.len() - data.prefix_index) as u64)
41+
{
42+
data.prefix[data.prefix_index] = Some(Reg::i64());
43+
data.prefix_index += 1;
44+
data.last_offset = data.last_offset + Reg::i64().size;
45+
}
4446
}
4547

4648
if data.last_offset < offset {

0 commit comments

Comments
 (0)