aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoão Valverde <j@v6e.pt>2021-10-09 00:19:59 +0100
committerWireshark GitLab Utility <gerald+gitlab-utility@wireshark.org>2021-10-11 21:55:45 +0000
commit5dd90e3b30a98956a9c1db9dfd068964b36d8757 (patch)
tree9107a2ace46811c10744951cb50e9a623adf6728
parentc2b6a27e97dd8ff958cc4bb82684a70db18d2d29 (diff)
dfilter: Cache stnode_tostr()
This avoids having to save/free the pointer for each tostr() invocation (or leak memory).
-rw-r--r--epan/dfilter/semcheck.c5
-rw-r--r--epan/dfilter/sttype-function.c5
-rw-r--r--epan/dfilter/sttype-range.c9
-rw-r--r--epan/dfilter/sttype-set.c9
-rw-r--r--epan/dfilter/syntax-tree.c28
-rw-r--r--epan/dfilter/syntax-tree.h3
6 files changed, 24 insertions, 35 deletions
diff --git a/epan/dfilter/semcheck.c b/epan/dfilter/semcheck.c
index 6fb869af38..856a4c0f64 100644
--- a/epan/dfilter/semcheck.c
+++ b/epan/dfilter/semcheck.c
@@ -611,7 +611,6 @@ check_drange_sanity(dfwork_t *dfw, stnode_t *st)
header_field_info *hfinfo1;
ftenum_t ftype1;
struct check_drange_sanity_args args;
- char *s;
entity1 = sttype_range_entity(st);
if (entity1 && stnode_type_id(entity1) == STTYPE_FIELD) {
@@ -638,10 +637,8 @@ check_drange_sanity(dfwork_t *dfw, stnode_t *st)
/* Should this be rejected instead? */
check_drange_sanity(dfw, entity1);
} else if (entity1) {
- s = stnode_tostr(entity1);
dfilter_fail(dfw, "Range is not supported for entity %s of type %s",
- s, stnode_type_name(entity1));
- g_free(s);
+ stnode_tostr(entity1), stnode_type_name(entity1));
THROW(TypeError);
} else {
dfilter_fail(dfw, "Range is not supported, details: " G_STRLOC " entity: NULL");
diff --git a/epan/dfilter/sttype-function.c b/epan/dfilter/sttype-function.c
index 89f5ef370c..5591a5df44 100644
--- a/epan/dfilter/sttype-function.c
+++ b/epan/dfilter/sttype-function.c
@@ -57,16 +57,13 @@ function_tostr(const void *data)
const df_func_def_t *def = stfuncrec->funcdef;
GSList *params = stfuncrec->params;
GString *repr = g_string_new("");
- char *s;
ws_assert(def);
g_string_printf(repr, "%s(", def->name);
while (params != NULL) {
ws_assert(params->data);
- s = stnode_tostr(params->data);
- g_string_append(repr, s);
- g_free(s);
+ g_string_append(repr, stnode_tostr(params->data));
params = params->next;
if (params != NULL) {
g_string_append(repr, ", ");
diff --git a/epan/dfilter/sttype-range.c b/epan/dfilter/sttype-range.c
index 5d8dafc6a3..7d34f9d2b2 100644
--- a/epan/dfilter/sttype-range.c
+++ b/epan/dfilter/sttype-range.c
@@ -77,13 +77,12 @@ range_tostr(const void *data)
{
range_t *range = (range_t*)data;
ws_assert_magic(range, RANGE_MAGIC);
- char *repr, *entity_str, *drange_str;
+ char *repr, *drange_str;
- entity_str = stnode_tostr(range->entity);
drange_str = drange_tostr(range->drange);
-
- repr = g_strdup_printf("%s[%s]", entity_str, drange_str);
- g_free(entity_str);
+ repr = g_strdup_printf("%s[%s]",
+ stnode_tostr(range->entity),
+ drange_str);
g_free(drange_str);
return repr;
diff --git a/epan/dfilter/sttype-set.c b/epan/dfilter/sttype-set.c
index 52dcaefaf7..a0540420db 100644
--- a/epan/dfilter/sttype-set.c
+++ b/epan/dfilter/sttype-set.c
@@ -47,13 +47,10 @@ sttype_set_tostr(const void *data)
GSList* nodelist = (GSList *)data;
stnode_t *lower, *upper;
GString *repr = g_string_new("");
- char *str;
while (nodelist) {
lower = nodelist->data;
- str = stnode_tostr(lower);
- g_string_append(repr, str);
- g_free(str);
+ g_string_append(repr, stnode_tostr(lower));
/* Set elements are always in pairs; upper may be null. */
nodelist = g_slist_next(nodelist);
@@ -61,9 +58,7 @@ sttype_set_tostr(const void *data)
upper = nodelist->data;
if (upper != NULL) {
g_string_append(repr, "..");
- str = stnode_tostr(upper);
- g_string_append(repr, str);
- g_free(str);
+ g_string_append(repr, stnode_tostr(upper));
}
nodelist = g_slist_next(nodelist);
diff --git a/epan/dfilter/syntax-tree.c b/epan/dfilter/syntax-tree.c
index c14bbbb56c..eccfd3d8ee 100644
--- a/epan/dfilter/syntax-tree.c
+++ b/epan/dfilter/syntax-tree.c
@@ -88,6 +88,8 @@ _node_clear(stnode_t *node)
node->type = NULL;
node->flags = 0;
node->data = NULL;
+ g_free(node->repr);
+ node->repr = NULL;
}
void
@@ -107,6 +109,7 @@ _node_init(stnode_t *node, sttype_id_t type_id, gpointer data)
ws_assert(!node->type);
ws_assert(!node->data);
node->flags = 0;
+ node->repr = NULL;
if (type_id == STTYPE_UNINITIALIZED) {
node->type = NULL;
@@ -253,20 +256,24 @@ stnode_set_inside_parens(stnode_t *node, gboolean inside)
}
}
-char *
+const char *
stnode_tostr(stnode_t *node)
{
+ if (node->repr != NULL)
+ return node->repr;
+
if (node->type->func_tostr == NULL)
- return g_strdup("<FIXME>");
+ node->repr = g_strdup("<FIXME>");
+ else
+ node->repr = node->type->func_tostr(node->data);
- return node->type->func_tostr(node->data);
+ return node->repr;
}
static char *
sprint_node(stnode_t *node)
{
wmem_strbuf_t *buf = wmem_strbuf_new(NULL, NULL);
- char *s;
wmem_strbuf_append_printf(buf, "stnode <%p> = {\n", (void *)node);
wmem_strbuf_append_printf(buf, "\tmagic = %"PRIx32"\n", node->magic);
@@ -274,9 +281,7 @@ sprint_node(stnode_t *node)
wmem_strbuf_append_printf(buf,
"\tflags = %"PRIx16" (inside_parens = %s)\n",
node->flags, true_or_false(stnode_inside_parens(node)));
- s = stnode_tostr(node);
- wmem_strbuf_append_printf(buf, "\tdata = %s<%s>\n", stnode_type_name(node), s);
- g_free(s);
+ wmem_strbuf_append_printf(buf, "\tdata = %s<%s>\n", stnode_type_name(node), stnode_tostr(node));
wmem_strbuf_append_printf(buf, "}\n");
return wmem_strbuf_finalize(buf);
}
@@ -307,12 +312,9 @@ static void
visit_tree(wmem_strbuf_t *buf, stnode_t *node, int level)
{
stnode_t *left, *right;
- char *str;
if (stnode_type_id(node) == STTYPE_TEST) {
- str = stnode_tostr(node);
- wmem_strbuf_append_printf(buf, "%s(", str);
- g_free(str);
+ wmem_strbuf_append_printf(buf, "%s(", stnode_tostr(node));
sttype_test_get(node, NULL, &left, &right);
if (left && right) {
wmem_strbuf_append_c(buf, '\n');
@@ -335,9 +337,7 @@ visit_tree(wmem_strbuf_t *buf, stnode_t *node, int level)
wmem_strbuf_append(buf, ")");
}
else {
- str = stnode_tostr(node);
- wmem_strbuf_append_printf(buf, "%s<%s>", stnode_type_name(node), str);
- g_free(str);
+ wmem_strbuf_append_printf(buf, "%s<%s>", stnode_type_name(node), stnode_tostr(node));
}
}
diff --git a/epan/dfilter/syntax-tree.h b/epan/dfilter/syntax-tree.h
index d8d352c2ab..c40ade0d93 100644
--- a/epan/dfilter/syntax-tree.h
+++ b/epan/dfilter/syntax-tree.h
@@ -59,6 +59,7 @@ typedef struct {
uint16_t flags;
gpointer data;
char *token_value;
+ char *repr;
} stnode_t;
/* These are the sttype_t registration function prototypes. */
@@ -112,7 +113,7 @@ stnode_steal_data(stnode_t *node);
const char *
stnode_token_value(stnode_t *node);
-char *
+const char *
stnode_tostr(stnode_t *node);
gboolean