Author: kib
Date: Fri May 23 09:48:42 2014
New Revision: 266583
URL: http://svnweb.freebsd.org/changeset/base/266583

Log:
  MFC r266464:
  In execve(2), postpone the free of old vmspace until the threads are resumed
  and exited.

Modified:
  stable/8/sys/kern/kern_exec.c
  stable/8/sys/sys/proc.h
  stable/8/sys/vm/vm_map.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/kern/   (props changed)
  stable/8/sys/sys/   (props changed)
  stable/8/sys/vm/   (props changed)

Modified: stable/8/sys/kern/kern_exec.c
==============================================================================
--- stable/8/sys/kern/kern_exec.c       Fri May 23 09:29:04 2014        
(r266582)
+++ stable/8/sys/kern/kern_exec.c       Fri May 23 09:48:42 2014        
(r266583)
@@ -278,6 +278,7 @@ kern_execve(td, args, mac_p)
        struct mac *mac_p;
 {
        struct proc *p = td->td_proc;
+       struct vmspace *oldvmspace;
        int error;
 
        AUDIT_ARG_ARGV(args->begin_argv, args->argc,
@@ -294,6 +295,8 @@ kern_execve(td, args, mac_p)
                PROC_UNLOCK(p);
        }
 
+       KASSERT((td->td_pflags & TDP_EXECVMSPC) == 0, ("nested execve"));
+       oldvmspace = td->td_proc->p_vmspace;
        error = do_execve(td, args, mac_p);
 
        if (p->p_flag & P_HADTHREADS) {
@@ -308,6 +311,12 @@ kern_execve(td, args, mac_p)
                        thread_single_end();
                PROC_UNLOCK(p);
        }
+       if ((td->td_pflags & TDP_EXECVMSPC) != 0) {
+               KASSERT(td->td_proc->p_vmspace != oldvmspace,
+                   ("oldvmspace still used"));
+               vmspace_free(oldvmspace);
+               td->td_pflags &= ~TDP_EXECVMSPC;
+       }
 
        return (error);
 }

Modified: stable/8/sys/sys/proc.h
==============================================================================
--- stable/8/sys/sys/proc.h     Fri May 23 09:29:04 2014        (r266582)
+++ stable/8/sys/sys/proc.h     Fri May 23 09:48:42 2014        (r266583)
@@ -414,6 +414,7 @@ do {                                                        
                \
 #define        TDP_AUDITREC    0x01000000 /* Audit record pending on thread */
 #define        TDP_RESETSPUR   0x04000000 /* Reset spurious page fault 
history. */
 #define        TDP_NERRNO      0x08000000 /* Last errno is already in td_errno 
*/
+#define        TDP_EXECVMSPC   0x40000000 /* Execve destroyed old vmspace */
 
 /*
  * Reasons that the current thread can not be run yet.

Modified: stable/8/sys/vm/vm_map.c
==============================================================================
--- stable/8/sys/vm/vm_map.c    Fri May 23 09:29:04 2014        (r266582)
+++ stable/8/sys/vm/vm_map.c    Fri May 23 09:48:42 2014        (r266583)
@@ -3521,6 +3521,8 @@ vmspace_exec(struct proc *p, vm_offset_t
        struct vmspace *oldvmspace = p->p_vmspace;
        struct vmspace *newvmspace;
 
+       KASSERT((curthread->td_pflags & TDP_EXECVMSPC) == 0,
+           ("vmspace_exec recursed"));
        newvmspace = vmspace_alloc(minuser, maxuser);
        if (newvmspace == NULL)
                return (ENOMEM);
@@ -3537,7 +3539,7 @@ vmspace_exec(struct proc *p, vm_offset_t
        PROC_VMSPACE_UNLOCK(p);
        if (p == curthread->td_proc)
                pmap_activate(curthread);
-       vmspace_free(oldvmspace);
+       curthread->td_pflags |= TDP_EXECVMSPC;
        return (0);
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to