]> git.ipfire.org Git - thirdparty/mtr.git/commitdiff
fix: reject unspecified destination addresses 573/head
authorDarafei Praliaskouski <me@komzpa.net>
Thu, 7 May 2026 19:45:42 +0000 (23:45 +0400)
committerDarafei Praliaskouski <me@komzpa.net>
Fri, 8 May 2026 11:14:12 +0000 (15:14 +0400)
Suggested-by: yvs2014 <30629719+yvs2014@users.noreply.github.com>
ui/gtk.c
ui/net.c
ui/net.h

index 742c5c954d53bdd071bd99e4472b5ada3a5a30f8..2d865d2b272ac5e1cf71f8e6c015e84ca93ee081 100644 (file)
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -248,8 +248,8 @@ static gint Host_activate(
 
     ctl->af = DEFAULT_AF;  // should this obey the cmd line option?
     ctl->Hostname = gtk_entry_get_text(GTK_ENTRY(entry));
-    if (get_addrinfo_from_name(ctl, &res, ctl->Hostname) == 0) {
-        net_reopen(ctl, res);
+    if (get_addrinfo_from_name(ctl, &res, ctl->Hostname) == 0 &&
+        net_reopen(ctl, res) == 0) {
         freeaddrinfo(res);
         net_send_batch(ctl);
         /* If we are "Paused" at this point it is usually because someone
@@ -257,6 +257,9 @@ static gint Host_activate(
         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Pause_Button), 0);
     } else {
         int pos = strlen(gtk_entry_get_text(GTK_ENTRY(entry)));
+        if (res) {
+            freeaddrinfo(res);
+        }
         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Pause_Button), 1);
         gtk_editable_insert_text(GTK_EDITABLE(entry), ": not found", -1,
                                  &pos);
index ed71a5623ce048ee1c33fdd34964c819f7cef92b..3aa77285f4239872d23b7a25dfa0c02637f8026b 100644 (file)
--- a/ui/net.c
+++ b/ui/net.c
@@ -768,24 +768,28 @@ int net_open(
 {
     int err;
 
+    if (!addrcmp(sockaddr_addr_offset(res->ai_addr), &ctl->unspec_addr, res->ai_family))
+        return -1;
+
     /*  Spawn the mtr-packet child process  */
     err = open_command_pipe(ctl, &packet_command_pipe);
     if (err) {
         return err;
     }
 
-    net_reopen(ctl, res);
-
-    return 0;
+    return net_reopen(ctl, res);
 }
 
 
-void net_reopen(
+int net_reopen(
     struct mtr_ctl *ctl,
     struct addrinfo *res)
 {
     int at;
 
+    if (!addrcmp(sockaddr_addr_offset(res->ai_addr), &ctl->unspec_addr, res->ai_family))
+        return -1;
+
     for (at = 0; at < MaxHost; at++) {
         memset(&host[at], 0, sizeof(host[at]));
     }
@@ -809,6 +813,7 @@ void net_reopen(
         net_find_local_address(ctl);
     }
 
+    return 0;
 }
 
 
index 354c99845bf947687ec44ee4d89e155b7d67cecb..2488d13d69ae2ec5fb1ca47833f804c12215e4ca 100644 (file)
--- a/ui/net.h
+++ b/ui/net.h
@@ -34,7 +34,7 @@
 extern int net_open(
     struct mtr_ctl *ctl,
     struct addrinfo *res);
-extern void net_reopen(
+extern int net_reopen(
     struct mtr_ctl *ctl,
     struct addrinfo *res);
 extern void net_reset(