kernel - Fix a 'vm_page_unhold: hold count < 0' panic in kern_execve()
authorMatthew Dillon <dillon@apollo.backplane.com>
Thu, 9 Jun 2011 20:28:08 +0000 (13:28 -0700)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Tue, 14 Jun 2011 05:15:59 +0000 (13:15 +0800)
* imgp->firstpage is preloaded with lwbuf storage but we failed to NULL
  it out on error, causing the code to later attempt to release a bogus
  lwbuf.

* Fixes a hold count panic on random vm_page's.

sys/kern/kern_exec.c

index 3effc92..fdc83cc 100644 (file)
@@ -670,6 +670,12 @@ exec_map_page(struct image_params *imgp, vm_pindex_t pageno,
        return (0);
 }
 
+/*
+ * Map the first page of an executable image.
+ *
+ * NOTE: If the mapping fails we have to NULL-out firstpage which may
+ *      still be pointing to our supplied lwp structure.
+ */
 int
 exec_map_first_page(struct image_params *imgp)
 {
@@ -681,8 +687,10 @@ exec_map_first_page(struct image_params *imgp)
        imgp->firstpage = &imgp->firstpage_cache;
        err = exec_map_page(imgp, 0, &imgp->firstpage, &imgp->image_header);
 
-       if (err)
+       if (err) {
+               imgp->firstpage = NULL;
                return err;
+       }
 
        return 0;
 }