From 8054af4eab60f6da48daacddd11bb21929d3cc38 Mon Sep 17 00:00:00 2001 From: Andris Zeila Date: Wed, 23 Feb 2022 13:12:07 +0200 Subject: ........S. [ZBX-20649] fixed item->triggers update on trigger removal --- src/libs/zbxdbcache/dbconfig.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/libs/zbxdbcache/dbconfig.c b/src/libs/zbxdbcache/dbconfig.c index 4c768dc1630..8d1bb2caf58 100644 --- a/src/libs/zbxdbcache/dbconfig.c +++ b/src/libs/zbxdbcache/dbconfig.c @@ -102,7 +102,7 @@ extern int CONFIG_TIMER_FORKS; ZBX_MEM_FUNC_IMPL(__config, config_mem) static void dc_maintenance_precache_nested_groups(void); -static void dc_item_reset_triggers(ZBX_DC_ITEM *item); +static void dc_item_reset_triggers(ZBX_DC_ITEM *item, ZBX_DC_TRIGGER *trigger_exclude); /* by default the macro environment is non-secure and all secret macros are masked with ****** */ static unsigned char macro_env = ZBX_MACRO_ENV_NONSECURE; @@ -3727,7 +3727,7 @@ static void DCsync_triggers(zbx_dbsync_t *sync) for (itemid = trigger->itemids; 0 != *itemid; itemid++) { if (NULL != (item = (ZBX_DC_ITEM *)zbx_hashset_search(&config->items, itemid))) - dc_item_reset_triggers(item); + dc_item_reset_triggers(item, trigger); } } @@ -4236,7 +4236,7 @@ static void DCsync_functions(zbx_dbsync_t *sync) ZBX_DC_ITEM *item_last; if (NULL != (item_last = zbx_hashset_search(&config->items, &function->itemid))) - dc_item_reset_triggers(item_last); + dc_item_reset_triggers(item_last, NULL); } } else @@ -4250,7 +4250,7 @@ static void DCsync_functions(zbx_dbsync_t *sync) function->type = zbx_get_function_type(function->function); function->revision = config->sync_start_ts; - dc_item_reset_triggers(item); + dc_item_reset_triggers(item, NULL); } for (; SUCCEED == ret; ret = zbx_dbsync_next(sync, &rowid, &row, &tag)) @@ -4259,7 +4259,7 @@ static void DCsync_functions(zbx_dbsync_t *sync) continue; if (NULL != (item = (ZBX_DC_ITEM *)zbx_hashset_search(&config->items, &function->itemid))) - dc_item_reset_triggers(item); + dc_item_reset_triggers(item, NULL); zbx_strpool_release(function->function); zbx_strpool_release(function->parameter); @@ -5784,8 +5784,11 @@ static void dc_trigger_add_itemids(ZBX_DC_TRIGGER *trigger, const zbx_vector_uin * Purpose: reset item trigger links and remove corresponding itemids from * * affected triggers * * * + * Parameters: item - the item to reset * + * trigger - the trigger to exclude * + * * ******************************************************************************/ -static void dc_item_reset_triggers(ZBX_DC_ITEM *item) +static void dc_item_reset_triggers(ZBX_DC_ITEM *item, ZBX_DC_TRIGGER *trigger_exclude) { ZBX_DC_TRIGGER **trigger; @@ -5798,18 +5801,17 @@ static void dc_item_reset_triggers(ZBX_DC_ITEM *item) { zbx_uint64_t *itemid; + if (*trigger == trigger_exclude) + continue; + if (NULL != (*trigger)->itemids) { for (itemid = (*trigger)->itemids; 0 != *itemid; itemid++) { if (item->itemid == *itemid) { - do - { - *itemid = itemid[1]; + while (0 != (*itemid = itemid[1])) itemid++; - } - while (0 != *itemid); break; } -- cgit v1.2.3 From 88bbee8c07f011d9780ad9121d7878ac7e2d61df Mon Sep 17 00:00:00 2001 From: Andris Zeila Date: Wed, 23 Feb 2022 13:21:40 +0200 Subject: .D........ [ZBX-20649] added changelog entry --- ChangeLog.d/bugfix/ZBX-20649 | 1 + 1 file changed, 1 insertion(+) create mode 100644 ChangeLog.d/bugfix/ZBX-20649 diff --git a/ChangeLog.d/bugfix/ZBX-20649 b/ChangeLog.d/bugfix/ZBX-20649 new file mode 100644 index 00000000000..d353a50e48f --- /dev/null +++ b/ChangeLog.d/bugfix/ZBX-20649 @@ -0,0 +1 @@ +........S. [ZBX-20649] fixed crash when server attempted to use trigger after it was removed from cache (wiper) -- cgit v1.2.3