39 lines
1.3 KiB
Diff
39 lines
1.3 KiB
Diff
# UNDF: UNDF-2026-000000881
|
|
--- a/src/zabbix_server/service/service_manager.c
|
|
+++ b/src/zabbix_server/service/service_manager.c
|
|
@@ -2946,6 +2946,8 @@
|
|
static void process_problem_tags(zbx_vector_events_ptr_t *events, zbx_service_manager_t *service_manager)
|
|
{
|
|
+ zbx_hashset_t tag_set;
|
|
+
|
|
zabbix_log(LOG_LEVEL_DEBUG, "In %s() events_num:%d", __func__, events->values_num);
|
|
|
|
for (int i = 0; i < events->values_num; i++)
|
|
@@ -2960,9 +2962,16 @@
|
|
continue;
|
|
}
|
|
|
|
- for (int j = 0; j < event->tags.values_num; j++)
|
|
+ /* CWE-407 fix: use hashset for O(1) tag dedup instead of
|
|
+ * O(T) linear scan per tag → O(T²) per event.
|
|
+ */
|
|
+ zbx_hashset_create(&tag_set, (size_t)(*ptr)->tags.values_num,
|
|
+ zbx_tags_hash, zbx_tags_compare);
|
|
+ for (int j = 0; j < (*ptr)->tags.values_num; j++)
|
|
+ zbx_hashset_insert(&tag_set, &(*ptr)->tags.values[j], sizeof(zbx_tag_t *));
|
|
+
|
|
+ for (int j = 0; j < event->tags.values_num; j++)
|
|
{
|
|
- if (FAIL == zbx_vector_tags_ptr_search(&(*ptr)->tags, event->tags.values[j],
|
|
- zbx_compare_tags_and_values))
|
|
+ if (NULL == zbx_hashset_search(&tag_set, &event->tags.values[j]))
|
|
{
|
|
zbx_vector_tags_ptr_append(&(*ptr)->tags, event->tags.values[j]);
|
|
}
|
|
@@ -2975,6 +2984,7 @@
|
|
}
|
|
}
|
|
|
|
+ zbx_hashset_destroy(&tag_set);
|
|
event->tags.values_num = 0;
|
|
event_free(event);
|