diff options
author | Andris Zeila <andris.zeila@zabbix.com> | 2022-02-23 15:38:54 +0300 |
---|---|---|
committer | Andris Zeila <andris.zeila@zabbix.com> | 2022-02-23 15:38:54 +0300 |
commit | 1dc9992de992706d59650365297e31123faa4705 (patch) | |
tree | 4002c797016011e961dfafda53952dd9b0f9dd66 | |
parent | c00214ce230834584e9310856e592b0c63d823d3 (diff) | |
parent | 88bbee8c07f011d9780ad9121d7878ac7e2d61df (diff) |
........S. [ZBX-20649] fixed crash when server attempted to use trigger after it was removed from cache
Merge in ZBX/zabbix from feature/ZBX-20649-5.4 to release/5.4
* commit '88bbee8c07f011d9780ad9121d7878ac7e2d61df':
.D........ [ZBX-20649] added changelog entry
........S. [ZBX-20649] fixed item->triggers update on trigger removal
-rw-r--r-- | ChangeLog.d/bugfix/ZBX-20649 | 1 | ||||
-rw-r--r-- | src/libs/zbxdbcache/dbconfig.c | 24 |
2 files changed, 14 insertions, 11 deletions
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) 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; } |