From Jan Šafránek via bug 4945:
authorstig <stig@f5534014-38df-0310-8fa8-9805f1628bb7>
Mon, 28 Jun 2010 13:58:00 +0000 (13:58 +0000)
committerstig <stig@f5534014-38df-0310-8fa8-9805f1628bb7>
Mon, 28 Jun 2010 13:58:00 +0000 (13:58 +0000)
Remove any '%<interface>' from default filter.

Wireshark prepares unparseable default filter when it's started under
'ssh <link-local ipv6 address>%<interface name>' - '%' in SSH_CONNECTION
is not allowed filter. Let's cut the '%<interface name>' from any IP
addresses in default filters.

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@33349 f5534014-38df-0310-8fa8-9805f1628bb7

util.c

diff --git a/util.c b/util.c
index cbf010a19bd641238385defe3aef1b6b685163da..500330a8fc04e3f2c2909b830a1dcbd81ea6b41e 100644 (file)
--- a/util.c
+++ b/util.c
@@ -127,6 +127,21 @@ compute_timestamp_diff(gint *diffsec, gint *diffusec,
   }
 }
 
+/* Remove any %<interface_name> from an IP address. */
+char *sanitize_filter_ip(char *hostname) {
+    gchar *end;
+    gchar *ret;
+
+    ret = g_strdup(hostname);
+    if (!ret)
+        return NULL;
+
+    end = strchr(ret, '%');
+    if (end)
+        *end = '\0';
+    return ret;
+}
+
 /* Try to figure out if we're remotely connected, e.g. via ssh or
    Terminal Server, and create a capture filter that matches aspects of the
    connection.  We match the following environment variables:
@@ -145,6 +160,7 @@ const gchar *get_conn_cfilter(void) {
        char *pprotocol = NULL;
        char *phostname = NULL;
        size_t hostlen;
+       char *remip, *locip;
 
        if (filter_str == NULL) {
                filter_str = g_string_new("");
@@ -152,15 +168,21 @@ const gchar *get_conn_cfilter(void) {
        if ((env = getenv("SSH_CONNECTION")) != NULL) {
                tokens = g_strsplit(env, " ", 4);
                if (tokens[3]) {
+                       remip = sanitize_filter_ip(tokens[0]);
+                       locip = sanitize_filter_ip(tokens[2]);
                        g_string_printf(filter_str, "not (tcp port %s and %s host %s "
-                                                        "and tcp port %s and %s host %s)", tokens[1], host_ip_af(tokens[0]), tokens[0],
-                               tokens[3], host_ip_af(tokens[2]), tokens[2]);
+                                                        "and tcp port %s and %s host %s)", tokens[1], host_ip_af(remip), remip,
+                               tokens[3], host_ip_af(locip), locip);
+                       g_free(remip);
+                       g_free(locip);
                        return filter_str->str;
                }
        } else if ((env = getenv("SSH_CLIENT")) != NULL) {
                tokens = g_strsplit(env, " ", 3);
+               remip = sanitize_filter_ip(tokens[2]);
                g_string_printf(filter_str, "not (tcp port %s and %s host %s "
-                       "and tcp port %s)", tokens[1], host_ip_af(tokens[0]), tokens[0], tokens[2]);
+                       "and tcp port %s)", tokens[1], host_ip_af(remip), tokens[0], remip);
+               g_free(remip);
                return filter_str->str;
        } else if ((env = getenv("REMOTEHOST")) != NULL) {
                /* FreeBSD 7.0 sets REMOTEHOST to an empty string */
@@ -169,7 +191,9 @@ const gchar *get_conn_cfilter(void) {
                    strcmp(env, "") == 0) {
                        return "";
                }
-               g_string_printf(filter_str, "not %s host %s", host_ip_af(env), env);
+               remip = sanitize_filter_ip(env);
+               g_string_printf(filter_str, "not %s host %s", host_ip_af(remip), remip);
+               g_free(remip);
                return filter_str->str;
        } else if ((env = getenv("DISPLAY")) != NULL) {
                /*