diff options
author | Michael Mann <mmann78@netscape.net> | 2017-05-28 08:55:15 -0400 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2017-05-29 15:41:17 +0000 |
commit | 0a3df90afcf9bb75e1fc60a308f0804c3b09de2a (patch) | |
tree | e7d72ee05906325563289686cc451d839ca8a164 /epan/dfilter | |
parent | 10d7e391b3c9de2ea66a46980bf2362bb79292f3 (diff) |
Extend display filter len() to support all string and byte field types.
len() can now handle FT_STRING, FT_STRINGZ, FT_STRINGZPAD,
FT_UINT_STRING, FT_BYTES, and FT_UINT_BYTES
through the use of fvalue_length()
Change-Id: I53baf2657f7804f64e63e4645d0b84b782ae9b08
Reviewed-on: https://code.wireshark.org/review/21775
Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan/dfilter')
-rw-r--r-- | epan/dfilter/dfunctions.c | 60 |
1 files changed, 55 insertions, 5 deletions
diff --git a/epan/dfilter/dfunctions.c b/epan/dfilter/dfunctions.c index 8b01d4bac7..2b08f2e4d0 100644 --- a/epan/dfilter/dfunctions.c +++ b/epan/dfilter/dfunctions.c @@ -87,11 +87,21 @@ df_func_len(GList* arg1list, GList *arg2junk _U_, GList **retval) arg1 = arg1list; while (arg1) { arg_fvalue = (fvalue_t *)arg1->data; - /* XXX - it would be nice to handle other types */ - if (IS_FT_STRING(fvalue_type_ftenum(arg_fvalue))) { + /* This should be a list of all of the types that make sense to have a length */ + switch (fvalue_type_ftenum(arg_fvalue)) + { + case FT_STRING: + case FT_STRINGZ: + case FT_STRINGZPAD: + case FT_UINT_STRING: + case FT_BYTES: + case FT_UINT_BYTES: ft_len = fvalue_new(FT_UINT32); - fvalue_set_uinteger(ft_len, (guint) strlen((char *)fvalue_get(arg_fvalue))); + fvalue_set_uinteger(ft_len, fvalue_length(arg_fvalue)); *retval = g_list_append(*retval, ft_len); + break; + default: + break; } arg1 = arg1->next; } @@ -138,7 +148,7 @@ df_func_count(GList* arg1list, GList *arg2junk _U_, GList **retval) } -/* For upper(), lower() and len(), checks that the parameter passed to +/* For upper() and lower() checks that the parameter passed to * it is an FT_STRING */ static void ul_semcheck_params(dfwork_t *dfw, int param_num, stnode_t *st_node) @@ -169,6 +179,46 @@ ul_semcheck_params(dfwork_t *dfw, int param_num, stnode_t *st_node) } } +/* For len() checks that the parameter passed to it is an string or byte type */ +static void +ul_semcheck_len_params(dfwork_t *dfw, int param_num, stnode_t *st_node) +{ + sttype_id_t type; + ftenum_t ftype; + header_field_info *hfinfo; + + type = stnode_type_id(st_node); + + if (param_num == 0) { + switch(type) { + case STTYPE_FIELD: + hfinfo = (header_field_info *)stnode_data(st_node); + ftype = hfinfo->type; + switch (ftype) + { + case FT_STRING: + case FT_STRINGZ: + case FT_STRINGZPAD: + case FT_UINT_STRING: + case FT_BYTES: + case FT_UINT_BYTES: + break; + default: + dfilter_fail(dfw, "Only string and byte type fields can be used in len()"); + THROW(TypeError); + break; + } + break; + default: + dfilter_fail(dfw, "Only string and byte type fields can be used in len()"); + THROW(TypeError); + } + } + else { + g_assert_not_reached(); + } +} + static void ul_semcheck_field_param(dfwork_t *dfw, int param_num, stnode_t *st_node) { @@ -196,7 +246,7 @@ static df_func_def_t df_functions[] = { { "lower", df_func_lower, FT_STRING, 1, 1, ul_semcheck_params }, { "upper", df_func_upper, FT_STRING, 1, 1, ul_semcheck_params }, - { "len", df_func_len, FT_UINT32, 1, 1, ul_semcheck_params }, + { "len", df_func_len, FT_UINT32, 1, 1, ul_semcheck_len_params }, { "size", df_func_size, FT_UINT32, 1, 1, ul_semcheck_field_param }, { "count", df_func_count, FT_UINT32, 1, 1, ul_semcheck_field_param }, { NULL, NULL, FT_NONE, 0, 0, NULL } |