Author: alc
Date: Sat Mar 18 23:37:00 2017
New Revision: 315518
URL: https://svnweb.freebsd.org/changeset/base/315518

Log:
  Avoid unnecessary calls to vm_map_protect() in elf_load_section().
  
  Typically, when elf_load_section() unconditionally passed VM_PROT_ALL to
  elf_map_insert(), it was needlessly enabling execute access on the
  mapping, and it would later have to call vm_map_protect() to correct the
  mapping's access rights.  Now, instead, elf_load_section() always passes
  its parameter "prot" to elf_map_insert().  So, elf_load_section() must
  only call vm_map_protect() if it needs to remove the write access that
  was temporarily granted to perform a copyout().
  
  Reviewed by:  kib
  MFC after:    1 week

Modified:
  head/sys/kern/imgact_elf.c

Modified: head/sys/kern/imgact_elf.c
==============================================================================
--- head/sys/kern/imgact_elf.c  Sat Mar 18 23:24:52 2017        (r315517)
+++ head/sys/kern/imgact_elf.c  Sat Mar 18 23:37:00 2017        (r315518)
@@ -582,7 +582,7 @@ __elfN(load_section)(struct image_params
        /* This had damn well better be true! */
        if (map_len != 0) {
                rv = __elfN(map_insert)(imgp, map, NULL, 0, map_addr,
-                   map_addr + map_len, VM_PROT_ALL, 0);
+                   map_addr + map_len, prot, 0);
                if (rv != KERN_SUCCESS)
                        return (EINVAL);
        }
@@ -603,10 +603,12 @@ __elfN(load_section)(struct image_params
        }
 
        /*
-        * set it to the specified protection.
+        * Remove write access to the page if it was only granted by map_insert
+        * to allow copyout.
         */
-       vm_map_protect(map, trunc_page(map_addr), round_page(map_addr +
-           map_len), prot, FALSE);
+       if ((prot & VM_PROT_WRITE) == 0)
+               vm_map_protect(map, trunc_page(map_addr), round_page(map_addr +
+                   map_len), prot, FALSE);
 
        return (0);
 }
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to