java-topology/defects/zabbix-0001/patch/zabbix-0001.patch

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);