divide-by-zero
Subsystems (2)
Hi,
When generating packets with pktgen with count=10, I get a divide-by-zero oops in inject().
Line 273 in net/core/pktgen.c seems unsafe:
__u64 pps = (__u32)(info->sofar * 1000) / ((__u32)(total) / 1000);
What if total < 1000 ?
cheers,
Lennert
Quoted 8 lines · Lennert Buytenhek
When generating packets with pktgen with count=10, I get a divide-by-zero oops in
inject().Line 273 in
net/core/pktgen.cseems unsafe:__u64 pps = (__u32)(info->sofar * 1000) / ((__u32)(total) / 1000);What if total < 1000 ?
Since noone else seemed to care, try this patch. Against -test11, yeah, I'm lazy again.
Jörn
Signature · 16 lines
Time? What's that? Time is only worth what you do with it.
-- Theo de Raadt
--- old/net/core/pktgen.c 2003-11-26 21:44:47.000000000 +0100
+++ new/net/core/pktgen.c 2004-01-18 16:27:10.000000000 +0100
@@ -720,7 +720,9 @@
{
char *p = info->result;
- __u64 pps = (__u32)(info->sofar * 1000) / ((__u32)(total) / 1000);
+ __u32 safe_total = (__u32)(total) / 1000;
+ safe_total += 1 - (!!safe_total); /* avoid divide-by-zero */
+ __u64 pps = (__u32)(info->sofar * 1000) / safe_total;
__u64 bps = pps * 8 * (info->pkt_size + 4); /* take 32bit ethernet CRC into account */
p += sprintf(p, "OK: %llu(c%llu+d%llu) usec, %llu (%dbyte,%dfrags) %llupps %lluMb/sec (%llubps) errors: %llu",
(unsigned long long) total,Review
Quoted 1 line · Jörn Engel
(quoted diff) +1
-0+ safe_total += 1 - (!!safe_total); /* avoid divide-by-zero */
That's a (binary ;-) order of magnitude more complicated than necessary:
Quoted 1 line
Quoted 1 line
(quoted diff) +1
-0+ safe_total += !safe_total; /* avoid divide-by-zero */
Signature · 6 lines
Matthias Urlichs | {M:U} IT Design @ m-u-it.de | [email protected]
Disclaimer: The quote was selected randomly. Really. | http://smurf.noris.de
- -
To believe that the nonexistence of God is a fact on the level of water
not running uphill, or the moon not having an atmosphere, requires far
more faith than I could ever muster. -- Arthur D. HlavatyHello!
Quoted 5 lines · Jörn Engel
Quoted 4 lines · Lennert Buytenhek
When generating packets with pktgen with count=10, I get a divide-by-zero oops in
inject().
Quoted 7 lines
Quoted 4 lines
Line 273 in
net/core/pktgen.cseems unsafe:__u64 pps = (__u32)(info->sofar * 1000) / ((__u32)(total) / 1000);What if total < 1000 ?
Since noone else seemed to care, try this patch. Against -test11, yeah, I'm lazy again.
Sorry I missed Lennerts original posting...
I suggest the patch below to get integer precision at very short time intervals too.
net/core/pktgen.c renamed from net/core/pktgen.c.orig +13 -3
@@ -88,7 +88,7 @@#define cycles () ((u32)get_cycles()) -#define VERSION "pktgen version 1.3" +#define VERSION "pktgen version 1.31"static char version[]__initdata ="pktgen.c: v1.3: Packet Generator for packet performance testing.\n" ;
@@ -720,8 +720,18 @@ {char *p = info->result; -__u64 pps = (__u32)(info->sofar *1000 ) / ((__u32)(total) /1000 ); -__u64 bps = pps *8 * (info->pkt_size +4 );/* take 32bit ethernet CRC into account */ +__u64 bps, pps =0 ; + +if (total >1000 ) + pps = (__u32)(info->sofar *1000 ) / ((__u32)(total) /1000 ); +else if (total >100 ) + pps = (__u32)(info->sofar *10000 ) / ((__u32)(total) /100 ); +else if (total >10 ) + pps = (__u32)(info->sofar *100000 ) / ((__u32)(total) /10 ); +else if (total >1 ) + pps = (__u32)(info->sofar *1000000 ) / (__u32 )total; + + bps = pps *8 * (info->pkt_size +4 );/* take 32bit ethernet CRC into account */ p += sprintf(p, "OK: %llu(c%llu+d%llu) usec, %llu (%dbyte,%dfrags) %llupps %lluMb/sec (%llubps) errors: %llu", (unsigned long long) total, (unsigned long long) (total - idle),
Cheers.
--ro
David S. Miller
AppliedQuoted 2 lines · On Mon, 19 Jan 2004 00:15:41 +0100 Robert Olsson <[email protected]>…
I suggest the patch below to get integer precision at very short time intervals too.
Applied, thanks Robert.