diff --git a/include/crm/pengine/internal.h b/include/crm/pengine/internal.h index 7f22512..7a38234 100644 --- a/include/crm/pengine/internal.h +++ b/include/crm/pengine/internal.h @@ -533,6 +533,8 @@ op_digest_cache_t *pe__calculate_digests(pe_resource_t *rsc, const char *task, xmlNode *xml_op, bool calc_secure, pe_working_set_t *data_set); +void pe__free_digests(gpointer ptr); + op_digest_cache_t *rsc_action_digest_cmp(pe_resource_t * rsc, xmlNode * xml_op, pe_node_t * node, pe_working_set_t * data_set); diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c index 44dba47..4655c7e 100644 --- a/lib/pengine/unpack.c +++ b/lib/pengine/unpack.c @@ -376,20 +376,31 @@ unpack_config(xmlNode * config, pe_working_set_t * data_set) return TRUE; } -static void -destroy_digest_cache(gpointer ptr) +/*! + * \internal + * \brief Free an operation digest cache entry + * + * \param[in] ptr Pointer to cache entry to free + * + * \note The argument is a gpointer so this can be used as a hash table + * free function. + */ +void +pe__free_digests(gpointer ptr) { op_digest_cache_t *data = ptr; - free_xml(data->params_all); - free_xml(data->params_secure); - free_xml(data->params_restart); + if (data != NULL) { + free_xml(data->params_all); + free_xml(data->params_secure); + free_xml(data->params_restart); - free(data->digest_all_calc); - free(data->digest_restart_calc); - free(data->digest_secure_calc); + free(data->digest_all_calc); + free(data->digest_restart_calc); + free(data->digest_secure_calc); - free(data); + free(data); + } } pe_node_t * @@ -446,7 +457,7 @@ pe_create_node(const char *id, const char *uname, const char *type, new_node->details->digest_cache = g_hash_table_new_full(crm_str_hash, g_str_equal, free, - destroy_digest_cache); + pe__free_digests); data_set->nodes = g_list_insert_sorted(data_set->nodes, new_node, sort_node_uname); return new_node; diff --git a/lib/pengine/utils.c b/lib/pengine/utils.c index c441c71..bded23c 100644 --- a/lib/pengine/utils.c +++ b/lib/pengine/utils.c @@ -2216,7 +2216,7 @@ calculate_restart_digest(op_digest_cache_t *data, xmlNode *xml_op, * * \return Pointer to new digest cache entry (or NULL on memory error) * \note It is the caller's responsibility to free the result using - * destroy_digest_cache(). + * pe__free_digests(). */ op_digest_cache_t * pe__calculate_digests(pe_resource_t *rsc, const char *task, const char *key,