Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/uvm - Avoid an integer overflow when checking if we have...



details:   https://anonhg.NetBSD.org/src/rev/eb4375861e62
branches:  trunk
changeset: 494135:eb4375861e62
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Sun Jul 02 17:40:08 2000 +0000

description:
- Avoid an integer overflow when checking if we have exceeded our
  rlimit in sbrk.  Slightly modified from a patch from Artur Grabowski.
- Rearrange code slightly, partially from Artur Grabowski.
- Only adjust vm_dsize if the grow or shrink actually succeeds.

diffstat:

 sys/uvm/uvm_unix.c |  46 ++++++++++++++++++++++------------------------
 1 files changed, 22 insertions(+), 24 deletions(-)

diffs (77 lines):

diff -r cda20faea7e4 -r eb4375861e62 sys/uvm/uvm_unix.c
--- a/sys/uvm/uvm_unix.c        Sun Jul 02 17:38:09 2000 +0000
+++ b/sys/uvm/uvm_unix.c        Sun Jul 02 17:40:08 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: uvm_unix.c,v 1.13 2000/06/27 17:29:36 mrg Exp $        */
+/*     $NetBSD: uvm_unix.c,v 1.14 2000/07/02 17:40:08 thorpej Exp $    */
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -77,46 +77,44 @@
        } */ *uap = v;
        struct vmspace *vm = p->p_vmspace;
        vaddr_t new, old;
+       ssize_t diff;
        int rv;
-       int diff;
 
        old = (vaddr_t)vm->vm_daddr;
        new = round_page((vaddr_t)SCARG(uap, nsize));
-       if ((int)(new - old) > p->p_rlimit[RLIMIT_DATA].rlim_cur)
-               return(ENOMEM);
+       if ((new - old) > p->p_rlimit[RLIMIT_DATA].rlim_cur)
+               return (ENOMEM);
 
-       old = round_page(old + ctob(vm->vm_dsize));
+       old = round_page(old + ptoa(vm->vm_dsize));
        diff = new - old;
 
+       if (diff == 0)
+               return (0);
+
        /*
         * grow or shrink?
         */
-
        if (diff > 0) {
-
                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)); 
-
-               if (rv != KERN_SUCCESS) {
-                       uprintf("sbrk: grow failed, return = %d\n", rv);
-                       return(ENOMEM);
+               if (rv == KERN_SUCCESS) {
+                       vm->vm_dsize += atop(diff);
+                       return (0);
                }
-               vm->vm_dsize += btoc(diff);
-
-       } else if (diff < 0) {
+       } else {
+               rv = uvm_deallocate(&vm->vm_map, new, -diff);
+               if (rv == KERN_SUCCESS) {
+                       vm->vm_dsize -= atop(-diff);
+                       return (0);
+               }
+       }
 
-               diff = -diff;
-               rv = uvm_deallocate(&vm->vm_map, new, diff);
-               if (rv != KERN_SUCCESS) {
-                       uprintf("sbrk: shrink failed, return = %d\n", rv);
-                       return(ENOMEM);
-               }
-               vm->vm_dsize -= btoc(diff);
-
-       }
-       return(0);
+       uprintf("sbrk: %s %ld failed, return = %d\n",
+           diff > 0 ? "grow" : "shrink",
+           (long)(diff > 0 ? diff : -diff), rv);
+       return (ENOMEM);
 }
 
 /*



Home | Main Index | Thread Index | Old Index