diff options
author | 2000-07-04 10:34:36 +0000 | |
---|---|---|
committer | 2000-07-04 10:34:36 +0000 | |
commit | 4784f64c29568ee678ff42fd265c116a5f58d333 (patch) | |
tree | b94b2d71f5aeeb717726a4d90bc8cbb4f88f85fe | |
parent | sync (diff) | |
download | wireguard-openbsd-4784f64c29568ee678ff42fd265c116a5f58d333.tar.xz wireguard-openbsd-4784f64c29568ee678ff42fd265c116a5f58d333.zip |
Fix the latest fix.
Only change vm_dsize if the allocation succeeded.
From Jason Thorpe.
-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); } /* |