aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dfilter
diff options
context:
space:
mode:
authorJoão Valverde <j@v6e.pt>2021-09-27 23:22:59 +0100
committerJoão Valverde <j@v6e.pt>2021-09-30 17:26:19 +0100
commit0e7ba54d98bfd3d0fe756274fd8ac952abdd7427 (patch)
tree76a467dc6f79638e90d96a5bcbeaf538fcbc4af0 /epan/dfilter
parentd6836d103d839dd4144262fc6f190c939e6c2106 (diff)
dfilter: Clean up handling of "deprecated" tokens
Pass the deprecated data struture to the scanner and insert the deprecated tokens there. This avoids having to keep a dedicated syntax node field for this. Pass the deprecated argument in dfwork_t instead of in a separate argument. This is less cumbersome than adding an extra argument to every level of the semantic checker.
Diffstat (limited to 'epan/dfilter')
-rw-r--r--epan/dfilter/dfilter-int.h8
-rw-r--r--epan/dfilter/dfilter.c62
-rw-r--r--epan/dfilter/scanner.l12
-rw-r--r--epan/dfilter/semcheck.c22
-rw-r--r--epan/dfilter/semcheck.h2
-rw-r--r--epan/dfilter/syntax-tree.c12
-rw-r--r--epan/dfilter/syntax-tree.h4
7 files changed, 54 insertions, 68 deletions
diff --git a/epan/dfilter/dfilter-int.h b/epan/dfilter/dfilter-int.h
index 7124b2159f..402275033a 100644
--- a/epan/dfilter/dfilter-int.h
+++ b/epan/dfilter/dfilter-int.h
@@ -42,6 +42,7 @@ typedef struct {
int next_const_id;
int next_register;
int first_constant; /* first register used as a constant */
+ GPtrArray *deprecated;
} dfwork_t;
/*
@@ -52,6 +53,7 @@ typedef struct {
GString* quoted_string;
gboolean raw_string;
gboolean in_set; /* true if parsing set elements for the membership operator */
+ GPtrArray *deprecated;
} df_scanner_state_t;
/* Constructor/Destructor prototypes for Lemon Parser */
@@ -71,6 +73,12 @@ void
dfilter_fail(dfwork_t *dfw, const char *format, ...) G_GNUC_PRINTF(2, 3);
void
+add_deprecated_token(GPtrArray *deprecated, const char *token);
+
+void
+free_deprecated(GPtrArray *deprecated);
+
+void
DfilterTrace(FILE *TraceFILE, char *zTracePrompt);
const char *tokenstr(int token);
diff --git a/epan/dfilter/dfilter.c b/epan/dfilter/dfilter.c
index 450ab77dac..e7c48f73a0 100644
--- a/epan/dfilter/dfilter.c
+++ b/epan/dfilter/dfilter.c
@@ -236,6 +236,29 @@ const char *tokenstr(int token)
ws_assert_not_reached();
}
+void
+add_deprecated_token(GPtrArray *deprecated, const char *token)
+{
+ for (guint i = 0; i < deprecated->len; i++) {
+ const char *str = (const char *)g_ptr_array_index(deprecated, i);
+ if (g_ascii_strcasecmp(token, str) == 0) {
+ /* It's already in our list */
+ return;
+ }
+ }
+ g_ptr_array_add(deprecated, g_strdup(token));
+}
+
+void
+free_deprecated(GPtrArray *deprecated)
+{
+ for (guint i = 0; i < deprecated->len; ++i) {
+ gpointer *depr = g_ptr_array_index(deprecated,i);
+ g_free(depr);
+ }
+ g_ptr_array_free(deprecated, TRUE);
+}
+
gboolean
dfilter_compile(const gchar *text, dfilter_t **dfp, gchar **err_msg)
{
@@ -247,8 +270,6 @@ dfilter_compile(const gchar *text, dfilter_t **dfp, gchar **err_msg)
yyscan_t scanner;
YY_BUFFER_STATE in_buffer;
gboolean failure = FALSE;
- const char *depr_test;
- guint i;
/* XXX, GHashTable */
GPtrArray *deprecated;
@@ -279,15 +300,16 @@ dfilter_compile(const gchar *text, dfilter_t **dfp, gchar **err_msg)
dfw = dfwork_new();
+ deprecated = g_ptr_array_new();
+
state.dfw = dfw;
state.quoted_string = NULL;
state.in_set = FALSE;
state.raw_string = FALSE;
+ state.deprecated = deprecated;
df_set_extra(&state, scanner);
- deprecated = g_ptr_array_new();
-
while (1) {
df_lval = stnode_new(STTYPE_UNINITIALIZED, NULL);
token = df_lex(scanner);
@@ -303,22 +325,6 @@ dfilter_compile(const gchar *text, dfilter_t **dfp, gchar **err_msg)
break;
}
- /* See if the node is deprecated */
- depr_test = stnode_deprecated(df_lval);
-
- if (depr_test) {
- for (i = 0; i < deprecated->len; i++) {
- if (g_ascii_strcasecmp(depr_test, (const gchar *)g_ptr_array_index(deprecated, i)) == 0) {
- /* It's already in our list */
- depr_test = NULL;
- }
- }
- }
-
- if (depr_test) {
- g_ptr_array_add(deprecated, g_strdup(depr_test));
- }
-
ws_debug("Token: %d %s", token, tokenstr(token));
/* Give the token to the parser */
@@ -365,17 +371,15 @@ dfilter_compile(const gchar *text, dfilter_t **dfp, gchar **err_msg)
* it and set *dfp to NULL */
if (dfw->st_root == NULL) {
*dfp = NULL;
- for (i = 0; i < deprecated->len; ++i) {
- gchar* depr = (gchar*)g_ptr_array_index(deprecated,i);
- g_free(depr);
- }
- g_ptr_array_free(deprecated, TRUE);
+ free_deprecated(deprecated);
}
else {
log_syntax_tree(LOG_LEVEL_NOISY, dfw->st_root, "Syntax tree before semantic check");
+ dfw->deprecated = deprecated;
+
/* Check semantics and do necessary type conversion*/
- if (!dfw_semcheck(dfw, deprecated)) {
+ if (!dfw_semcheck(dfw)) {
goto FAILURE;
}
@@ -424,11 +428,7 @@ FAILURE:
global_dfw = NULL;
dfwork_free(dfw);
}
- for (i = 0; i < deprecated->len; ++i) {
- gchar* depr = (gchar*)g_ptr_array_index(deprecated,i);
- g_free(depr);
- }
- g_ptr_array_free(deprecated, TRUE);
+ free_deprecated(deprecated);
if (err_msg != NULL) {
/*
* Default error message.
diff --git a/epan/dfilter/scanner.l b/epan/dfilter/scanner.l
index 672e178c14..1a50d1200d 100644
--- a/epan/dfilter/scanner.l
+++ b/epan/dfilter/scanner.l
@@ -88,7 +88,6 @@ static int set_lval(int token, gpointer data);
static int set_lval_int(dfwork_t *dfw, int token, char *s);
static int simple(int token);
static gboolean str_to_gint32(dfwork_t *dfw, char *s, gint32* pint);
-static void mark_lval_deprecated(const char *s);
/*
* Sleazy hack to suppress compiler warnings in yy_fatal_error().
@@ -139,11 +138,11 @@ static void mark_lval_deprecated(const char *s);
"==" return simple(TOKEN_TEST_EQ);
"eq" return simple(TOKEN_TEST_EQ);
"!=" {
- mark_lval_deprecated("!=");
+ add_deprecated_token(yyextra->deprecated, "!=");
return simple(TOKEN_TEST_NE);
}
"ne" {
- mark_lval_deprecated("ne");
+ add_deprecated_token(yyextra->deprecated, "ne");
return simple(TOKEN_TEST_NE);
}
">" return simple(TOKEN_TEST_GT);
@@ -418,7 +417,7 @@ static void mark_lval_deprecated(const char *s);
/* Yes, it's an aliased field name */
/* XXX Do we need to make a copy of yytext? dfilter_compile
* will dup this later on. */
- mark_lval_deprecated(yytext);
+ add_deprecated_token(yyextra->deprecated, yytext);
return set_lval(TOKEN_FIELD, hfinfo);
}
@@ -581,8 +580,3 @@ str_to_gint32(dfwork_t *dfw, char *s, gint32* pint)
return TRUE;
}
-static void
-mark_lval_deprecated(const char *s)
-{
- df_lval->deprecated_token = s;
-}
diff --git a/epan/dfilter/semcheck.c b/epan/dfilter/semcheck.c
index 36595c1f8f..4ee3da1d80 100644
--- a/epan/dfilter/semcheck.c
+++ b/epan/dfilter/semcheck.c
@@ -30,7 +30,7 @@
static void
-semcheck(dfwork_t *dfw, stnode_t *st_node, GPtrArray *deprecated);
+semcheck(dfwork_t *dfw, stnode_t *st_node);
static stnode_t*
check_param_entity(dfwork_t *dfw, stnode_t *st_node);
@@ -1492,7 +1492,7 @@ check_relation(dfwork_t *dfw, const char *relation_string,
/* Check the semantics of any type of TEST */
static void
-check_test(dfwork_t *dfw, stnode_t *st_node, GPtrArray *deprecated)
+check_test(dfwork_t *dfw, stnode_t *st_node)
{
test_op_t st_op, st_arg_op;
stnode_t *st_arg1, *st_arg2;
@@ -1515,7 +1515,7 @@ check_test(dfwork_t *dfw, stnode_t *st_node, GPtrArray *deprecated)
break;
case TEST_OP_NOT:
- semcheck(dfw, st_arg1, deprecated);
+ semcheck(dfw, st_arg1);
break;
case TEST_OP_AND:
@@ -1524,7 +1524,7 @@ check_test(dfwork_t *dfw, stnode_t *st_node, GPtrArray *deprecated)
sttype_test_get(st_arg1, &st_arg_op, NULL, NULL);
if (st_arg_op == TEST_OP_AND || st_arg_op == TEST_OP_OR) {
if (st_op != st_arg_op && !st_arg1->inside_brackets)
- g_ptr_array_add(deprecated, g_strdup("suggest parentheses around '&&' within '||'"));
+ g_ptr_array_add(dfw->deprecated, g_strdup("suggest parentheses around '&&' within '||'"));
}
}
@@ -1532,12 +1532,12 @@ check_test(dfwork_t *dfw, stnode_t *st_node, GPtrArray *deprecated)
sttype_test_get(st_arg2, &st_arg_op, NULL, NULL);
if (st_arg_op == TEST_OP_AND || st_arg_op == TEST_OP_OR) {
if (st_op != st_arg_op && !st_arg2->inside_brackets)
- g_ptr_array_add(deprecated, g_strdup("suggest parentheses around '&&' within '||'"));
+ g_ptr_array_add(dfw->deprecated, g_strdup("suggest parentheses around '&&' within '||'"));
}
}
- semcheck(dfw, st_arg1, deprecated);
- semcheck(dfw, st_arg2, deprecated);
+ semcheck(dfw, st_arg1);
+ semcheck(dfw, st_arg2);
break;
case TEST_OP_EQ:
@@ -1581,7 +1581,7 @@ check_test(dfwork_t *dfw, stnode_t *st_node, GPtrArray *deprecated)
/* Check the entire syntax tree. */
static void
-semcheck(dfwork_t *dfw, stnode_t *st_node, GPtrArray *deprecated)
+semcheck(dfwork_t *dfw, stnode_t *st_node)
{
#ifndef WS_DISABLE_DEBUG
static guint i = 0;
@@ -1592,7 +1592,7 @@ semcheck(dfwork_t *dfw, stnode_t *st_node, GPtrArray *deprecated)
* node will be a TEST node, no matter what. So assert that. */
switch (stnode_type_id(st_node)) {
case STTYPE_TEST:
- check_test(dfw, st_node, deprecated);
+ check_test(dfw, st_node);
break;
default:
ws_assert_not_reached();
@@ -1604,7 +1604,7 @@ semcheck(dfwork_t *dfw, stnode_t *st_node, GPtrArray *deprecated)
* some of the nodes into the form they need to be in order to
* later generate the DFVM bytecode. */
gboolean
-dfw_semcheck(dfwork_t *dfw, GPtrArray *deprecated)
+dfw_semcheck(dfwork_t *dfw)
{
volatile gboolean ok_filter = TRUE;
#ifndef WS_DISABLE_DEBUG
@@ -1617,7 +1617,7 @@ dfw_semcheck(dfwork_t *dfw, GPtrArray *deprecated)
* the semantic-checking, the semantic-checking code will
* throw an exception if a problem is found. */
TRY {
- semcheck(dfw, dfw->st_root, deprecated);
+ semcheck(dfw, dfw->st_root);
}
CATCH(TypeError) {
ok_filter = FALSE;
diff --git a/epan/dfilter/semcheck.h b/epan/dfilter/semcheck.h
index f4fe452240..72b969a474 100644
--- a/epan/dfilter/semcheck.h
+++ b/epan/dfilter/semcheck.h
@@ -11,7 +11,7 @@
#define SEMCHECK_H
gboolean
-dfw_semcheck(dfwork_t *dfw, GPtrArray *deprecated);
+dfw_semcheck(dfwork_t *dfw);
#endif
diff --git a/epan/dfilter/syntax-tree.c b/epan/dfilter/syntax-tree.c
index 3a8f213c39..02282c9201 100644
--- a/epan/dfilter/syntax-tree.c
+++ b/epan/dfilter/syntax-tree.c
@@ -85,7 +85,6 @@ stnode_new(sttype_id_t type_id, gpointer data)
node = g_new(stnode_t, 1);
node->magic = STNODE_MAGIC;
- node->deprecated_token = NULL;
node->inside_brackets = FALSE;
if (type_id == STTYPE_UNINITIALIZED) {
@@ -127,7 +126,6 @@ stnode_dup(const stnode_t *org)
node = g_new(stnode_t, 1);
node->magic = STNODE_MAGIC;
- node->deprecated_token = NULL;
node->type = type;
if (type && type->func_dup)
node->data = type->func_dup(org->data);
@@ -225,15 +223,6 @@ stnode_value(stnode_t *node)
return node->value;
}
-const char *
-stnode_deprecated(stnode_t *node)
-{
- if (!node) {
- return NULL;
- }
- return node->deprecated_token;
-}
-
char *
stnode_tostr(stnode_t *node)
{
@@ -269,7 +258,6 @@ sprint_node(stnode_t *node)
g_free(s);
wmem_strbuf_append_printf(buf, "\tvalue = %"PRId32"\n", node->value);
wmem_strbuf_append_printf(buf, "\tinside_brackets = %s\n", true_or_false(node->inside_brackets));
- wmem_strbuf_append_printf(buf, "\tdeprecated_token = %s\n", node->deprecated_token);
wmem_strbuf_append_printf(buf, "}\n");
return wmem_strbuf_finalize(buf);
}
diff --git a/epan/dfilter/syntax-tree.h b/epan/dfilter/syntax-tree.h
index dd99b3d4c1..b4ab91aa36 100644
--- a/epan/dfilter/syntax-tree.h
+++ b/epan/dfilter/syntax-tree.h
@@ -60,7 +60,6 @@ typedef struct {
gpointer data;
int32_t value;
gboolean inside_brackets;
- const char *deprecated_token;
} stnode_t;
/* These are the sttype_t registration function prototypes. */
@@ -114,9 +113,6 @@ stnode_steal_data(stnode_t *node);
gint32
stnode_value(stnode_t *node);
-const char *
-stnode_deprecated(stnode_t *node);
-
char *
stnode_tostr(stnode_t *node);