about summary refs log tree commit diff
path: root/library/alloc/src
diff options
context:
space:
mode:
authorJoshua Wong <joshuawong@anticentri.st>2024-03-19 22:47:35 -0500
committerJoshua Wong <joshuawong@anticentri.st>2024-03-19 22:47:35 -0500
commit37718f949fe5bef4bbfa4ee393c2abf022771ccb (patch)
tree441e535b0712881f51f675ebd3d494f7883f7eb8 /library/alloc/src
parenta77c20c4b987e74eb1a867d21d1edb8035a11660 (diff)
downloadrust-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.rs7
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.