aboutsummaryrefslogtreecommitdiffstats
path: root/util.c
diff options
context:
space:
mode:
authorStig Bjørlykke <stig@bjorlykke.org>2010-06-28 13:58:00 +0000
committerStig Bjørlykke <stig@bjorlykke.org>2010-06-28 13:58:00 +0000
commit1a4a7a718d5cf1778cc15b609b3160187b3e5fba (patch)
tree2b3fdf9d2072e608857c6e982394ee98fc8f0581 /util.c
parent9c20c7b510aaa71f20e9adfd325bbb4cc5462194 (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.c32
1 files changed, 28 insertions, 4 deletions
diff --git a/util.c b/util.c
index cbf010a19b..500330a8fc 100644
--- 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) {
/*