diff options
author | João Valverde <j@v6e.pt> | 2021-11-28 12:41:23 +0000 |
---|---|---|
committer | João Valverde <j@v6e.pt> | 2021-12-01 19:42:51 +0000 |
commit | 647decd509d49072da8f338ea45b11c9ca575ad7 (patch) | |
tree | ae7f6cb3e9cc66cce9c0d571b860da661f61c65f /epan/dfilter | |
parent | 557cee31fc1306ce310ebe8796f836fcee1e1a61 (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.h | 10 | ||||
-rw-r--r-- | epan/dfilter/dfilter.c | 2 | ||||
-rw-r--r-- | epan/dfilter/grammar.lemon | 14 | ||||
-rw-r--r-- | epan/dfilter/syntax-tree.c | 14 | ||||
-rw-r--r-- | epan/dfilter/syntax-tree.h | 12 |
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); |