git: ea6d16926666 - main - ping: Avoid reporting negative time statistics
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 19 Mar 2023 16:33:29 UTC
The branch main has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=ea6d16926666a717e2c0a898b954d1477ac34804
commit ea6d16926666a717e2c0a898b954d1477ac34804
Author: Jose Luis Duran <jlduran@gmail.com>
AuthorDate: 2023-02-09 23:38:54 +0000
Commit: Mark Johnston <markj@FreeBSD.org>
CommitDate: 2023-03-19 16:24:06 +0000
ping: Avoid reporting negative time statistics
Display a warning when the time goes back.
PR: 192417
Reviewed by: markj
MFC after: 1 week
Differential Revision: https://reviews.freebsd.org/D38480
---
sbin/ping/ping.c | 8 +++++++-
sbin/ping/tests/test_ping.py | 30 +++++++++++++++++++++++++++++-
2 files changed, 36 insertions(+), 2 deletions(-)
diff --git a/sbin/ping/ping.c b/sbin/ping/ping.c
index 299b582e29c1..6b82fe3da9de 100644
--- a/sbin/ping/ping.c
+++ b/sbin/ping/ping.c
@@ -1212,8 +1212,14 @@ pr_pack(char *buf, ssize_t cc, struct sockaddr_in *from, struct timespec *tv)
tv1.tv_sec = ntohl(tv32.tv32_sec);
tv1.tv_nsec = ntohl(tv32.tv32_nsec);
timespecsub(tv, &tv1, tv);
- triptime = ((double)tv->tv_sec) * 1000.0 +
+ triptime = ((double)tv->tv_sec) * 1000.0 +
((double)tv->tv_nsec) / 1000000.0;
+ if (triptime < 0) {
+ warnx("time of day goes back (%.3f ms),"
+ " clamping time to 0",
+ triptime);
+ triptime = 0;
+ }
tsum += triptime;
tsumsq += triptime * triptime;
if (triptime < tmin)
diff --git a/sbin/ping/tests/test_ping.py b/sbin/ping/tests/test_ping.py
index 7040faa71a5d..f1c961c5b551 100644
--- a/sbin/ping/tests/test_ping.py
+++ b/sbin/ping/tests/test_ping.py
@@ -268,6 +268,7 @@ def redact(output):
("hlim=[0-9]*", "hlim="),
("ttl=[0-9]*", "ttl="),
("time=[0-9.-]*", "time="),
+ ("\(-[0-9\.]+[0-9]+ ms\)", "(- ms)"),
("[0-9\.]+/[0-9.]+", "/"),
]
for pattern, repl in pattern_replacements:
@@ -1209,6 +1210,32 @@ ping: quoted data too short (28 bytes) from 192.0.2.2
},
id="_3_1_special_udp",
),
+ pytest.param(
+ {
+ "src": "192.0.2.1",
+ "dst": "192.0.2.2",
+ "icmp_type": 0,
+ "icmp_code": 0,
+ "special": "warp",
+ },
+ {
+ "returncode": 0,
+ "stdout": """\
+PATTERN: 0x01
+PING 192.0.2.2 (192.0.2.2): 56 data bytes
+64 bytes from: icmp_seq=0 ttl= time= ms
+
+--- 192.0.2.2 ping statistics ---
+1 packets transmitted, 1 packets received, 0.0% packet loss
+round-trip min/avg/max/stddev = /// ms
+""",
+ "stderr": """\
+ping: time of day goes back (- ms), clamping time to 0
+""",
+ "redacted": True,
+ },
+ id="_0_0_special_warp",
+ ),
]
@pytest.mark.parametrize("pinger_kargs, expected", pinger_testdata)
@@ -1221,6 +1248,7 @@ ping: quoted data too short (28 bytes) from 192.0.2.2
assert ping.returncode == expected["returncode"]
if expected["redacted"]:
assert redact(ping.stdout) == expected["stdout"]
+ assert redact(ping.stderr) == expected["stderr"]
else:
assert ping.stdout == expected["stdout"]
- assert ping.stderr == expected["stderr"]
+ assert ping.stderr == expected["stderr"]