diff options
author | Artur Grabowski <art@cvs.openbsd.org> | 2000-07-04 10:34:37 +0000 |
---|---|---|
committer | Artur Grabowski <art@cvs.openbsd.org> | 2000-07-04 10:34:37 +0000 |
commit | a9f7725c2b75dac91b92ed1da3a3199224962261 (patch) | |
tree | 7a69ed5ae53794338d9bdfc1cf7136c6c7f0b090 /sys/uvm/uvm_unix.c | |
parent | 7c165f3eb9364d2a31104ff6fcd445606a275e5f (diff) |
Fix the latest fix.
Only change vm_dsize if the allocation succeeded.
From Jason Thorpe.
Diffstat (limited to 'sys/uvm/uvm_unix.c')
-rw-r--r-- | sys/uvm/uvm_unix.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/sys/uvm/uvm_unix.c b/sys/uvm/uvm_unix.c index 6cc5d3ae25a..c2495e917e5 100644 --- a/sys/uvm/uvm_unix.c +++ b/sys/uvm/uvm_unix.c @@ -83,7 +83,7 @@ sys_obreak(p, v, retval) old = (vaddr_t)vm->vm_daddr; new = round_page(SCARG(uap, nsize)); - if ((rlim_t)(new - old) > p->p_rlimit[RLIMIT_DATA].rlim_cur) + if ((new - old) > p->p_rlimit[RLIMIT_DATA].rlim_cur) return(ENOMEM); old = round_page(old + ptoa(vm->vm_dsize)); @@ -99,20 +99,23 @@ sys_obreak(p, v, retval) rv = uvm_map(&vm->vm_map, &old, diff, NULL, UVM_UNKNOWN_OFFSET, UVM_MAPFLAG(UVM_PROT_ALL, UVM_PROT_ALL, UVM_INH_COPY, UVM_ADV_NORMAL, UVM_FLAG_AMAPPAD|UVM_FLAG_FIXED| - UVM_FLAG_OVERLAY|UVM_FLAG_COPYONW)); + UVM_FLAG_OVERLAY|UVM_FLAG_COPYONW)); + if (rv == KERN_SUCCESS) { + vm->vm_dsize += atop(diff); + return (0); + } } else { rv = uvm_deallocate(&vm->vm_map, new, -diff); + if (rv == KERN_SUCCESS) { + vm->vm_dsize -= atop(-diff); + return (0); + } } - vm->vm_dsize += atop(diff); - - if (rv != KERN_SUCCESS) { - uprintf("sbrk: %s failed, return = %d\n", - diff > 0 ? "grow" : "shrink", rv); - return(ENOMEM); - } - - return (0); + uprintf("sbrk: %s %ld failed, return = %d\n", + diff > 0 ? "grow" : "shrink", + (long)(diff > 0 ? diff : -diff), rv); + return(ENOMEM); } /* |