From owner-freebsd-current Sun Jun 16 7:15:11 2002 Delivered-To: freebsd-current@freebsd.org Received: from mta6.snfc21.pbi.net (mta6.snfc21.pbi.net [206.13.28.240]) by hub.freebsd.org (Postfix) with ESMTP id 0398237B417; Sun, 16 Jun 2002 07:15:06 -0700 (PDT) Received: from kokeb.ambesa.net ([64.166.84.78]) by mta6.snfc21.pbi.net (iPlanet Messaging Server 5.1 (built May 7 2001)) with ESMTP id <0GXS00KIKY9428@mta6.snfc21.pbi.net>; Sun, 16 Jun 2002 07:15:05 -0700 (PDT) Received: from kokeb.ambesa.net (tanstaafl@localhost [127.0.0.1]) by kokeb.ambesa.net (8.12.3/8.12.3) with ESMTP id g5GEKN37018899; Sun, 16 Jun 2002 07:20:23 -0700 (PDT envelope-from mikem@kokeb.ambesa.net) Received: (from mikem@localhost) by kokeb.ambesa.net (8.12.3/8.12.3/Submit) id g5GEKIPu018898; Sun, 16 Jun 2002 07:20:18 -0700 (PDT envelope-from mikem) Date: Sun, 16 Jun 2002 07:20:18 -0700 From: Mike Makonnen Subject: Re: Fixing "could sleeep..." was (Re: ../../../vm/uma_core.c:132 In-reply-to: <20020616041023.47491ea3.makonnen@pacbell.net> To: Mike Makonnen Cc: jhb@FreeBSD.ORG, hiten@uk.FreeBSD.org, jrh@lab.it.uc3m.es, freebsd-current@FreeBSD.ORG Message-id: <20020616072018.236732cc.makonnen@pacbell.net> MIME-version: 1.0 X-Mailer: Sylpheed version 0.7.0 (GTK+ 1.2.10; i386--freebsd5.0) Content-type: text/plain; charset=US-ASCII Content-transfer-encoding: 7BIT References: <20020611152747.091c2377.makonnen@pacbell.net> <20020616041023.47491ea3.makonnen@pacbell.net> Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG On Sun, 16 Jun 2002 04:10:23 -0700 Mike Makonnen 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. I didn't catch all instances of allocated resources (newargs). 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 majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message