aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2008-01-31 19:50:38 +0000
committerGerald Combs <gerald@wireshark.org>2008-01-31 19:50:38 +0000
commit9703c2bb75f8498f547c5a66b0c0aa8d922668ba (patch)
treedd8eb691d273e26190372f913f86209491f2776c /epan
parentf3747bf63786cac3ebc8e13621c688a0c0451970 (diff)
If "!=" or "ne" are used in a display filter, warn the user that the results
may be unexpected. svn path=/trunk/; revision=24232
Diffstat (limited to 'epan')
-rw-r--r--epan/dfilter/dfilter-int.h1
-rw-r--r--epan/dfilter/dfilter.c59
-rw-r--r--epan/dfilter/dfilter.h5
-rw-r--r--epan/dfilter/gencode.c28
-rw-r--r--epan/dfilter/scanner.l25
-rw-r--r--epan/dfilter/syntax-tree.c10
-rw-r--r--epan/dfilter/syntax-tree.h4
7 files changed, 104 insertions, 28 deletions
diff --git a/epan/dfilter/dfilter-int.h b/epan/dfilter/dfilter-int.h
index f66e7c8a4c..aa3f4831c4 100644
--- a/epan/dfilter/dfilter-int.h
+++ b/epan/dfilter/dfilter-int.h
@@ -39,6 +39,7 @@ struct _dfilter_t {
gboolean *attempted_load;
int *interesting_fields;
int num_interesting_fields;
+ GPtrArray *deprecated;
};
typedef struct {
diff --git a/epan/dfilter/dfilter.c b/epan/dfilter/dfilter.c
index c6d0a2b3d7..23d136cf6f 100644
--- a/epan/dfilter/dfilter.c
+++ b/epan/dfilter/dfilter.c
@@ -88,10 +88,10 @@ dfilter_init(void)
/* Trace parser */
DfilterTrace(stdout, "lemon> ");
#endif
-
+
/* Initialize the syntax-tree sub-sub-system */
sttype_init();
-
+
dfilter_macro_init();
}
@@ -115,6 +115,7 @@ dfilter_new(void)
df = g_new(dfilter_t, 1);
df->insns = NULL;
+ df->deprecated = NULL;
return df;
}
@@ -141,7 +142,7 @@ dfilter_free(dfilter_t *df)
if (!df)
return;
-
+
if (df->insns) {
free_insns(df->insns);
}
@@ -152,7 +153,7 @@ dfilter_free(dfilter_t *df)
if (df->interesting_fields) {
g_free(df->interesting_fields);
}
-
+
/* clear registers */
for (i = 0; i < df->max_registers; i++) {
if (df->registers[i]) {
@@ -208,7 +209,7 @@ dfwork_free(dfwork_t *dfw)
if (dfw->consts) {
free_insns(dfw->consts);
}
-
+
g_free(dfw);
}
@@ -219,13 +220,16 @@ dfilter_compile(const gchar *text, dfilter_t **dfp)
dfilter_t *dfilter;
dfwork_t *dfw;
gboolean failure = FALSE;
-
+ char *depr_test;
+ guint i;
+ GPtrArray *deprecated = g_ptr_array_new();
+
dfilter_error_msg = NULL;
if ( !( text = dfilter_macro_apply(text, 0, &dfilter_error_msg) ) ) {
return FALSE;
}
-
+
dfw = dfwork_new();
df_scanner_text(text);
@@ -245,6 +249,22 @@ dfilter_compile(const gchar *text, dfilter_t **dfp)
break;
}
+ /* See if the node is deprecated */
+ depr_test = stnode_deprecated(df_lval);
+
+ if (depr_test) {
+ for (i = 0; i < deprecated->len; i++) {
+ if (strcasecmp(depr_test, g_ptr_array_index(deprecated, i)) == 0) {
+ /* It's already in our list */
+ depr_test = NULL;
+ }
+ }
+ }
+
+ if (depr_test) {
+ g_ptr_array_add(deprecated, depr_test);
+ }
+
/* Give the token to the parser */
Dfilter(ParserObj, token, df_lval, dfw);
/* We've used the stnode_t, so we don't want to free it */
@@ -254,6 +274,7 @@ dfilter_compile(const gchar *text, dfilter_t **dfp)
failure = TRUE;
break;
}
+
} /* while (1) */
/* If we created an stnode_t but didn't use it, free it; the
@@ -285,6 +306,7 @@ dfilter_compile(const gchar *text, dfilter_t **dfp)
* it and set *dfp to NULL */
if (dfw->st_root == NULL) {
*dfp = NULL;
+ g_ptr_array_free(deprecated, TRUE);
}
else {
@@ -314,6 +336,9 @@ dfilter_compile(const gchar *text, dfilter_t **dfp)
/* Initialize constants */
dfvm_init_const(dfilter);
+ /* Add any deprecated items */
+ dfilter->deprecated = deprecated;
+
/* And give it to the user. */
*dfp = dfilter;
}
@@ -325,6 +350,7 @@ FAILURE:
if (dfw) {
dfwork_free(dfw);
}
+ g_ptr_array_free(deprecated, TRUE);
dfilter_fail("Unable to parse filter string \"%s\".", text);
*dfp = NULL;
return FALSE;
@@ -355,9 +381,28 @@ dfilter_prime_proto_tree(const dfilter_t *df, proto_tree *tree)
}
}
+GPtrArray *
+dfilter_deprecated_tokens(dfilter_t *df) {
+ if (df->deprecated && df->deprecated->len > 0) {
+ return df->deprecated;
+ }
+ return NULL;
+}
void
dfilter_dump(dfilter_t *df)
{
+ guint i;
+ gchar *sep = "";
+
dfvm_dump(stdout, df->insns);
+
+ if (df->deprecated && df->deprecated->len) {
+ printf("\nDeprecated tokens: ");
+ for (i = 0; i < df->deprecated->len; i++) {
+ printf("%s\"%s\"", sep, (char *) g_ptr_array_index(df->deprecated, i));
+ sep = ", ";
+ }
+ printf("\n");
+ }
}
diff --git a/epan/dfilter/dfilter.h b/epan/dfilter/dfilter.h
index 7be98cae20..7951569f23 100644
--- a/epan/dfilter/dfilter.h
+++ b/epan/dfilter/dfilter.h
@@ -65,7 +65,7 @@ dfilter_free(dfilter_t *df);
/* dfilter_error_msg is NULL if there was no error during dfilter_compile,
- * otherwise it points to a displayable error message. With MSVC and a
+ * otherwise it points to a displayable error message. With MSVC and a
* libwireshark.dll, we need a special declaration.
*/
@@ -84,6 +84,9 @@ dfilter_apply(dfilter_t *df, proto_tree *tree);
void
dfilter_prime_proto_tree(const dfilter_t *df, proto_tree *tree);
+GPtrArray *
+dfilter_deprecated_tokens(dfilter_t *df);
+
/* Print bytecode of dfilter to stdout */
void
dfilter_dump(dfilter_t *df);
diff --git a/epan/dfilter/gencode.c b/epan/dfilter/gencode.c
index e6ff76ac70..7f140cbc49 100644
--- a/epan/dfilter/gencode.c
+++ b/epan/dfilter/gencode.c
@@ -98,7 +98,7 @@ dfw_append_read_tree(dfwork_t *dfw, header_field_info *hfinfo)
insn->arg1 = val1;
insn->arg2 = val2;
dfw_append_insn(dfw, insn);
-
+
if (added_new_hfinfo) {
while (hfinfo) {
/* Record the FIELD_ID in hash of interesting fields. */
@@ -186,7 +186,7 @@ dfw_append_function(dfwork_t *dfw, stnode_t *node, dfvm_value_t **p_jmp)
/* Create the new DFVM instruction */
insn = dfvm_insn_new(CALL_FUNCTION);
-
+
val1 = dfvm_value_new(FUNCTION_DEF);
val1->value.funcdef = sttype_function_funcdef(node);
insn->arg1 = val1;
@@ -241,7 +241,7 @@ dfw_append_function(dfwork_t *dfw, stnode_t *node, dfvm_value_t **p_jmp)
dfw_append_insn(dfw, insn);
g_free(jmps);
-
+
return val2->value.numeric;
}
@@ -450,7 +450,7 @@ dfw_gencode(dfwork_t *dfw)
int id, id1, length;
dfvm_insn_t *insn, *insn1, *prev;
dfvm_value_t *arg1;
-
+
dfw->insns = g_ptr_array_new();
dfw->consts = g_ptr_array_new();
dfw->loaded_fields = g_hash_table_new(g_direct_hash, g_direct_equal);
@@ -467,17 +467,17 @@ dfw_gencode(dfwork_t *dfw)
if (insn->op == IF_TRUE_GOTO || insn->op == IF_FALSE_GOTO) {
dfvm_opcode_t revert = (insn->op == IF_FALSE_GOTO)?IF_TRUE_GOTO:IF_FALSE_GOTO;
id1 = arg1->value.numeric;
- do {
+ do {
insn1 = g_ptr_array_index(dfw->insns, id1);
if (insn1->op == revert) {
/* this one is always false and the branch is not taken*/
id1 = id1 +1;
continue;
}
- else if (insn1->op == READ_TREE && prev && prev->op == READ_TREE &&
+ else if (insn1->op == READ_TREE && prev && prev->op == READ_TREE &&
prev->arg2->value.numeric == insn1->arg2->value.numeric) {
- /* hack if it's the same register it's the same field
- * and it returns the same value
+ /* hack if it's the same register it's the same field
+ * and it returns the same value
*/
id1 = id1 +1;
continue;
@@ -508,26 +508,26 @@ dfw_gencode(dfwork_t *dfw)
length = dfw->consts->len;
for (id = 0; id < length; id++) {
insn = g_ptr_array_index(dfw->consts, id);
- if (insn->arg2 && insn->arg2->type == REGISTER && (int)insn->arg2->value.numeric < 0 )
+ if (insn->arg2 && insn->arg2->type == REGISTER && (int)insn->arg2->value.numeric < 0 )
insn->arg2->value.numeric = dfw->first_constant - insn->arg2->value.numeric -1;
}
length = dfw->insns->len;
for (id = 0; id < length; id++) {
insn = g_ptr_array_index(dfw->insns, id);
- if (insn->arg1 && insn->arg1->type == REGISTER && (int)insn->arg1->value.numeric < 0 )
+ if (insn->arg1 && insn->arg1->type == REGISTER && (int)insn->arg1->value.numeric < 0 )
insn->arg1->value.numeric = dfw->first_constant - insn->arg1->value.numeric -1;
- if (insn->arg2 && insn->arg2->type == REGISTER && (int)insn->arg2->value.numeric < 0 )
+ if (insn->arg2 && insn->arg2->type == REGISTER && (int)insn->arg2->value.numeric < 0 )
insn->arg2->value.numeric = dfw->first_constant - insn->arg2->value.numeric -1;
- if (insn->arg3 && insn->arg3->type == REGISTER && (int)insn->arg3->value.numeric < 0 )
+ if (insn->arg3 && insn->arg3->type == REGISTER && (int)insn->arg3->value.numeric < 0 )
insn->arg3->value.numeric = dfw->first_constant - insn->arg3->value.numeric -1;
- if (insn->arg4 && insn->arg4->type == REGISTER && (int)insn->arg4->value.numeric < 0 )
+ if (insn->arg4 && insn->arg4->type == REGISTER && (int)insn->arg4->value.numeric < 0 )
insn->arg4->value.numeric = dfw->first_constant - insn->arg4->value.numeric -1;
}
-
+
}
diff --git a/epan/dfilter/scanner.l b/epan/dfilter/scanner.l
index 6af7921798..8ce6d91d60 100644
--- a/epan/dfilter/scanner.l
+++ b/epan/dfilter/scanner.l
@@ -26,17 +26,17 @@
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 2001 Gerald Combs
- *
+ *
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -83,6 +83,7 @@ static int set_lval_int(int token, char *s);
static int simple(int token);
static gboolean str_to_gint32(char *s, gint32* pint);
GString* quoted_string = NULL;
+static void mark_lval_deprecated(const char *s);
%}
@@ -102,8 +103,14 @@ GString* quoted_string = NULL;
"==" return simple(TOKEN_TEST_EQ);
"eq" return simple(TOKEN_TEST_EQ);
-"!=" return simple(TOKEN_TEST_NE);
-"ne" return simple(TOKEN_TEST_NE);
+"!=" {
+ mark_lval_deprecated("!=");
+ return simple(TOKEN_TEST_NE);
+}
+"ne" {
+ mark_lval_deprecated("ne");
+ return simple(TOKEN_TEST_NE);
+}
">" return simple(TOKEN_TEST_GT);
"gt" return simple(TOKEN_TEST_GT);
">=" return simple(TOKEN_TEST_GE);
@@ -351,7 +358,7 @@ set_lval_int(int token, char *s)
if (!str_to_gint32(s, &val)) {
return SCAN_FAILED;
- }
+ }
switch (token) {
case TOKEN_INTEGER:
@@ -417,4 +424,10 @@ str_to_gint32(char *s, gint32* pint)
return TRUE;
}
+static void
+mark_lval_deprecated(const char *s)
+{
+ df_lval->deprecated_token = s;
+}
+
#include <lemonflex-tail.inc>
diff --git a/epan/dfilter/syntax-tree.c b/epan/dfilter/syntax-tree.c
index 51bb0879f3..5a2cd920a2 100644
--- a/epan/dfilter/syntax-tree.c
+++ b/epan/dfilter/syntax-tree.c
@@ -92,6 +92,7 @@ stnode_new(sttype_id_t type_id, gpointer data)
node = g_new(stnode_t, 1);
node->magic = STNODE_MAGIC;
+ node->deprecated_token = NULL;
if (type_id == STTYPE_UNINITIALIZED) {
node->type = NULL;
@@ -188,3 +189,12 @@ stnode_value(stnode_t *node)
assert_magic(node, STNODE_MAGIC);
return node->value;
}
+
+char *
+stnode_deprecated(stnode_t *node)
+{
+ if (!node) {
+ return NULL;
+ }
+ return node->deprecated_token;
+}
diff --git a/epan/dfilter/syntax-tree.h b/epan/dfilter/syntax-tree.h
index 635feeda32..aa75860688 100644
--- a/epan/dfilter/syntax-tree.h
+++ b/epan/dfilter/syntax-tree.h
@@ -60,6 +60,7 @@ typedef struct {
* set aside to time to do so. */
gpointer data;
gint32 value;
+ char *deprecated_token;
} stnode_t;
/* These are the sttype_t registration function prototypes. */
@@ -103,6 +104,9 @@ stnode_data(stnode_t *node);
gint32
stnode_value(stnode_t *node);
+char *
+stnode_deprecated(stnode_t *node);
+
#define assert_magic(obj, mnum) \
g_assert((obj)); \
if ((obj)->magic != (mnum)) { \