Package: bing
Version: 1.1.3-2
Severity: normal
I too inadvertently then repeatedly have managed to reproduce this bug.
In my case I see 9223372036854775808 output instead of 2147483532.662ms as in
the reported case.
I was able to reproduce it on several Internet hosts although I didn't want to
try too often in case it triggered some security warning.
Using the host from the first bug report above for comparison:
bing -s 1000 -S 10000 localhost www.cam.ac.uk
BING localhost (127.0.0.1) and www.cam.ac.uk (131.111.8.46)
1000 and 10000 data bytes (144000 bits)
www.cam.ac.uk: 0.000bps 9223372036854775808.000ms
64051194700380384.000000us/bit
I noticed that 9223372036854775808 corresponds to (1 << 63) (I am using amd64)
which is roughly in line with the initial reports suspicion about -1.
Digging through the code, (a task I found a little challenging at first as it
was to be written in old-school C, but persistence pays off), I discovered that
this constant was used to indicate an uninitialised timing result.
Further digging, I noticed a function ping_and_wait() that would return if
icmp_recv() indicated a time-out, but did not inform the caller of this
situation. It seems that if the ICMP_ECHOREPLY is not received in time, this
timeout happened, and another function, pr_pack() is not called, resulting in
the affected time information structure remaining uninitialised, causing the
bug.
This only occurs for some hosts, so possibly the network in between is
filtering larger ICMP packets?
My workaround is to have ping_and_wait() return a flag and then check this at
the caller, which will print a warning and abort the current calculation as
unachievable.
I have attached a patch against the bing.c that was installed by using apt-get
source, please note having not done so before I am currently unfamiliar with
the correct way to submit a patch to Debian.
thanks,
Andrew
http://blog.oldcomputerjunk.net
-- System Information:
Debian Release: 6.0.1
APT prefers stable
APT policy: (610, 'stable'), (600, 'stable'), (500, 'stable-updates'), (300,
'testing')
Architecture: amd64 (x86_64)
Kernel: Linux 2.6.39-bpo.2-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_AU.UTF-8, LC_CTYPE=en_AU.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Versions of packages bing depends on:
ii libc6 2.11.2-10 Embedded GNU C Library: Shared lib
bing recommends no packages.
bing suggests no packages.
-- no debconf information
913c913
< void ping_and_wait(hs, datalen, buf, buflen)
---
> int ping_and_wait(hs, datalen, buf, buflen)
944c944
< break;
---
> return 1;
949a950
> return 0;
1594,1595c1595,1599
< ping_and_wait(hs2, j,
< (char *)recv_packet, recv_packlen);
---
> if (1 == ping_and_wait(hs2, j,
> (char *)recv_packet, recv_packlen)) {
> fprintf( stderr, "bing: timed out waiting for ICMP_ECHOREPLY for length %d\n", j);
> break;
> }
1598,1599c1602,1606
< ping_and_wait(hs2, datalen_big,
< (char *)recv_packet, recv_packlen);
---
> if (1==ping_and_wait(hs2, datalen_big,
> (char *)recv_packet, recv_packlen)) {
> fprintf( stderr, "bing: timed out waiting for final ICMP_ECHOREPLY for length %d\n", datalen_big);
> break;
> }