On Sun, 16 Jun 2002 04:10:23 -0700
Mike Makonnen <[EMAIL PROTECTED]> wrote:
> 
> I don't know if you recieved my earlier email about a bug that I found in
> execve() while working on fixing the "malloc w/ process lock held" bugs.
> Here's a simpler patch.
> 
> It fixes possible resource leaks and failure to unlock a lock, introduced
> by nectar@ in rev. 1.162 of kern/kern_exec.c, in the case where the call
> to fdcheckstd() fails. Basically it fails to deallocate resources and unlock the
> process lock.

<embarrased grin>
        I didn't catch all instances of allocated resources (newargs).
</embarrased grin>

Index: sys/kern/kern_exec.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_exec.c,v
retrieving revision 1.164
diff -u -r1.164 kern_exec.c
--- sys/kern/kern_exec.c        7 Jun 2002 05:41:27 -0000       1.164
+++ sys/kern/kern_exec.c        16 Jun 2002 14:14:37 -0000
@@ -133,7 +133,7 @@
        struct image_params image_params, *imgp;
        struct vattr attr;
        int (*img_first)(struct image_params *);
-       struct pargs *oldargs, *newargs = NULL;
+       struct pargs *oldargs=NULL, *newargs = NULL;
        struct procsig *oldprocsig, *newprocsig;
 #ifdef KTRACE
        struct vnode *tracevp = NULL;
@@ -383,8 +383,10 @@
 #endif
                /* Make sure file descriptors 0..2 are in use.  */
                error = fdcheckstd(td);
-               if (error != 0)
-                       goto exec_fail_dealloc;
+               if (error != 0) {
+                       oldcred = NULL;
+                       goto done1;
+               }
                /*
                 * Set the new credentials.
                 */
@@ -467,6 +469,7 @@
                p->p_args = newargs;
                newargs = NULL;
        }
+done1:
        PROC_UNLOCK(p);
 
        /*
@@ -476,7 +479,6 @@
                crfree(oldcred);
        else
                crfree(newcred);
-       KASSERT(newargs == NULL, ("leaking p_args"));
        /*
         * Handle deferred decrement of ref counts.
         */
@@ -486,7 +488,10 @@
        if (tracevp != NULL)
                vrele(tracevp);
 #endif
-       pargs_drop(oldargs);
+       if (oldargs != NULL)
+               pargs_drop(oldargs);
+       if (newargs != NULL)
+               pargs_drop(newargs);
 
 exec_fail_dealloc:
 

To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to