File pacemaker-crm_resource-restart-memory-leaks.patch of Package pacemaker.3577
commit aaed9569272a5d4704aede32d9d1cf5d76085e6b
Author: Ken Gaillot <kgaillot@redhat.com>
Date: Sun Jun 12 15:36:56 2016 -0500
Fix: tools: avoid memory leaks in crm_resource --restart
diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c
index 1567559..6126e3c 100644
--- a/tools/crm_resource_runtime.c
+++ b/tools/crm_resource_runtime.c
@@ -1148,6 +1148,12 @@ cli_resource_restart(resource_t * rsc, const char *host, int timeout_ms, cib_t *
}
if(rc != pcmk_ok) {
fprintf(stderr, "Could not set target-role for %s: %s (%d)\n", rsc_id, pcmk_strerror(rc), rc);
+ if (current_active) {
+ g_list_free_full(current_active, free);
+ }
+ if (restart_target_active) {
+ g_list_free_full(restart_target_active, free);
+ }
free(rsc_id);
return crm_exit(rc);
}
@@ -1185,7 +1191,11 @@ cli_resource_restart(resource_t * rsc, const char *host, int timeout_ms, cib_t *
goto failure;
}
+ if (current_active) {
+ g_list_free_full(current_active, free);
+ }
current_active = get_active_resources(host, &data_set);
+ g_list_free(list_delta);
list_delta = subtract_lists(current_active, target_active);
dump_list(current_active, "Current");
dump_list(list_delta, "Delta");
@@ -1222,7 +1232,13 @@ cli_resource_restart(resource_t * rsc, const char *host, int timeout_ms, cib_t *
return crm_exit(rc);
}
+ if (target_active) {
+ g_list_free_full(target_active, free);
+ }
target_active = restart_target_active;
+ if (list_delta) {
+ g_list_free(list_delta);
+ }
list_delta = subtract_lists(target_active, current_active);
fprintf(stdout, "Waiting for %d resources to start again:\n", g_list_length(list_delta));
display_list(list_delta, " * ");
@@ -1248,7 +1264,11 @@ cli_resource_restart(resource_t * rsc, const char *host, int timeout_ms, cib_t *
goto failure;
}
+ if (current_active) {
+ g_list_free_full(current_active, free);
+ }
current_active = get_active_resources(host, &data_set);
+ g_list_free(list_delta);
list_delta = subtract_lists(target_active, current_active);
dump_list(current_active, "Current");
dump_list(list_delta, "Delta");
@@ -1264,8 +1284,8 @@ cli_resource_restart(resource_t * rsc, const char *host, int timeout_ms, cib_t *
}
- free(rsc_id);
- return pcmk_ok;
+ rc = pcmk_ok;
+ goto done;
failure:
if(is_clone && host) {
@@ -1278,6 +1298,21 @@ cli_resource_restart(resource_t * rsc, const char *host, int timeout_ms, cib_t *
} else {
cli_resource_delete_attribute(rsc_id, NULL, NULL, XML_RSC_ATTR_TARGET_ROLE, cib, &data_set);
}
+
+done:
+ if (list_delta) {
+ g_list_free(list_delta);
+ }
+ if (current_active) {
+ g_list_free_full(current_active, free);
+ }
+ if (target_active && (target_active != restart_target_active)) {
+ g_list_free_full(target_active, free);
+ }
+ if (restart_target_active) {
+ g_list_free_full(restart_target_active, free);
+ }
+ cleanup_alloc_calculations(&data_set);
free(rsc_id);
return rc;
}