about summary refs log tree commit diff
path: root/src/rt/rust_task.cpp
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-12-19 22:47:28 -0800
committerBrian Anderson <banderson@mozilla.com>2011-12-19 22:47:28 -0800
commit25f7c844df79a92b0de75f2ac658f31307e492c5 (patch)
treede84da330a6018ee8133783317b90f826de872a6 /src/rt/rust_task.cpp
parent05bf105c90e7f0dee866fb15f6616afe25fe209f (diff)
downloadrust-25f7c844df79a92b0de75f2ac658f31307e492c5.tar.gz
rust-25f7c844df79a92b0de75f2ac658f31307e492c5.zip
rt: Don't reuse stack segments when they are not big enough
Diffstat (limited to 'src/rt/rust_task.cpp')
-rw-r--r--src/rt/rust_task.cpp5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp
index f30315174b6..70f3ce41796 100644
--- a/src/rt/rust_task.cpp
+++ b/src/rt/rust_task.cpp
@@ -123,7 +123,7 @@ new_stk(rust_scheduler *sched, rust_task *task, size_t requested_sz)
         size_t prev_sz = (size_t)(task->stk->prev->end
                                   - (uintptr_t)&task->stk->prev->data[0]
                                   - RED_ZONE_SIZE);
-        if (min_sz <= prev_sz) {
+        if (min_sz <= prev_sz && requested_sz <= prev_sz) {
             LOG(task, mem, "reusing existing stack");
             task->stk = task->stk->prev;
             A(sched, task->stk->prev == NULL, "Bogus stack ptr");
@@ -700,7 +700,8 @@ void *
 rust_task::new_stack(size_t stk_sz, void *args_addr, size_t args_sz) {
 
     stk_seg *stk_seg = new_stk(sched, this, stk_sz + args_sz);
-
+    A(sched, stk_seg->end - (uintptr_t)stk_seg->data >= stk_sz + args_sz,
+      "Did not receive enough stack");
     uint8_t *new_sp = (uint8_t*)stk_seg->end;
     // Push the function arguments to the new stack
     new_sp = align_down(new_sp - args_sz);