From 6dcc4f39ccace06f978d122d3fe70fc473ebc573 Mon Sep 17 00:00:00 2001 From: starnakin Date: Tue, 18 Nov 2025 08:16:02 -0600 Subject: [PATCH] fix: check if number contain only digit --- src/main.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main.c b/src/main.c index 9b85e1f..6205cb5 100644 --- a/src/main.c +++ b/src/main.c @@ -24,6 +24,7 @@ #include #include #include +#include #include bool loop = true; @@ -41,23 +42,29 @@ static int parsing_number(const char *str, size_t min, size_t max, size_t *out) while (*start != '\0') { + if (!isdigit(*start)) + goto value_error; size_t tmp = number * 10 + *start - '0'; if (tmp < number) - goto value_error; + goto range_error; number = tmp; start++; } if (min > number || number > max) - goto value_error; + goto range_error; *out = number; return 0; -value_error: +range_error: print_err("invalid argument: '%s': out of range: %zu <= value <= %zu", str, min, max); return 1; + +value_error: + print_err("invalid argument: in '%s' '%c' is not a digit", str, *start); + return 1; } static int get_setting(char * const *av, struct setting *setting) @@ -95,7 +102,7 @@ int main(int ac, char **av) if (get_setting(av + 1, &settings)) return 1; - size_t payload_size = 20; + size_t payload_size = 56; size_t packet_size = sizeof(struct icmphdr) + payload_size; signal(SIGINT, signal_handler); @@ -166,7 +173,7 @@ int main(int ac, char **av) double time_interval = ((stop.tv_sec - start.tv_sec) * 1000 + ((double)stop.tv_usec - (double) start.tv_usec) / 1000); struct icmphdr *hdr = (struct icmphdr *) packet; - printf("%zu bytes from %s (%s): icmp_seq=%d, ttl=%u, time=%fms\n", payload_size + sizeof(struct icmphdr) + sizeof(struct iphdr) + sizeof(struct ether_header), settings.dest.reverse_dns, settings.dest.ipstr, htons(hdr->un.echo.sequence), 116, time_interval); + printf("%zu bytes from %s (%s): icmp_seq=%d, ttl=%u, time=%fms\n", payload_size + sizeof(struct icmphdr), settings.dest.reverse_dns, settings.dest.ipstr, htons(hdr->un.echo.sequence), 116, time_interval); sleep(1);