]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Warn about event filter type mismatches if comparing integer fields with strcmp...
authorKarl Fleischmann <karl.fleischmann@open-xchange.com>
Wed, 21 Dec 2022 13:15:22 +0000 (14:15 +0100)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Mon, 9 Jan 2023 09:48:38 +0000 (09:48 +0000)
Reorder branches to preserve existing behavior.

src/lib/event-filter.c
src/lib/test-event-filter.c

index 3bb52d6d2b2d4a02e8fa0e02bed7660501c6b9eb..b4884a911db344700071e2059bc398edebb8504d 100644 (file)
@@ -634,8 +634,12 @@ event_match_field(struct event *event, struct event_filter_node *node,
                                node->warned_ambiguous_unit = TRUE;
                        }
                        return FALSE;
-               } else if ((wanted_field->value_type != EVENT_FIELD_VALUE_TYPE_INTMAX) &&
-                   (node->type != EVENT_FILTER_NODE_TYPE_EVENT_FIELD_NUMERIC_WILDCARD)) {
+               } else if (wanted_field->value_type == EVENT_FIELD_VALUE_TYPE_INTMAX) {
+                       /* compare against an integer */
+                       return event_filter_handle_numeric_operation(
+                               node->op, field->value.intmax, wanted_field->value.intmax);
+               } else if (use_strcmp ||
+                          (node->type != EVENT_FILTER_NODE_TYPE_EVENT_FIELD_NUMERIC_WILDCARD)) {
                        if (!node->warned_type_mismatch) {
                                const char *name = event->sending_name;
                                /* Use i_warning to prevent event filter recursions. */
@@ -649,18 +653,9 @@ event_match_field(struct event *event, struct event_filter_node *node,
                                node->warned_type_mismatch = TRUE;
                        }
                        return FALSE;
-               } else if (wanted_field->value_type == EVENT_FIELD_VALUE_TYPE_INTMAX) {
-                       /* compare against an integer */
-                       return event_filter_handle_numeric_operation(
-                               node->op, field->value.intmax, wanted_field->value.intmax);
                } else if (node->op != EVENT_FILTER_OP_CMP_EQ) {
                        /* we only support string equality comparisons */
                        return FALSE;
-               } else if (use_strcmp) {
-                       /* If the matched value was a number, it was already matched
-                          in the previous branch. So here we have a non-wildcard
-                          string, which can never be a match to a number. */
-                       return FALSE;
                } else {
                        char tmp[MAX_INT_STRLEN];
                        i_snprintf(tmp, sizeof(tmp), "%jd", field->value.intmax);
index 1d7e71b6be3e4c878cbaaeaf6eaaacc81fadfcd9..25d3359864eb0655d1a9b82068dcde8933c53924 100644 (file)
@@ -653,6 +653,14 @@ static void test_event_filter_numbers(void)
        test_assert(event_filter_match(filter, e, &failure_ctx));
        event_filter_unref(&filter);
 
+       filter = event_filter_create();
+       test_assert(event_filter_parse("number > fish", filter, &error) == 0);
+       test_expect_error_string("Event filter matches integer field 'number' "
+                                "against non-integer value 'fish'");
+       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("number=fish", filter, &error) == 0);
        test_expect_error_string("Event filter matches integer field 'number' "