Skip to content

Commit

Permalink
Auto merge of rust-lang#125821 - Luv-Ray:issue#121126, r=fee1-dead
Browse files Browse the repository at this point in the history
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 rust-lang#121126

check `idx <= FieldIdx::MAX_AS_U32` before calling `FieldIdx::from_u32` to avoid panic.
  • Loading branch information
bors committed Jun 1, 2024
2 parents 05965ae + d3c8e67 commit acaf0ae
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 6 deletions.
8 changes: 6 additions & 2 deletions compiler/rustc_mir_transform/src/known_panics_lint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,12 @@ impl<'tcx> Value<'tcx> {
}
(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 },
Expand Down
4 changes: 0 additions & 4 deletions tests/crashes/121126.rs

This file was deleted.

10 changes: 10 additions & 0 deletions tests/ui/indexing/index-bounds.rs
Original file line number Diff line number Diff line change
@@ -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]
}
16 changes: 16 additions & 0 deletions tests/ui/indexing/index-bounds.stderr
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit acaf0ae

Please sign in to comment.