[PATCH 06/11] batctl: ping: keep huge '-i' intervals from turning into a flood ping

Sven Eckelmann <[email protected]> Tue, 07 Jul 2026 20:46:48 +0200
Newsgroups org.open-mesh.lists.batman
Message-ID <[email protected]>
strtod() happily accepts "inf" or values like 1e300 as ping interval.
Converting such a value to time_t for the nanosleep interval is undefined
behavior.

Clamp the interval to a well representable maximum before splitting it
into seconds and nanoseconds.

Fixes: 4ebe4fb7b08d ("batctl: ping: Add subsecond precision to ping interval")
Signed-off-by: Sven Eckelmann <[email protected]>
---
 ping.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/ping.c b/ping.c
index fcb8d5e..c875c38 100644
--- a/ping.c
+++ b/ping.c
@@ -106,12 +106,14 @@ static int ping(struct state *state, int argc, char **argv)
 		case 'i':
 			errno = 0;
 			ping_interval = strtod(optarg, &endptr);
-			if (errno || *endptr != '\0') {
+			if (errno || *endptr != '\0' || endptr == optarg ||
+			    !isfinite(ping_interval) || ping_interval <= 0) {
 				fprintf(stderr, "Error - invalid ping interval '%s'\n", optarg);
 				goto out;
 			}
 
 			ping_interval = fmax(ping_interval, 0.001);
+			ping_interval = fmin(ping_interval, 1000000000.0);
 			fractional_part = modf(ping_interval, &integral_part);
 			loop_interval.tv_sec = (time_t)integral_part;
 			loop_interval.tv_nsec = (long)(fractional_part * 1000000000l);

-- 
2.47.3