diff options
author | Stig Bjørlykke <stig@bjorlykke.org> | 2010-06-28 13:58:00 +0000 |
---|---|---|
committer | Stig Bjørlykke <stig@bjorlykke.org> | 2010-06-28 13:58:00 +0000 |
commit | 1a4a7a718d5cf1778cc15b609b3160187b3e5fba (patch) | |
tree | 2b3fdf9d2072e608857c6e982394ee98fc8f0581 /util.c | |
parent | 9c20c7b510aaa71f20e9adfd325bbb4cc5462194 (diff) |
From Jan Šafránek via bug 4945:
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.
svn path=/trunk/; revision=33349
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 32 |
1 files changed, 28 insertions, 4 deletions
@@ -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) { /* |