From: Karl Fleischmann Date: Wed, 21 Dec 2022 13:23:10 +0000 (+0100) Subject: lib: Warn about event filter type mismatches between integer fields and wildcard... X-Git-Tag: 2.4.0~3237 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4109629059e91d2c1639577f9cf3dd691e412f2e;p=thirdparty%2Fdovecot%2Fcore.git lib: Warn about event filter type mismatches between integer fields and wildcard values --- diff --git a/src/lib/event-filter.c b/src/lib/event-filter.c index b4884a911d..c619828ac6 100644 --- a/src/lib/event-filter.c +++ b/src/lib/event-filter.c @@ -654,7 +654,23 @@ event_match_field(struct event *event, struct event_filter_node *node, } return FALSE; } else if (node->op != EVENT_FILTER_OP_CMP_EQ) { - /* we only support string equality comparisons */ + /* In this branch a numeric value is matched against a + wildcard, which requires an equality operation. */ + if (!node->warned_type_mismatch) { + const char *name = event->sending_name; + /* Use i_warning to prevent event filter recursions. */ + i_warning("Event filter matches integer field " + "'%s' against wildcard value '%s' " + "with an incompatible operation '%s', " + "please use '='. (event=%s, " + "source=%s:%u)", + wanted_field->key, + wanted_field->value.str, + event_filter_export_query_expr_op(node->op), + name != NULL ? name : "", + source_filename, source_linenum); + node->warned_type_mismatch = TRUE; + } return FALSE; } else { char tmp[MAX_INT_STRLEN]; diff --git a/src/lib/test-event-filter.c b/src/lib/test-event-filter.c index 25d3359864..4f37a1c17e 100644 --- a/src/lib/test-event-filter.c +++ b/src/lib/test-event-filter.c @@ -638,11 +638,6 @@ static void test_event_filter_numbers(void) event_add_int(e, "number", 0); - filter = event_filter_create(); - test_assert(event_filter_parse("number > *", filter, &error) == 0); - test_assert(!event_filter_match(filter, e, &failure_ctx)); - event_filter_unref(&filter); - filter = event_filter_create(); test_assert(event_filter_parse("number=0", filter, &error) == 0); test_assert(event_filter_match(filter, e, &failure_ctx)); @@ -669,6 +664,23 @@ static void test_event_filter_numbers(void) test_expect_no_more_errors(); event_filter_unref(&filter); + event_add_int(e, "status_code", 204); + + filter = event_filter_create(); + test_assert(event_filter_parse("status_code > 2*", filter, &error) == 0); + test_expect_error_string("Event filter matches integer field " + "'status_code' against wildcard value '2*' " + "with an incompatible operation '>', please " + "use '='."); + test_assert(!event_filter_match(filter, e, &failure_ctx)); + test_expect_no_more_errors(); + event_filter_unref(&filter); + + filter = event_filter_create(); + test_assert(event_filter_parse("status_code = 2*", filter, &error) == 0); + test_assert(event_filter_match(filter, e, &failure_ctx)); + event_filter_unref(&filter); + event_unref(&e); test_end(); }