From owner-freebsd-bugs@FreeBSD.ORG Thu Aug 2 13:50:09 2012 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 65060106564A for ; Thu, 2 Aug 2012 13:50:09 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 35DA68FC14 for ; Thu, 2 Aug 2012 13:50:09 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.5/8.14.5) with ESMTP id q72Do9nX056778 for ; Thu, 2 Aug 2012 13:50:09 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.5/8.14.5/Submit) id q72Do9qa056777; Thu, 2 Aug 2012 13:50:09 GMT (envelope-from gnats) Date: Thu, 2 Aug 2012 13:50:09 GMT Message-Id: <201208021350.q72Do9qa056777@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org From: Andrey Zonov Cc: Subject: Re: kern/76972: 64-bit integer overflow computing user cpu time in calcru() in kern_resource.c X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: Andrey Zonov List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 02 Aug 2012 13:50:09 -0000 The following reply was made to PR kern/76972; it has been noted by GNATS. From: Andrey Zonov To: bug-followup@FreeBSD.org, cal@aero.org Cc: Subject: Re: kern/76972: 64-bit integer overflow computing user cpu time in calcru() in kern_resource.c Date: Thu, 02 Aug 2012 17:42:21 +0400 This is a multi-part message in MIME format. --------------080901070902080400040909 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Hi, I stepped on this sometime ago. I suggest simple patch that fixed problem for me. $ ps -o lstart,time,systime,usertime -p 63292 STARTED TIME SYSTIME USERTIME Sat Jun 16 13:49:20 2012 1017686:25.32 67:05.75 1017619:19.56 -- Andrey Zonov --------------080901070902080400040909 Content-Type: text/plain; charset=UTF-8; name="kern_resource.c.patch.txt" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="kern_resource.c.patch.txt" commit 97dcdfe872b83ece41e61c434937f924ea3ef2f5 Author: Andrey Zonov Date: Thu Jun 14 00:29:33 2012 +0400 - Prevent overflow for usertime/systime in caclru1(). diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c index b09e031..cb3d854 100644 --- a/sys/kern/kern_resource.c +++ b/sys/kern/kern_resource.c @@ -880,6 +880,8 @@ rufetchtd(struct thread *td, struct rusage *ru) calcru1(p, &td->td_rux, &ru->ru_utime, &ru->ru_stime); } +#define mul_div(a, b, c) (a/c)*b + (a%c)*(b/c) + (a%c)*(b%c)/c + static void calcru1(struct proc *p, struct rusage_ext *ruxp, struct timeval *up, struct timeval *sp) @@ -909,10 +911,10 @@ calcru1(struct proc *p, struct rusage_ext *ruxp, struct timeval *up, * The normal case, time increased. * Enforce monotonicity of bucketed numbers. */ - uu = (tu * ut) / tt; + uu = mul_div(tu, ut, tt); if (uu < ruxp->rux_uu) uu = ruxp->rux_uu; - su = (tu * st) / tt; + su = mul_div(tu, st, tt); if (su < ruxp->rux_su) su = ruxp->rux_su; } else if (tu + 3 > ruxp->rux_tu || 101 * tu > 100 * ruxp->rux_tu) { @@ -941,8 +943,8 @@ calcru1(struct proc *p, struct rusage_ext *ruxp, struct timeval *up, "to %ju usec for pid %d (%s)\n", (uintmax_t)ruxp->rux_tu, (uintmax_t)tu, p->p_pid, p->p_comm); - uu = (tu * ut) / tt; - su = (tu * st) / tt; + uu = mul_div(tu, ut, tt); + su = mul_div(tu, st, tt); } ruxp->rux_uu = uu; --------------080901070902080400040909--