mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-15 12:39:31 +03:00
Auto merge of #125821 - Luv-Ray:issue#121126, r=fee1-dead
Check index `value <= 0xFFFF_FF00`
<!--
If this PR is related to an unstable feature or an otherwise tracked effort,
please link to the relevant tracking issue here. If you don't know of a related
tracking issue or there are none, feel free to ignore this.
This PR will get automatically assigned to a reviewer. In case you would like
a specific user to review your work, you can assign it to them by using
r? <reviewer name>
-->
fixes #121126
check `idx <= FieldIdx::MAX_AS_U32` before calling `FieldIdx::from_u32` to avoid panic.
This commit is contained in:
@@ -102,8 +102,12 @@ fn project(
|
||||
}
|
||||
(PlaceElem::Index(idx), Value::Aggregate { fields, .. }) => {
|
||||
let idx = prop.get_const(idx.into())?.immediate()?;
|
||||
let idx = prop.ecx.read_target_usize(idx).ok()?;
|
||||
fields.get(FieldIdx::from_u32(idx.try_into().ok()?)).unwrap_or(&Value::Uninit)
|
||||
let idx = prop.ecx.read_target_usize(idx).ok()?.try_into().ok()?;
|
||||
if idx <= FieldIdx::MAX_AS_U32 {
|
||||
fields.get(FieldIdx::from_u32(idx)).unwrap_or(&Value::Uninit)
|
||||
} else {
|
||||
return None;
|
||||
}
|
||||
}
|
||||
(
|
||||
PlaceElem::ConstantIndex { offset, min_length: _, from_end: false },
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
//@ known-bug: #121126
|
||||
fn main() {
|
||||
let _n = 1i64 >> [64][4_294_967_295];
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
//@ build-fail
|
||||
|
||||
fn main() {
|
||||
let _n = [64][200];
|
||||
//~^ ERROR this operation will panic at runtime [unconditional_panic]
|
||||
|
||||
// issue #121126, test index value between 0xFFFF_FF00 and u32::MAX
|
||||
let _n = [64][u32::MAX as usize - 1];
|
||||
//~^ ERROR this operation will panic at runtime [unconditional_panic]
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
error: this operation will panic at runtime
|
||||
--> $DIR/index-bounds.rs:4:14
|
||||
|
|
||||
LL | let _n = [64][200];
|
||||
| ^^^^^^^^^ index out of bounds: the length is 1 but the index is 200
|
||||
|
|
||||
= note: `#[deny(unconditional_panic)]` on by default
|
||||
|
||||
error: this operation will panic at runtime
|
||||
--> $DIR/index-bounds.rs:8:14
|
||||
|
|
||||
LL | let _n = [64][u32::MAX as usize - 1];
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ index out of bounds: the length is 1 but the index is 4294967294
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Reference in New Issue
Block a user