aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dfilter/dfunctions.c
diff options
context:
space:
mode:
authorJoão Valverde <j@v6e.pt>2022-12-27 23:23:00 +0000
committerJoão Valverde <j@v6e.pt>2022-12-30 18:46:22 +0000
commit6bdc85e37f510ffc9afee2c93b80675c42fb066e (patch)
treef446b13070d67991aed9ca9c1a6b8aabd76b012d /epan/dfilter/dfunctions.c
parenta17fb20550379640ba0c43c99f2a13107efa27c4 (diff)
dfilter: Reject constant expressions
Constant logical expressions are tautologies and almost certainly user error. Reject them as invalid. Most of them were already rejected with insufficient type information but some corner cases were still valid. Before: Filter: ${frame.number} == 3 Syntax tree: 0 TEST_ANY_EQ: 1 REFERENCE(frame.number <FT_UINT32>) 1 FVALUE(3 <FT_UINT32>) Instructions: 00000 READ_REFERENCE ${frame.number <FT_UINT32>} -> reg#0 00001 IF_FALSE_GOTO 3 00002 ANY_EQ reg#0 == 3 <FT_UINT32> 00003 RETURN After: Filter: ${frame.number} == 3 dftest: Constant expression is invalid. ${frame.number} == 3 ^~~~~~~~~~~~~~~~~~~~
Diffstat (limited to 'epan/dfilter/dfunctions.c')
-rw-r--r--epan/dfilter/dfunctions.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/epan/dfilter/dfunctions.c b/epan/dfilter/dfunctions.c
index 1ef91e78c0..0dc23c9438 100644
--- a/epan/dfilter/dfunctions.c
+++ b/epan/dfilter/dfunctions.c
@@ -255,6 +255,7 @@ ul_semcheck_is_field_string(dfwork_t *dfw, const char *func_name, ftenum_t lhs_f
stnode_t *st_node = param_list->data;
if (stnode_type_id(st_node) == STTYPE_FIELD) {
+ dfw->field_count++;
hfinfo = sttype_field_hfinfo(st_node);
if (IS_FT_STRING(hfinfo->type)) {
return FT_STRING;
@@ -270,8 +271,10 @@ ul_semcheck_is_field(dfwork_t *dfw, const char *func_name, ftenum_t lhs_ftype _U
ws_assert(g_slist_length(param_list) == 1);
stnode_t *st_node = param_list->data;
- if (stnode_type_id(st_node) == STTYPE_FIELD)
+ if (stnode_type_id(st_node) == STTYPE_FIELD) {
+ dfw->field_count++;
return FT_UINT32;
+ }
FAIL(dfw, st_node, "Only fields can be used as parameter for %s()", func_name);
}
@@ -286,6 +289,7 @@ ul_semcheck_string_param(dfwork_t *dfw, const char *func_name, ftenum_t lhs_ftyp
stnode_t *st_node = param_list->data;
if (stnode_type_id(st_node) == STTYPE_FIELD) {
+ dfw->field_count++;
hfinfo = sttype_field_hfinfo(st_node);
switch (hfinfo->type) {
case FT_UINT8:
@@ -375,7 +379,11 @@ ul_semcheck_compare(dfwork_t *dfw, const char *func_name, ftenum_t lhs_ftype,
else if (type == STTYPE_FUNCTION) {
ft_arg = check_function(dfw, arg, ftype);
}
- else if (type == STTYPE_FIELD || type == STTYPE_REFERENCE) {
+ else if (type == STTYPE_FIELD) {
+ dfw->field_count++;
+ ft_arg = sttype_field_ftenum(arg);
+ }
+ else if (type == STTYPE_REFERENCE) {
ft_arg = sttype_field_ftenum(arg);
}
else {
@@ -441,6 +449,7 @@ ul_semcheck_absolute_value(dfwork_t *dfw, const char *func_name, ftenum_t lhs_ft
ftype = check_function(dfw, st_node, lhs_ftype);
}
else if (stnode_type_id(st_node) == STTYPE_FIELD) {
+ dfw->field_count++;
ftype = sttype_field_ftenum(st_node);
}
else {