From 31530c83a49acd12c8583d61126516f58605b822 Mon Sep 17 00:00:00 2001 From: 0x35c <> Date: Thu, 5 Jun 2025 11:10:42 +0200 Subject: [PATCH] fix: data races with getservent feature: time elapsed in the print --- src/main.c | 15 +++++++++++++-- src/print.c | 2 +- src/response.c | 29 ++++++++++++++++++----------- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/main.c b/src/main.c index 80a3026..15e2d71 100644 --- a/src/main.c +++ b/src/main.c @@ -5,6 +5,7 @@ #include #include #include +#include #include "dns.h" #include "interface.h" @@ -19,11 +20,19 @@ static int scan_host(struct scan *general, uint8_t nb_threads) if (dns_lookup(general->dest_addr, general->dest_addr, &addr_con)) { return -1; } + struct response responses[1024] = {0}; + struct timespec start, end; + general->responses = responses; + printf("Scanning...\n"); + clock_gettime(CLOCK_MONOTONIC, &start); if (create_threads(general, nb_threads) < 0) return -1; - print_host_results(general, 10); + clock_gettime(CLOCK_MONOTONIC, &end); + double time_elapsed = + (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1e9; + print_host_results(general, time_elapsed); return 0; } @@ -37,8 +46,10 @@ int main(int ac, char **av) } struct option_lst *options = parse_options(ac, av); - if (options == NULL) + if (options == NULL) { + print_usage(); return 1; + } if (option_isset(options, FL_HELP)) { print_usage(); diff --git a/src/print.c b/src/print.c index e7ce908..94e5c51 100644 --- a/src/print.c +++ b/src/print.c @@ -68,7 +68,6 @@ static void print_port_state(uint16_t port, e_scantype type, void print_host_results(const struct scan *general, double scan_time) { - printf("Scan took %lf secs\n", scan_time); printf("IP address: %s\n", general->dest_addr); printf("Opened ports:\n"); for (uint16_t port = general->port_start; port < general->port_end; @@ -87,4 +86,5 @@ void print_host_results(const struct scan *general, double scan_time) if (!is_port_opened(response->states, general->type)) print_port_state(port, general->type, response); } + printf("\nScan took %lf secs\n", scan_time); } diff --git a/src/response.c b/src/response.c index 1faed4c..672b28a 100644 --- a/src/response.c +++ b/src/response.c @@ -12,24 +12,27 @@ extern pthread_mutex_t g_getservent; static char *get_service_name(int port, char *proto) { + char *name = NULL; pthread_mutex_lock(&g_getservent); struct servent *servent = getservbyport(htons(port), proto); + if (servent) + name = strdup(servent->s_name); pthread_mutex_unlock(&g_getservent); - if (!servent) - return NULL; - return strdup(servent->s_name); + return name; } void tcp_response(const struct tcphdr *tcphdr, const struct scan *data) { const e_scantype type = data->type; if (type == SCAN_UDP) { - dprintf(2, "ft_nmap: error: received a TCP responses for an UDP " - "scan\n"); + dprintf(2, + "ft_nmap: error: received a TCP responses for an UDP " + "scan\n"); return; } if (data->responses->service == NULL) - data->responses->service = get_service_name(data->port_start, "tcp"); + data->responses->service = + get_service_name(data->port_start, "tcp"); if (type == SCAN_SYN) { if (tcphdr->ack == 1 && tcphdr->syn == 1) data->responses->states[type] = OPENED; @@ -49,12 +52,14 @@ void udp_response(const struct udphdr *udphdr, const struct scan *data) { (void)udphdr; if (data->type != SCAN_UDP) { - dprintf(2, "ft_nmap: error: received an UDP responses for a TCP " - "scan\n"); + dprintf(2, + "ft_nmap: error: received an UDP responses for a TCP " + "scan\n"); return; } if (data->responses->service == NULL) - data->responses->service = get_service_name(data->port_start, "udp"); + data->responses->service = + get_service_name(data->port_start, "udp"); data->responses->states[SCAN_UDP] = OPENED; } @@ -64,7 +69,8 @@ void icmp_response(const struct icmphdr *icmphdr, const struct scan *data) data->responses->service = get_service_name(data->port_start, "udp"); if (data->responses->service == NULL) - data->responses->service = get_service_name(data->port_start, "tcp"); + data->responses->service = + get_service_name(data->port_start, "tcp"); if (type == SCAN_SYN && icmphdr->type == 3) data->responses->states[type] = FILTERED; else if (type == SCAN_ACK && icmphdr->type == 3) @@ -87,7 +93,8 @@ void no_response(const struct scan *data) data->responses->service = get_service_name(data->port_start, "udp"); if (data->responses->service == NULL) - data->responses->service = get_service_name(data->port_start, "tcp"); + data->responses->service = + get_service_name(data->port_start, "tcp"); if (type == SCAN_SYN) data->responses->states[type] = FILTERED; else if (type == SCAN_ACK)