From a5d663fa9af83d7ee27b6d035b8dbb3b3a1c98fe Mon Sep 17 00:00:00 2001 From: 0x35c <> Date: Tue, 17 Jun 2025 21:47:13 +0200 Subject: [PATCH] fix: parsing handling negative values for the ports and threads --- src/parsing.c | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/src/parsing.c b/src/parsing.c index 746c449..2fca4f6 100644 --- a/src/parsing.c +++ b/src/parsing.c @@ -47,7 +47,7 @@ e_scantype parse_type(const char *arg) for (size_t i = 0; i < 6; i++) if (!strcmp(arg, types_str[i])) return i; - dprintf(2, "ft_nmap: type: invalid argument: '%s'\n", arg); + dprintf(2, "ft_nmap: invalid argument to --scan: '%s'\n", arg); return -1; } @@ -80,6 +80,10 @@ int parse_ports(const char *arg, uint16_t *p_start, uint16_t *p_end) arg, UINT16_MAX); return -1; } + if (start < 0 || end < 0) { + dprintf(2, "ft_nmap: invalid port value: %d\n", start); + return -1; + } *p_start = start; *p_end = end; return 0; @@ -92,9 +96,13 @@ static int check_arg(e_flag flag, const char *arg) { switch (flag) { case FL_SPEEDUP: { - for (size_t i = 0; arg[i]; i++) - if (!isdigit(arg[i])) + for (size_t i = 0; arg[i]; i++) { + if (!isdigit(arg[i])) { + dprintf(2, "ft_nmap: invalid argument: %s\n", + arg); return -1; + } + } int value = atoi(arg); if (value < 0 || value > 250) { dprintf(2, @@ -127,11 +135,11 @@ static int check_arg(e_flag flag, const char *arg) "Invalid argument\n"); return -1; } else if (nb < 0 || nb > 255) { - dprintf( - 2, - "ft_nmap: invalid argument: '%s': out of range: 0 " - "<= value <= 255\n", - arg); + dprintf(2, + "ft_nmap: invalid argument: '%s': out " + "of range: 0 " + "<= value <= 255\n", + arg); return -1; } break; @@ -142,11 +150,11 @@ static int check_arg(e_flag flag, const char *arg) dprintf(2, "ft_nmap: cannot set max_retries to 0\n"); return -1; } else if (nb < 0 || nb > 255) { - dprintf( - 2, - "ft_nmap: invalid argument: '%s': out of range: 0 " - "<= value <= 255\n", - arg); + dprintf(2, + "ft_nmap: invalid argument: '%s': out " + "of range: 0 " + "<= value <= 255\n", + arg); return -1; } break; @@ -233,6 +241,12 @@ int parsing(struct scan *general, const struct option_lst *options) if (parse_ports(get_option_arg(options, FL_PORTS), &general->port_start, &general->port_end)) return -1; + if (general->port_start <= 0 || general->port_end <= 0) { + dprintf(2, "ft_nmap: invalid port value: %d\n", + general->port_start <= 0 ? general->port_start + : general->port_end); + return -1; + } general->type = parse_type(get_option_arg(options, FL_TYPE)); if ((int)general->type == -1) return -1; @@ -243,7 +257,8 @@ int parsing(struct scan *general, const struct option_lst *options) const char *nb_threads_str = get_option_arg(options, FL_SPEEDUP); uint8_t nb_threads = nb_threads_str ? atoi(nb_threads_str) : 1; if (general->port_end - general->port_start + 1 < nb_threads) { - dprintf(2, "ft_nmap: number of threads to use must be superior " + dprintf(2, "ft_nmap: number of threads to use must be " + "superior " "or equals to the ports range\n"); return -1; }