Author: markj
Date: Fri Oct 27 14:23:53 2017
New Revision: 325037
URL: https://svnweb.freebsd.org/changeset/base/325037

Log:
  MFC r324809:
  Free the right address range if kmem_back() fails in memguard_alloc().

Modified:
  stable/10/sys/vm/memguard.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/vm/memguard.c
==============================================================================
--- stable/10/sys/vm/memguard.c Fri Oct 27 14:22:56 2017        (r325036)
+++ stable/10/sys/vm/memguard.c Fri Oct 27 14:23:53 2017        (r325037)
@@ -284,7 +284,7 @@ v2sizev(vm_offset_t va)
 void *
 memguard_alloc(unsigned long req_size, int flags)
 {
-       vm_offset_t addr;
+       vm_offset_t addr, origaddr;
        u_long size_p, size_v;
        int do_guard, rv;
 
@@ -328,7 +328,7 @@ memguard_alloc(unsigned long req_size, int flags)
        for (;;) {
                if (vmem_xalloc(memguard_arena, size_v, 0, 0, 0,
                    memguard_cursor, VMEM_ADDR_MAX,
-                   M_BESTFIT | M_NOWAIT, &addr) == 0)
+                   M_BESTFIT | M_NOWAIT, &origaddr) == 0)
                        break;
                /*
                 * The map has no space.  This may be due to
@@ -343,11 +343,12 @@ memguard_alloc(unsigned long req_size, int flags)
                memguard_wrap++;
                memguard_cursor = memguard_base;
        }
+       addr = origaddr;
        if (do_guard)
                addr += PAGE_SIZE;
        rv = kmem_back(kmem_object, addr, size_p, flags);
        if (rv != KERN_SUCCESS) {
-               vmem_xfree(memguard_arena, addr, size_v);
+               vmem_xfree(memguard_arena, origaddr, size_v);
                memguard_fail_pgs++;
                addr = (vm_offset_t)NULL;
                goto out;
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to