diff options
author | João Valverde <j@v6e.pt> | 2022-12-27 23:23:00 +0000 |
---|---|---|
committer | João Valverde <j@v6e.pt> | 2022-12-30 18:46:22 +0000 |
commit | 6bdc85e37f510ffc9afee2c93b80675c42fb066e (patch) | |
tree | f446b13070d67991aed9ca9c1a6b8aabd76b012d /epan/dfilter/dfunctions.c | |
parent | a17fb20550379640ba0c43c99f2a13107efa27c4 (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.c | 13 |
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 { |