From 39ea42018fa1f403e0366ce57ba3803a950b0754 Mon Sep 17 00:00:00 2001 From: Vftdan Date: Fri, 16 Aug 2024 22:43:37 +0200 Subject: [PATCH] Fix event_predicate - Leaking handle lists when deleting aggregate predicates - Wrong dynamic array growth condition - Handle invalid predicate type field --- event_predicate.c | 16 +++++++++++++--- event_predicate.h | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/event_predicate.c b/event_predicate.c index 8ebfde6..26d45a1 100644 --- a/event_predicate.c +++ b/event_predicate.c @@ -38,6 +38,14 @@ static void event_predicate_list_clear(EventPredicateList * lst) { if (lst->values) { + for (size_t i = 0; i < lst->length; ++i) { + EventPredicateType type = lst->values[i].type; + if (type == EVPRED_CONJUNCTION || type == EVPRED_DISJUNCTION) { + if (lst->values[i].aggregate_data.handles) { + free(lst->values[i].aggregate_data.handles); + } + } + } free(lst->values); lst->values = NULL; } @@ -46,16 +54,16 @@ event_predicate_list_clear(EventPredicateList * lst) } EventPredicateHandle -event_predicate_register(EventPredicate filter) +event_predicate_register(EventPredicate predicate) { size_t i = predicates.length; if (i >= INT32_MAX) { return -1; } - while (i <= predicates.capacity) { + while (i >= predicates.capacity) { event_predicate_list_extend(&predicates); } - predicates.values[i] = filter; + predicates.values[i] = predicate; predicates.length = i + 1; return (EventPredicateHandle) i; } @@ -157,6 +165,8 @@ event_predicate_apply(EventPredicateHandle handle, EventNode * event) } } break; + default: + return EVPREDRES_DISABLED; } if (ptr->inverted) { accepted = !accepted; diff --git a/event_predicate.h b/event_predicate.h index 2b1a240..f2ad2c7 100644 --- a/event_predicate.h +++ b/event_predicate.h @@ -41,7 +41,7 @@ struct event_predicate { }; }; -EventPredicateHandle event_predicate_register(EventPredicate filter); +EventPredicateHandle event_predicate_register(EventPredicate predicate); EventPredicate event_predicate_get(EventPredicateHandle handle); EventPredicateResult event_predicate_apply(EventPredicateHandle handle, EventNode * event); void event_predicate_set_enabled(EventPredicateHandle handle, bool enabled);