Author: mjg
Date: Sun Aug 17 06:54:49 2014
New Revision: 270085
URL: http://svnweb.freebsd.org/changeset/base/270085

Log:
  MFC r268087:
  
  Don't call crcopysafe or uifind unnecessarily in execve.

Modified:
  stable/10/sys/kern/kern_exec.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/kern/kern_exec.c
==============================================================================
--- stable/10/sys/kern/kern_exec.c      Sun Aug 17 06:52:35 2014        
(r270084)
+++ stable/10/sys/kern/kern_exec.c      Sun Aug 17 06:54:49 2014        
(r270085)
@@ -339,7 +339,7 @@ do_execve(td, args, mac_p)
        struct proc *p = td->td_proc;
        struct nameidata nd;
        struct ucred *newcred = NULL, *oldcred;
-       struct uidinfo *euip;
+       struct uidinfo *euip = NULL;
        register_t *stack_base;
        int error, i;
        struct image_params image_params, *imgp;
@@ -604,8 +604,6 @@ interpret:
        /*
         * Malloc things before we need locks.
         */
-       newcred = crget();
-       euip = uifind(attr.va_uid);
        i = imgp->args->begin_envv - imgp->args->begin_argv;
        /* Cache arguments if they fit inside our allowance */
        if (ps_arg_cache_limit >= i + sizeof(struct pargs)) {
@@ -634,7 +632,7 @@ interpret:
        PROC_LOCK(p);
        if (oldsigacts)
                p->p_sigacts = newsigacts;
-       oldcred = crcopysafe(p, newcred);
+       oldcred = p->p_ucred;
        /* Stop profiling */
        stopprofclock(p);
 
@@ -724,6 +722,8 @@ interpret:
                vn_lock(imgp->vp, LK_SHARED | LK_RETRY);
                if (error != 0)
                        goto done1;
+               newcred = crdup(oldcred);
+               euip = uifind(attr.va_uid);
                PROC_LOCK(p);
                /*
                 * Set the new credentials.
@@ -748,7 +748,6 @@ interpret:
                change_svuid(newcred, newcred->cr_uid);
                change_svgid(newcred, newcred->cr_gid);
                p->p_ucred = newcred;
-               newcred = NULL;
        } else {
                if (oldcred->cr_uid == oldcred->cr_ruid &&
                    oldcred->cr_gid == oldcred->cr_rgid)
@@ -767,10 +766,12 @@ interpret:
                 */
                if (oldcred->cr_svuid != oldcred->cr_uid ||
                    oldcred->cr_svgid != oldcred->cr_gid) {
+                       PROC_UNLOCK(p);
+                       newcred = crdup(oldcred);
+                       PROC_LOCK(p);
                        change_svuid(newcred, newcred->cr_uid);
                        change_svgid(newcred, newcred->cr_gid);
                        p->p_ucred = newcred;
-                       newcred = NULL;
                }
        }
 
@@ -847,11 +848,10 @@ done1:
        /*
         * Free any resources malloc'd earlier that we didn't use.
         */
-       uifree(euip);
-       if (newcred == NULL)
+       if (euip != NULL)
+               uifree(euip);
+       if (newcred != NULL)
                crfree(oldcred);
-       else
-               crfree(newcred);
        VOP_UNLOCK(imgp->vp, 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