summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorart <art@openbsd.org>2000-07-04 10:34:36 +0000
committerart <art@openbsd.org>2000-07-04 10:34:36 +0000
commit4784f64c29568ee678ff42fd265c116a5f58d333 (patch)
treeb94b2d71f5aeeb717726a4d90bc8cbb4f88f85fe
parentsync (diff)
downloadwireguard-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.c25
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);
}
/*