summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorCorey Richardson <corey@octayn.net>2013-11-11 05:45:30 -0500
committerCorey Richardson <corey@octayn.net>2013-11-11 06:09:28 -0500
commita46b2b8e7aafd23a4d3850d4de6653e363fd0813 (patch)
tree03136f0e8b78a63d51105de000e0af5bbdc75ce5 /src/libstd
parent46100c06223f737a7604b46667800ed42cf20d3b (diff)
downloadrust-a46b2b8e7aafd23a4d3850d4de6653e363fd0813.tar.gz
rust-a46b2b8e7aafd23a4d3850d4de6653e363fd0813.zip
vec: with_capacity: check for overflow
Fixes #10271
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/vec.rs6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs
index 055b0b92121..c2aa4c234d1 100644
--- a/src/libstd/vec.rs
+++ b/src/libstd/vec.rs
@@ -186,7 +186,11 @@ pub fn with_capacity<T>(capacity: uint) -> ~[T] {
             vec
         } else {
             let alloc = capacity * mem::nonzero_size_of::<T>();
-            let ptr = malloc_raw(alloc + mem::size_of::<Vec<()>>()) as *mut Vec<()>;
+            let size = alloc + mem::size_of::<Vec<()>>();
+            if alloc / mem::nonzero_size_of::<T>() != capacity || size < alloc {
+                fail!("vector size is too large: {}", capacity);
+            }
+            let ptr = malloc_raw(size) as *mut Vec<()>;
             (*ptr).alloc = alloc;
             (*ptr).fill = 0;
             cast::transmute(ptr)