From owner-freebsd-stable Thu Sep 14 15:26:45 2000 Delivered-To: freebsd-stable@freebsd.org Received: from fw.wintelcom.net (ns1.wintelcom.net [209.1.153.20]) by hub.freebsd.org (Postfix) with ESMTP id A171837B422 for ; Thu, 14 Sep 2000 15:26:42 -0700 (PDT) Received: (from bright@localhost) by fw.wintelcom.net (8.10.0/8.10.0) id e8EMQaG06393; Thu, 14 Sep 2000 15:26:36 -0700 (PDT) Date: Thu, 14 Sep 2000 15:26:36 -0700 From: Alfred Perlstein To: Don Lewis Cc: Vivek Khera , stable@FreeBSD.ORG Subject: Re: negative proccnt Message-ID: <20000914152635.X12231@fw.wintelcom.net> References: <14785.12095.673316.885249@onceler.kciLink.com> <200009142046.NAA26980@salsa.gv.tsc.tdk.com> <14785.15822.898420.198946@onceler.kciLink.com> <200009142207.PAA27239@salsa.gv.tsc.tdk.com> <200009142222.PAA27308@salsa.gv.tsc.tdk.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.4i In-Reply-To: <200009142222.PAA27308@salsa.gv.tsc.tdk.com>; from Don.Lewis@tsc.tdk.com on Thu, Sep 14, 2000 at 03:22:20PM -0700 Sender: owner-freebsd-stable@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG * Don Lewis [000914 15:22] wrote: > On Sep 14, 3:07pm, Don Lewis wrote: > } Subject: Re: negative proccnt > > } I believe the problem is here in fork1(): > } > } /* > } * Increment the count of procs running with this uid. Don't allow > } * a nonprivileged user to exceed their current limit. > } */ > } ok = chgproccnt(p1->p_cred->p_uidinfo, 1, > } p1->p_rlimit[RLIMIT_NPROC].rlim_cur); > } if (uid != 0 && !ok) { > } /* > } * Back out the process count > } */ > } nprocs--; > } return (EAGAIN); > } } > } > } If chgproccnt() failes because the limit would be exceeded, the > } proccnt won't be incremented, but the following test will let > } the fork happen anyway if uid is 0. The eventual exit() decrements > } proccnt and may result in an underflow. > } > } As a workaround, you can bump the process limit for root and/or reap > } processes more often. > > ... or you can try this patch: > > Index: kern_fork.c > =================================================================== > RCS file: /home/ncvs/src/sys/kern/kern_fork.c,v > retrieving revision 1.72.2.4 > diff -u -r1.72.2.4 kern_fork.c > --- kern_fork.c 2000/09/07 19:13:36 1.72.2.4 > +++ kern_fork.c 2000/09/14 22:19:59 > @@ -246,8 +246,8 @@ > * a nonprivileged user to exceed their current limit. > */ > ok = chgproccnt(p1->p_cred->p_uidinfo, 1, > - p1->p_rlimit[RLIMIT_NPROC].rlim_cur); > - if (uid != 0 && !ok) { > + (uid != 0) ? p1->p_rlimit[RLIMIT_NPROC].rlim_cur : 0); > + if (!ok) { > /* > * Back out the process count > */ That doesn't look like valid C to me. :) -- -Alfred Perlstein - [bright@wintelcom.net|alfred@freebsd.org] "I have the heart of a child; I keep it in a jar on my desk." To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-stable" in the body of the message