From 2e048df011a56eaf2a5b3d86b76a8b5675f9e113 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Valverde?= Date: Sun, 17 Oct 2021 17:09:05 +0100 Subject: dfilter: Improve error message for "matches" Should be more obvious that this error is caused by a string syntax error and not something else. --- epan/dfilter/dfilter-int.h | 2 +- epan/dfilter/dfilter.c | 17 ++++++++++++++--- epan/dfilter/grammar.lemon | 5 ++--- test/suite_dfilter/group_syntax.py | 2 +- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/epan/dfilter/dfilter-int.h b/epan/dfilter/dfilter-int.h index 44d1a448ae..c6cc1812c4 100644 --- a/epan/dfilter/dfilter-int.h +++ b/epan/dfilter/dfilter-int.h @@ -87,7 +87,7 @@ stnode_t * dfilter_new_function(dfwork_t *dfw, const char *name); stnode_t * -dfilter_new_regex(dfwork_t *dfw, const char *patt); +dfilter_new_regex(dfwork_t *dfw, stnode_t *node); gboolean dfilter_str_to_gint32(dfwork_t *dfw, const char *s, gint32* pint); diff --git a/epan/dfilter/dfilter.c b/epan/dfilter/dfilter.c index 9dd34f1163..263b5c192c 100644 --- a/epan/dfilter/dfilter.c +++ b/epan/dfilter/dfilter.c @@ -80,11 +80,21 @@ dfilter_new_function(dfwork_t *dfw, const char *name) /* Gets a GRegex from a string, and sets the error message on failure. */ stnode_t * -dfilter_new_regex(dfwork_t *dfw, const char *patt) +dfilter_new_regex(dfwork_t *dfw, stnode_t *node) { GError *regex_error = NULL; GRegex *pcre; + const char *patt; + if (stnode_type_id(node) == STTYPE_STRING) { + patt = stnode_data(node); + } + else { + dfilter_parse_fail(dfw, "Expected a string not %s", stnode_todisplay(node)); + return node; + } + + patt = stnode_data(node); ws_debug("Compile regex pattern: %s", patt); /* @@ -108,10 +118,11 @@ dfilter_new_regex(dfwork_t *dfw, const char *patt) if (regex_error) { dfilter_parse_fail(dfw, "%s", regex_error->message); g_error_free(regex_error); - pcre = NULL; + return node; } - return stnode_new(STTYPE_PCRE, pcre, patt); + stnode_replace(node, STTYPE_PCRE, pcre); + return node; } gboolean diff --git a/epan/dfilter/grammar.lemon b/epan/dfilter/grammar.lemon index b48d76da9c..97e85307a5 100644 --- a/epan/dfilter/grammar.lemon +++ b/epan/dfilter/grammar.lemon @@ -302,10 +302,9 @@ relation_test(T) ::= entity(E) rel_binop(O) relation_test(R). } /* "matches" does not chain with other relational tests. */ -relation_test(T) ::= entity(E) TEST_MATCHES STRING(S). +relation_test(T) ::= entity(E) TEST_MATCHES entity(F). { - stnode_t *R = dfilter_new_regex(dfw, stnode_token_value(S)); - stnode_free(S); + stnode_t *R = dfilter_new_regex(dfw, F); T = stnode_new(STTYPE_TEST, NULL, NULL); sttype_test_set2(T, TEST_OP_MATCHES, E, R); diff --git a/test/suite_dfilter/group_syntax.py b/test/suite_dfilter/group_syntax.py index 23b39052ac..42a7099e68 100644 --- a/test/suite_dfilter/group_syntax.py +++ b/test/suite_dfilter/group_syntax.py @@ -37,7 +37,7 @@ class case_syntax(unittest.TestCase): def test_matches_2(self, checkDFilterFail): dfilter = 'http.request.method matches HEAD' - checkDFilterFail(dfilter, '"HEAD" was unexpected in this context') + checkDFilterFail(dfilter, 'Expected a string') def test_matches_3(self, checkDFilterFail): dfilter = 'http.request.method matches "^HEAD" matches "^POST"' -- cgit v1.2.3