aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dfilter
diff options
context:
space:
mode:
authorJoão Valverde <j@v6e.pt>2021-11-28 12:41:23 +0000
committerJoão Valverde <j@v6e.pt>2021-12-01 19:42:51 +0000
commit647decd509d49072da8f338ea45b11c9ca575ad7 (patch)
treeae7f6cb3e9cc66cce9c0d571b860da661f61c65f /epan/dfilter
parent557cee31fc1306ce310ebe8796f836fcee1e1a61 (diff)
dfilter: Avoid double strdup to save token value
Store the lval token value instead.
Diffstat (limited to 'epan/dfilter')
-rw-r--r--epan/dfilter/dfilter-int.h10
-rw-r--r--epan/dfilter/dfilter.c2
-rw-r--r--epan/dfilter/grammar.lemon14
-rw-r--r--epan/dfilter/syntax-tree.c14
-rw-r--r--epan/dfilter/syntax-tree.h12
5 files changed, 27 insertions, 25 deletions
diff --git a/epan/dfilter/dfilter-int.h b/epan/dfilter/dfilter-int.h
index 4e027c3882..a015b887aa 100644
--- a/epan/dfilter/dfilter-int.h
+++ b/epan/dfilter/dfilter-int.h
@@ -66,11 +66,11 @@ df_lval_new(void)
return g_new0(df_lval_t, 1);
}
-static inline const char *
+static inline char *
df_lval_value(df_lval_t *lval)
{
if (!lval || !lval->value)
- return "(fixme: null)";
+ return NULL;
return lval->value;
}
@@ -81,10 +81,12 @@ df_lval_number(df_lval_t *lval)
}
static inline void
-df_lval_free(df_lval_t *lval)
+df_lval_free(df_lval_t *lval, gboolean free_value)
{
if (lval) {
- g_free(lval->value);
+ if (free_value) {
+ g_free(lval->value);
+ }
g_free(lval);
}
}
diff --git a/epan/dfilter/dfilter.c b/epan/dfilter/dfilter.c
index e763837b06..6d1d5793f6 100644
--- a/epan/dfilter/dfilter.c
+++ b/epan/dfilter/dfilter.c
@@ -402,7 +402,7 @@ dfilter_compile_real(const gchar *text, dfilter_t **dfp,
/* If we created a df_lval_t but didn't use it, free it; the
* parser doesn't know about it and won't free it for us. */
if (df_lval) {
- df_lval_free(df_lval);
+ df_lval_free(df_lval, TRUE);
df_lval = NULL;
}
diff --git a/epan/dfilter/grammar.lemon b/epan/dfilter/grammar.lemon
index cb46bc2fdf..6ae8e9395f 100644
--- a/epan/dfilter/grammar.lemon
+++ b/epan/dfilter/grammar.lemon
@@ -36,7 +36,7 @@ new_test(dfwork_t *dfw, test_op_t op, df_lval_t *lval);
%token_type {df_lval_t*}
%token_destructor {
(void)dfw;
- df_lval_free($$);
+ df_lval_free($$, TRUE);
}
%type sentence {stnode_t*}
@@ -126,7 +126,7 @@ expr(X) ::= logical_test(L). { X = L; }
new_test(dfwork_t *dfw _U_, test_op_t op, df_lval_t *lval)
{
stnode_t *node = stnode_new_test(op, df_lval_value(lval));
- df_lval_free(lval);
+ df_lval_free(lval, FALSE);
return node;
}
}
@@ -162,18 +162,18 @@ logical_test(T) ::= entity(E).
entity(E) ::= STRING(S).
{
E = stnode_new_string(df_lval_value(S), df_lval_value(S));
- df_lval_free(S);
+ df_lval_free(S, FALSE);
}
entity(E) ::= CHARCONST(C).
{
E = stnode_new_charconst(df_lval_number(C), df_lval_value(C));
- df_lval_free(C);
+ df_lval_free(C, FALSE);
}
entity(E) ::= UNPARSED(U).
{
E = stnode_new_unparsed(df_lval_value(U), df_lval_value(U));
dfilter_resolve_unparsed(dfw, E);
- df_lval_free(U);
+ df_lval_free(U, FALSE);
}
entity(E) ::= range(R). { E = R; }
entity(E) ::= function(F). { E = F; }
@@ -210,7 +210,7 @@ range_node(D) ::= RANGE(R).
g_free(err);
}
- df_lval_free(R);
+ df_lval_free(R, TRUE);
}
/* Relational tests */
@@ -316,7 +316,7 @@ set_element(N) ::= entity(X) DOTDOT entity(Y).
dfilter_fail(dfw, "Function '%s' does not exist", name);
}
stnode_t *node = stnode_new(STTYPE_FUNCTION, def, df_lval_value(lval));
- df_lval_free(lval);
+ df_lval_free(lval, FALSE);
return node;
}
}
diff --git a/epan/dfilter/syntax-tree.c b/epan/dfilter/syntax-tree.c
index 2072688165..63b4019b9d 100644
--- a/epan/dfilter/syntax-tree.c
+++ b/epan/dfilter/syntax-tree.c
@@ -98,7 +98,7 @@ stnode_clear(stnode_t *node)
}
void
-stnode_init(stnode_t *node, sttype_id_t type_id, gpointer data, const char *token)
+stnode_init(stnode_t *node, sttype_id_t type_id, gpointer data, char *token)
{
sttype_t *type;
@@ -108,7 +108,7 @@ stnode_init(stnode_t *node, sttype_id_t type_id, gpointer data, const char *toke
node->flags = 0;
node->repr_display = NULL;
node->repr_debug = NULL;
- node->repr_token = g_strdup(token);
+ node->repr_token = token;
if (type_id == STTYPE_UNINITIALIZED) {
node->type = NULL;
@@ -141,7 +141,7 @@ stnode_replace(stnode_t *node, sttype_id_t type_id, gpointer data)
}
stnode_t*
-stnode_new(sttype_id_t type_id, gpointer data, const char *token)
+stnode_new(sttype_id_t type_id, gpointer data, char *token)
{
stnode_t *node;
@@ -154,7 +154,7 @@ stnode_new(sttype_id_t type_id, gpointer data, const char *token)
}
stnode_t *
-stnode_new_test(test_op_t op, const char *token)
+stnode_new_test(test_op_t op, char *token)
{
stnode_t *node;
@@ -164,19 +164,19 @@ stnode_new_test(test_op_t op, const char *token)
}
stnode_t *
-stnode_new_string(const char *str, const char *token)
+stnode_new_string(const char *str, char *token)
{
return stnode_new(STTYPE_STRING, g_strdup(str), token);
}
stnode_t *
-stnode_new_unparsed(const char *str, const char *token)
+stnode_new_unparsed(const char *str, char *token)
{
return stnode_new(STTYPE_UNPARSED, g_strdup(str), token);
}
stnode_t *
-stnode_new_charconst(unsigned long number, const char *token)
+stnode_new_charconst(unsigned long number, char *token)
{
return stnode_new(STTYPE_CHARCONST, g_memdup2(&number, sizeof(number)), token);
}
diff --git a/epan/dfilter/syntax-tree.h b/epan/dfilter/syntax-tree.h
index d94440040d..5b08e8cf4d 100644
--- a/epan/dfilter/syntax-tree.h
+++ b/epan/dfilter/syntax-tree.h
@@ -101,19 +101,19 @@ void
sttype_register(sttype_t *type);
stnode_t*
-stnode_new(sttype_id_t type_id, gpointer data, const char *token);
+stnode_new(sttype_id_t type_id, gpointer data, char *token);
stnode_t *
-stnode_new_test(test_op_t op, const char *token);
+stnode_new_test(test_op_t op, char *token);
stnode_t *
-stnode_new_string(const char *str, const char *token);
+stnode_new_string(const char *str, char *token);
stnode_t *
-stnode_new_unparsed(const char *str, const char *token);
+stnode_new_unparsed(const char *str, char *token);
stnode_t *
-stnode_new_charconst(unsigned long number, const char *token);
+stnode_new_charconst(unsigned long number, char *token);
stnode_t*
stnode_dup(const stnode_t *org);
@@ -122,7 +122,7 @@ void
stnode_clear(stnode_t *node);
void
-stnode_init(stnode_t *node, sttype_id_t type_id, gpointer data, const char *token);
+stnode_init(stnode_t *node, sttype_id_t type_id, gpointer data, char *token);
void
stnode_replace(stnode_t *node, sttype_id_t type_id, gpointer data);