From: Jim Warner Date: Mon, 19 Sep 2022 05:00:00 +0000 (-0500) Subject: top: try avoiding the edge of a 'divide by zero' cliff <=== port of newlib 5f9185e0 X-Git-Tag: v4.0.3_rc1~33^2~2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ca182cb8945016c2f70b721199a7c2da1de6e298;p=procps-ng top: try avoiding the edge of a 'divide by zero' cliff <=== port of newlib 5f9185e0 ______________________________ original newlib message ----------------------------------- ( minus git hash ) Darn, after testing on some older, out of date distros I was embarrassed to find some awful code I created in the commit shown below. I was rewarded with some 'nan' floating point values and 'inf' computational results. Reference(s); . a missed opportunity to repent commit ........................................ . true source of my original sin commit ........................................ Signed-off-by: Jim Warner --- diff --git a/top/top.c b/top/top.c index f6950191..9c046e58 100644 --- a/top/top.c +++ b/top/top.c @@ -6331,19 +6331,22 @@ static struct rx_st *sum_rx (struct graph_parms *these) { static __thread struct rx_st rx; char buf1[SMLBUFSIZ], buf2[SMLBUFSIZ], buf3[MEDBUFSIZ]; int ix, num1, num2, width; - float scale; + float scale = 0.0; - scale = 100.0 / these->total; + if (these->total > 0) + scale = 100.0 / these->total; rx.pcnt_one = scale * these->part1; rx.pcnt_two = scale * these->part2; if (rx.pcnt_one + rx.pcnt_two > 100.0 || rx.pcnt_two < 0) rx.pcnt_two = 0; rx.pcnt_tot = rx.pcnt_one + rx.pcnt_two; - num1 = (int)((rx.pcnt_one * these->adjust) + .5), + num1 = (int)((rx.pcnt_one * these->adjust) + .5); num2 = (int)((rx.pcnt_two * these->adjust) + .5); - if (num1 + num2 > these->length) + if (num1 + num2 > these->length) { + if (num1 > these->length) num1 = these->length; num2 = these->length - num1; + } width = these->length; buf1[0] = buf2[0] = buf3[0] = '\0';