Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 31 Aug 2000 06:21:23 -0700
From:      Don Lewis <Don.Lewis@tsc.tdk.com>
To:        Tor.Egge@fast.no, rwatson@FreeBSD.ORG
Cc:        ohartman@ipamzlx.physik.uni-mainz.de, freebsd-stable@FreeBSD.ORG, cvs-committers@FreeBSD.ORG
Subject:   Re: 4.1 STABLE broken since today!
Message-ID:  <200008311321.GAA09415@salsa.gv.tsc.tdk.com>
In-Reply-To: <200008310411.GAA63367@midten.fast.no>
References:  <Pine.NEB.3.96L.1000830222247.18759A-100000@fledge.watson.org> <200008310411.GAA63367@midten.fast.no>

next in thread | previous in thread | raw e-mail | index | archive | help
On Aug 31,  6:11am, Tor.Egge@fast.no wrote:
} Subject: Re: 4.1 STABLE broken since today!
} > 
} > As commented on freebsd-current, this seems to have hit the -CURRENT
} > kernel at the same time.  Someone should *not* have MFC'd some change
} > immediately.  Not clear who yet.  I'm suspicious of the sbappend() changes
} > that have been going in recently.
} 
} 
} 1.  The value of diff in chgsbsize was always positive
}     (unsigned - unsigned results in an unsigned value).
}     This causes bogus values in ui_sbsize.

[ snip ]

} The following patch works for me.
} 
} Index: sys/kern/kern_proc.c
} ===================================================================
} RCS file: /home/ncvs/src/sys/kern/kern_proc.c,v
} retrieving revision 1.72
} diff -u -r1.72 kern_proc.c
} --- sys/kern/kern_proc.c	2000/08/30 04:49:07	1.72
} +++ sys/kern/kern_proc.c	2000/08/31 03:56:30
} @@ -210,7 +211,7 @@
}  	if (uip == NULL)
}  		uip = uicreate(uid);
}  	s = splnet();
} -	diff = to - *hiwat;
} +	diff = (rlim_t) to - (rlim_t) *hiwat;
}  	/* don't allow them to exceed max, but allow subtraction */
}  	if (diff > 0 && uip->ui_sbsize + diff > max) {
}  		(void)uifree(uip);

This depends on rlim_t being a signed type (which is happens to be).
Also, if "to" is the same width as rlim_t, then this code could break
if the difference was greater than the maximum positive value of rlim_t
(not likely in this particular case).  Changing the test from
	diff > 0
to
	to > *hiwat
is much safer.

I prefer the following patch to kern_proc.c, which also pulls uifree()
out of splnet(), and eliminates some duplicate code.  I'm not yet running
4-stable, so I can't test this patch other than to see if it compiles
without error.

--- kern_proc.c-	Wed Aug 30 05:29:52 2000
+++ kern_proc.c	Thu Aug 31 05:57:11 2000
@@ -201,7 +201,8 @@
 	rlim_t	max;
 {
 	struct uidinfo *uip;
-	rlim_t diff;
+	rlim_t new;
+	int ok = 0;
 	int s;
 
 	uip = uifind(uid);
@@ -210,18 +211,16 @@
 	if (uip == NULL)
 		uip = uicreate(uid);
 	s = splnet();
-	diff = to - *hiwat;
+	new = uip->ui_sbsize + to - *hiwat;
 	/* don't allow them to exceed max, but allow subtraction */
-	if (diff > 0 && uip->ui_sbsize + diff > max) {
-		(void)uifree(uip);
-		splx(s);
-		return (0);
+	if (to <= *hiwat || new <= max) {
+		uip->ui_sbsize = new;
+		*hiwat = to;
+		ok = 1;
 	}
-	uip->ui_sbsize += diff;
-	*hiwat = to;
-	(void)uifree(uip);
 	splx(s);
-	return (1);
+	(void)uifree(uip);
+	return (ok);
 }
 
 /*


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-stable" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200008311321.GAA09415>