diff options
| author | Joshua Wong <joshuawong@anticentri.st> | 2024-03-19 22:47:35 -0500 |
|---|---|---|
| committer | Joshua Wong <joshuawong@anticentri.st> | 2024-03-19 22:47:35 -0500 |
| commit | 37718f949fe5bef4bbfa4ee393c2abf022771ccb (patch) | |
| tree | 441e535b0712881f51f675ebd3d494f7883f7eb8 /library/alloc/src | |
| parent | a77c20c4b987e74eb1a867d21d1edb8035a11660 (diff) | |
| download | rust-37718f949fe5bef4bbfa4ee393c2abf022771ccb.tar.gz rust-37718f949fe5bef4bbfa4ee393c2abf022771ccb.zip | |
fix OOB pointer formed in Vec::index
Move the length check to before using `index` with `ptr::add` to prevent an out of bounds pointer from being formed. Fixes #122760
Diffstat (limited to 'library/alloc/src')
| -rw-r--r-- | library/alloc/src/vec/mod.rs | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/library/alloc/src/vec/mod.rs b/library/alloc/src/vec/mod.rs index db56b8d07c7..94bed825bb2 100644 --- a/library/alloc/src/vec/mod.rs +++ b/library/alloc/src/vec/mod.rs @@ -1541,6 +1541,9 @@ impl<T, A: Allocator> Vec<T, A> { } let len = self.len(); + if index > len { + assert_failed(index, len); + } // space for the new element if len == self.buf.capacity() { @@ -1556,10 +1559,6 @@ impl<T, A: Allocator> Vec<T, A> { // Shift everything over to make space. (Duplicating the // `index`th element into two consecutive places.) ptr::copy(p, p.add(1), len - index); - } else if index == len { - // No elements need shifting. - } else { - assert_failed(index, len); } // Write it in, overwriting the first copy of the `index`th // element. |
