]> git.ipfire.org Git - thirdparty/mtr.git/commitdiff
fix: address static analyzer findings 593/head
authorDarafei Praliaskouski <me@komzpa.net>
Thu, 7 May 2026 21:05:58 +0000 (01:05 +0400)
committerDarafei Praliaskouski <me@komzpa.net>
Thu, 7 May 2026 21:05:58 +0000 (01:05 +0400)
packet/probe.c
packet/probe_unix.c
packet/sockaddr.c
ui/asn.c
ui/dns.c
ui/mtr.c
ui/raw.c
ui/report.c
ui/utils.c

index 4b265af47cc82918feab22a5720d0e2b4875bc65..61c1912ee029b9e8cb20bc04e9f5825a040b1d8e 100644 (file)
@@ -232,9 +232,11 @@ void format_mpls_string(
             append_pos += strlen(append_pos);
         }
 
-        snprintf(append_pos, buffer_size, "%d,%d,%d,%d",
-                 mpls->label, mpls->traffic_class,
-                 mpls->bottom_of_stack, mpls->ttl);
+        snprintf(append_pos, buffer_size, "%u,%u,%u,%u",
+                 (unsigned int) mpls->label,
+                 (unsigned int) mpls->traffic_class,
+                 (unsigned int) mpls->bottom_of_stack,
+                 (unsigned int) mpls->ttl);
 
         buffer_size -= strlen(append_pos);
         append_pos += strlen(append_pos);
@@ -283,7 +285,7 @@ void respond_to_probe(
     }
 
     snprintf(response, COMMAND_BUFFER_SIZE,
-             "%d %s %s %s round-trip-time %d",
+             "%d %s %s %s round-trip-time %u",
              probe->token, result, ip_argument, ip_text, round_trip_us);
 
     if (mpls_count) {
@@ -317,7 +319,7 @@ int find_source_addr(
     const struct sockaddr_storage *destaddr)
 {
     int sock;
-    int len;
+    socklen_t len;
     struct sockaddr_storage dest_with_port;
 #ifdef __linux__
     // The Linux code needs these.
index 7362d6d8e4fe860571c755ce4cc1996d307c712a..3d1d26ca6c1fea42f0144091d4082efe17d95221 100644 (file)
@@ -563,7 +563,7 @@ void send_probe(
     char packet[PACKET_BUFFER_SIZE];
     struct probe_t *probe;
     int trytimes;
-    int packet_size;
+    int packet_size = 0;
 
     probe = alloc_probe(net_state, param->command_token);
     if (probe == NULL) {
@@ -821,7 +821,8 @@ void receive_replies_from_recv_socket(
                     packet, packet_length, &timestamp);
         } else if (icmp_hostunreach_received) {
             /* handle packet based on send socket protocol */
-            int proto, length = sizeof(int);
+            int proto;
+            socklen_t length = sizeof(proto);
 
             if (getsockopt(socket, SOL_SOCKET, SO_PROTOCOL, &proto, &length) < 0) {
                 error(EXIT_FAILURE, errno, "getsockopt SO_PROTOCOL error");
@@ -855,7 +856,7 @@ void receive_replies_from_probe_socket(
     int probe_socket;
     struct timeval zero_time;
     int err;
-    int err_length = sizeof(int);
+    socklen_t err_length = sizeof(err);
     fd_set write_set;
 
     probe_socket = probe->platform.socket;
index 892d7ee29735654fc60a23f50a7475f4c994b526..3cbe62be47193aa1e5912844ca5402bd2d278413 100644 (file)
@@ -10,11 +10,13 @@ void *sockaddr_addr_offset(const void *x)
 
        if ( ((struct sockaddr *)(x))->sa_family == AF_INET )
        {
-               return ((void *)(x) + offsetof(struct sockaddr_in, sin_addr));
+               return (void *) ((const char *)(x) +
+                       offsetof(struct sockaddr_in, sin_addr));
        } else
        if ( ((struct sockaddr *)(x))->sa_family == AF_INET6 )
        {
-               return ((void *)(x) + offsetof(struct sockaddr_in6, sin6_addr));
+               return (void *) ((const char *)(x) +
+                       offsetof(struct sockaddr_in6, sin6_addr));
        }
 
        return NULL;
@@ -58,11 +60,13 @@ in_port_t *sockaddr_port_offset(const void *x)
 
        if ( ((struct sockaddr *)(x))->sa_family == AF_INET )
        {
-               return ((void *)(x) + offsetof(struct sockaddr_in, sin_port));
+               return (in_port_t *) ((const char *)(x) +
+                       offsetof(struct sockaddr_in, sin_port));
        } else
        if ( ((struct sockaddr *)(x))->sa_family == AF_INET6 )
        {
-               return ((void *)(x) + offsetof(struct sockaddr_in6, sin6_port));
+               return (in_port_t *) ((const char *)(x) +
+                       offsetof(struct sockaddr_in6, sin6_port));
        }
 
        return NULL;
index f05183277f5f2ca4760678b3a40ee709e72716f5..cae9971e3ab840f1e667e74e8a34f7dd671a0b00 100644 (file)
--- a/ui/asn.c
+++ b/ui/asn.c
@@ -376,7 +376,8 @@ static char *get_ipinfo(
         ENTRY *found_item;
 
         DEB_syslog(LOG_INFO, ">> Search: %s", key);
-        item.key = key;;
+        item.key = key;
+        item.data = NULL;
         if ((found_item = hsearch(item, FIND))) {
             if (!(val = (*((items_t *) found_item->data))[ctl->ipinfo_no]))
                 val = (*((items_t *) found_item->data))[0];
index 824b401136b77a1ae3211fdcf4941e06c7a3bee4..0a27a6d292a2fd6f0c795fd7ad03aaa2ec49f91f 100644 (file)
--- a/ui/dns.c
+++ b/ui/dns.c
@@ -148,6 +148,9 @@ void dns_open(
             close(i);
         }
         infp = fdopen(todns[0], "r");
+        if (!infp) {
+            error(EXIT_FAILURE, errno, "fdopen DNS lookup pipe");
+        }
 
         while (fgets(buf, sizeof(buf), infp)) {
             ip_t host;
@@ -210,7 +213,10 @@ void dns_ack(
     struct dns_results *r;
 
     while (fgets(buf, sizeof(buf), fromdnsfp)) {
-        sscanf(buf, "%s %s", host, name);
+        if (sscanf(buf, "%1024s %1024s", host, name) != 2) {
+            error(0, 0, "dns_ack: malformed DNS lookup result");
+            continue;
+        }
 
         longipstr(host, &hostip, ctl->af);
         r = findip(ctl, &hostip);
index 6886bce346c52adb60868055f9331c567dcf4e14..9e5bfc4054b4dece8c5b51e8e7abfc526db87d09 100644 (file)
--- a/ui/mtr.c
+++ b/ui/mtr.c
@@ -186,15 +186,20 @@ static void read_from_file(
 
     FILE *in;
     char line[512];
+    int close_input;
+    int read_error;
+    int read_errno;
 
     if (!filename || strcmp(filename, "-") == 0) {
         clearerr(stdin);
         in = stdin;
+        close_input = 0;
     } else {
         in = fopen(filename, "r");
         if (!in) {
             error(EXIT_FAILURE, errno, "open %s", filename);
         }
+        close_input = 1;
     }
 
     while (fgets(line, sizeof(line), in)) {
@@ -202,12 +207,16 @@ static void read_from_file(
         append_to_names(names, name);
     }
 
-    if (ferror(in)) {
-        error(EXIT_FAILURE, errno, "ferror %s", filename);
+    read_error = ferror(in);
+    read_errno = errno;
+
+    if (close_input && fclose(in)) {
+        error(EXIT_FAILURE, errno, "close %s", filename);
     }
 
-    if (in != stdin)
-        fclose(in);
+    if (read_error) {
+        error(EXIT_FAILURE, read_errno, "ferror %s", filename);
+    }
 }
 
 /*
index aef1ad14884193379a67b1a27c1fab49995c0e8d..90f9b8916bc30263f435e1243c5eb587658150a7 100644 (file)
--- a/ui/raw.c
+++ b/ui/raw.c
@@ -75,7 +75,9 @@ void raw_rawhost(
         int k;
         for (k = 0; k < mpls->labels; k++)
             printf("m %d %lu %u %u %u\n",
-                   host, mpls->label[k], mpls->tc[k], mpls->s[k], mpls->ttl[k]);
+                   host, mpls->label[k], (unsigned int) mpls->tc[k],
+                   (unsigned int) mpls->s[k],
+                   (unsigned int) mpls->ttl[k]);
     }
 
     fflush(stdout);
index 4b03c0d78afab2985d217b138d2fe847b0294a2c..bcd5b5bd7c85296f4f094b75ec57fb16b3036ff9 100644 (file)
@@ -229,8 +229,9 @@ void report_close(
                     for (k = 0; k < mpls->labels; k++) {
                         printf
                             ("    |  |+-- [MPLS: Lbl %lu TC %u S %u TTL %u]\n",
-                             mpls->label[k], mpls->tc[k], mpls->s[k],
-                             mpls->ttl[k]);
+                             mpls->label[k], (unsigned int) mpls->tc[k],
+                             (unsigned int) mpls->s[k],
+                             (unsigned int) mpls->ttl[k]);
                     }
                 }
 
@@ -239,16 +240,18 @@ void report_close(
                     for (k = 0; k < mplss->labels && ctl->enablempls; k++) {
                         printf
                             ("    |   +-- [MPLS: Lbl %lu TC %u S %u TTL %u]\n",
-                             mplss->label[k], mplss->tc[k], mplss->s[k],
-                             mplss->ttl[k]);
+                             mplss->label[k], (unsigned int) mplss->tc[k],
+                             (unsigned int) mplss->s[k],
+                             (unsigned int) mplss->ttl[k]);
                     }
                 } else {
                     printf("    |   |-- %s\n", strlongip(ctl->af, addr2));
                     for (k = 0; k < mplss->labels && ctl->enablempls; k++) {
                         printf
                             ("    |   +-- [MPLS: Lbl %lu TC %u S %u TTL %u]\n",
-                             mplss->label[k], mplss->tc[k], mplss->s[k],
-                             mplss->ttl[k]);
+                             mplss->label[k], (unsigned int) mplss->tc[k],
+                             (unsigned int) mplss->s[k],
+                             (unsigned int) mplss->ttl[k]);
                     }
                 }
 #endif
@@ -266,8 +269,9 @@ void report_close(
             int k;
             for (k = 0; k < mpls->labels; k++) {
                 printf("    |   +-- [MPLS: Lbl %lu TC %u S %u TTL %u]\n",
-                       mpls->label[k], mpls->tc[k], mpls->s[k],
-                       mpls->ttl[k]);
+                       mpls->label[k], (unsigned int) mpls->tc[k],
+                       (unsigned int) mpls->s[k],
+                       (unsigned int) mpls->ttl[k]);
             }
         }
 #endif
index 8e8c6d8192915f3f7d98299063e68f3fe734b208..87ba792c7a2c470692dc80680ab5f4e76bef5706 100644 (file)
@@ -164,9 +164,12 @@ static inline int close_stream(
     const int some_pending = (__fpending(stream) != 0);
     const int prev_fail = (ferror(stream) != 0);
     const int fclose_fail = (fclose(stream) != 0);
+    const int fclose_errno = fclose_fail ? errno : 0;
 
-    if (prev_fail || (fclose_fail && (some_pending || errno != EBADF))) {
-        if (!fclose_fail && !(errno == EPIPE))
+    if (prev_fail || (fclose_fail && (some_pending || fclose_errno != EBADF))) {
+        if (fclose_fail)
+            errno = fclose_errno;
+        else
             errno = 0;
         return EOF;
     }