From owner-freebsd-stable@FreeBSD.ORG Sun Aug 24 11:56:21 2003 Return-Path: Delivered-To: freebsd-stable@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id C306916A4BF; Sun, 24 Aug 2003 11:56:21 -0700 (PDT) Received: from HAL9000.homeunix.com (12-233-57-131.client.attbi.com [12.233.57.131]) by mx1.FreeBSD.org (Postfix) with ESMTP id 1EC6743FE5; Sun, 24 Aug 2003 11:56:21 -0700 (PDT) (envelope-from das@FreeBSD.ORG) Received: from HAL9000.homeunix.com (localhost [127.0.0.1]) by HAL9000.homeunix.com (8.12.9/8.12.9) with ESMTP id h7OIuKuQ003931; Sun, 24 Aug 2003 11:56:20 -0700 (PDT) (envelope-from das@FreeBSD.ORG) Received: (from das@localhost) by HAL9000.homeunix.com (8.12.9/8.12.9/Submit) id h7OIuISr003930; Sun, 24 Aug 2003 11:56:18 -0700 (PDT) (envelope-from das@FreeBSD.ORG) Date: Sun, 24 Aug 2003 11:56:18 -0700 From: David Schultz To: Eugene Grosbein Message-ID: <20030824185618.GA3837@HAL9000.homeunix.com> Mail-Followup-To: Eugene Grosbein , stable@freebsd.org, bug-followup@freebsd.org References: <20030815211321.A11482@grosbein.pp.ru> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20030815211321.A11482@grosbein.pp.ru> cc: stable@FreeBSD.ORG cc: bug-followup@FreeBSD.ORG Subject: Re: bin/55346: /bin/sh eats memory and CPU infinitely X-BeenThere: freebsd-stable@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Production branch of FreeBSD source code List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 24 Aug 2003 18:56:21 -0000 On Fri, Aug 15, 2003, Eugene Grosbein wrote: > I think I've found a memory leak in /bin/sh. > There is a case when dowait() and does frees resources of > completed job correctly. Here is a patch: > > Index: jobs.c > =================================================================== > RCS file: /home/ncvs/src/bin/sh/jobs.c,v > retrieving revision 1.27.2.11 > diff -u -r1.27.2.11 jobs.c > --- jobs.c 22 Jul 2003 13:11:26 -0000 1.27.2.11 > +++ jobs.c 15 Aug 2003 13:02:23 -0000 > @@ -960,10 +960,8 @@ > if (jp->state != state) { > TRACE(("Job %d: changing state from %d to %d\n", jp - jobtab + 1, jp->state, state)); > jp->state = state; > -#if JOBS > if (done) > - deljob(jp); > -#endif > + freejob(jp); > } > } > } I don't think this is right. This will cause jobs to be freed even when they shouldn't be. The general problem you're complaining about (here and earlier) is that /bin/sh only checks for the termination of backgrounded children when it displays a prompt, and of course it doesn't do that in the middle of a while loop. I don't know what the various standards have to say about this, but the behavior is probably just a bug.