summaryrefslogtreecommitdiffstats
path: root/sys/kern/imgact_aout.c
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>1999-03-04 18:04:40 +0000
committeralc <alc@FreeBSD.org>1999-03-04 18:04:40 +0000
commit5306f681cbc74a3458faaebd7870cbc4baa7745b (patch)
tree60dd08041731e920b44a0b4ce3704b47e1fa8596 /sys/kern/imgact_aout.c
parentfe992c122ec68c1830ec9832e9f3bf7b23a92ac2 (diff)
downloadFreeBSD-src-5306f681cbc74a3458faaebd7870cbc4baa7745b.zip
FreeBSD-src-5306f681cbc74a3458faaebd7870cbc4baa7745b.tar.gz
exec_aout_imgact should lock the vm_map before calling vm_map_insert.
Reviewed by: Matthew Dillon <dillon@apollo.backplane.com>, "John S. Dyson" <dyson@iquest.net>, and David Greenman <dg@root.com>
Diffstat (limited to 'sys/kern/imgact_aout.c')
-rw-r--r--sys/kern/imgact_aout.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/sys/kern/imgact_aout.c b/sys/kern/imgact_aout.c
index 02c3446..5866581 100644
--- a/sys/kern/imgact_aout.c
+++ b/sys/kern/imgact_aout.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: imgact_aout.c,v 1.45 1999/01/29 22:59:43 dillon Exp $
+ * $Id: imgact_aout.c,v 1.46 1999/02/19 14:25:34 luoqi Exp $
*/
#include <sys/param.h>
@@ -82,6 +82,7 @@ exec_aout_imgact(imgp)
const struct exec *a_out = (const struct exec *) imgp->image_header;
struct vmspace *vmspace;
struct vnode *vp;
+ vm_map_t map;
vm_object_t object;
vm_offset_t text_end, data_end;
unsigned long virtual_offset;
@@ -176,6 +177,8 @@ exec_aout_imgact(imgp)
vmspace = imgp->proc->p_vmspace;
vp = imgp->vp;
+ map = &vmspace->vm_map;
+ vm_map_lock(map);
object = vp->v_object;
vm_object_reference(object);
@@ -185,9 +188,10 @@ exec_aout_imgact(imgp)
virtual_offset, text_end,
VM_PROT_READ | VM_PROT_EXECUTE, VM_PROT_ALL,
MAP_COPY_NEEDED | MAP_COPY_ON_WRITE);
- if (error)
+ if (error) {
+ vm_map_unlock(map);
return (error);
-
+ }
data_end = text_end + a_out->a_data;
if (a_out->a_data) {
vm_object_reference(object);
@@ -196,8 +200,10 @@ exec_aout_imgact(imgp)
text_end, data_end,
VM_PROT_ALL, VM_PROT_ALL,
MAP_COPY_NEEDED | MAP_COPY_ON_WRITE);
- if (error)
+ if (error) {
+ vm_map_unlock(map);
return (error);
+ }
}
pmap_object_init_pt(vmspace_pmap(vmspace), virtual_offset,
@@ -208,10 +214,13 @@ exec_aout_imgact(imgp)
error = vm_map_insert(&vmspace->vm_map, NULL, 0,
data_end, data_end + bss_size,
VM_PROT_ALL, VM_PROT_ALL, 0);
- if (error)
+ if (error) {
+ vm_map_unlock(map);
return (error);
+ }
}
-
+ vm_map_unlock(map);
+
/* Fill in process VM information */
vmspace->vm_tsize = a_out->a_text >> PAGE_SHIFT;
vmspace->vm_dsize = (a_out->a_data + bss_size) >> PAGE_SHIFT;
OpenPOWER on IntegriCloud