From 5042a3b19a2f2bfa3d09b4d1029f53e6b674918b Mon Sep 17 00:00:00 2001
From: Ken Gaillot <kgaillot@redhat.com>
Date: Thu, 14 Dec 2017 09:16:47 -0600
Subject: [PATCH 1/5] Test: CTS: remove dead code
makes static analysis happy
---
cts/CTSaudits.py | 1 -
cts/environment.py | 1 -
cts/remote.py | 5 +----
cts/watcher.py | 6 +++---
4 files changed, 4 insertions(+), 9 deletions(-)
diff --git a/cts/CTSaudits.py b/cts/CTSaudits.py
index aff897f..d9fbeb9 100755
--- a/cts/CTSaudits.py
+++ b/cts/CTSaudits.py
@@ -190,7 +190,6 @@ class DiskAudit(ClusterAudit):
if answer and answer == "n":
raise ValueError("Disk full on %s" % (node))
- ret = 0
elif remaining_mb < 100 or used_percent > 90:
self.CM.log("WARN: Low on log disk space (%dMB) on %s" % (remaining_mb, node))
diff --git a/cts/environment.py b/cts/environment.py
index 75a18c8..6c4831c 100644
--- a/cts/environment.py
+++ b/cts/environment.py
@@ -182,7 +182,6 @@ class Environment:
else:
raise ValueError("Unknown stack: "+name)
- sys.exit(1)
def get_stack_short(self):
# Create the Cluster Manager object
diff --git a/cts/remote.py b/cts/remote.py
index 8c36918..7cef40e 100644
--- a/cts/remote.py
+++ b/cts/remote.py
@@ -220,10 +220,7 @@ class RemoteExec:
if not silent:
for err in errors:
- if stdout == 3:
- result.append("error: "+err)
- else:
- self.debug("cmd: stderr: %s" % err)
+ self.debug("cmd: stderr: %s" % err)
if stdout == 0:
if not silent and result:
diff --git a/cts/watcher.py b/cts/watcher.py
index de032f7..42685ad 100644
--- a/cts/watcher.py
+++ b/cts/watcher.py
@@ -337,19 +337,19 @@ class LogWatcher(RemoteExec):
self.kind = kind
else:
raise
- self.kind = self.Env["LogWatcher"]
+ #self.kind = self.Env["LogWatcher"]
if log:
self.filename = log
else:
raise
- self.filename = self.Env["LogFileName"]
+ #self.filename = self.Env["LogFileName"]
if hosts:
self.hosts = hosts
else:
raise
- self.hosts = self.Env["nodes"]
+ #self.hosts = self.Env["nodes"]
if trace_lw:
self.debug_level = 3
--
1.8.3.1
From 570929eba229558b1a6900ffc54e4d5ee4150f74 Mon Sep 17 00:00:00 2001
From: Ken Gaillot <kgaillot@redhat.com>
Date: Thu, 14 Dec 2017 09:23:03 -0600
Subject: [PATCH 2/5] Refactor: pengine: validate more function arguments
not an issue with current code, but makes static analysis happy
---
pengine/clone.c | 3 ++-
pengine/utilization.c | 1 +
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/pengine/clone.c b/pengine/clone.c
index 99bac7e..e81dbc8 100644
--- a/pengine/clone.c
+++ b/pengine/clone.c
@@ -955,6 +955,7 @@ is_child_compatible(resource_t *child_rsc, node_t * local_node, enum rsc_role_e
node_t *node = NULL;
enum rsc_role_e next_role = child_rsc->fns->state(child_rsc, current);
+ CRM_CHECK(child_rsc && local_node, return FALSE);
if (is_set_recursive(child_rsc, pe_rsc_block, TRUE) == FALSE) {
/* We only want instances that haven't failed */
node = child_rsc->fns->location(child_rsc, NULL, current);
@@ -965,7 +966,7 @@ is_child_compatible(resource_t *child_rsc, node_t * local_node, enum rsc_role_e
return FALSE;
}
- if (node && local_node && node->details == local_node->details) {
+ if (node && (node->details == local_node->details)) {
return TRUE;
} else if (node) {
diff --git a/pengine/utilization.c b/pengine/utilization.c
index f42c85d..05f8d78 100644
--- a/pengine/utilization.c
+++ b/pengine/utilization.c
@@ -341,6 +341,7 @@ process_utilization(resource_t * rsc, node_t ** prefer, pe_working_set_t * data_
{
int alloc_details = scores_log_level + 1;
+ CRM_CHECK(rsc && prefer && data_set, return);
if (safe_str_neq(data_set->placement_strategy, "default")) {
GHashTableIter iter;
GListPtr colocated_rscs = NULL;
--
1.8.3.1
From db2fdc9a452fef11d397e25202fde8ba1bad4cd3 Mon Sep 17 00:00:00 2001
From: Ken Gaillot <kgaillot@redhat.com>
Date: Thu, 14 Dec 2017 10:36:20 -0600
Subject: [PATCH 3/5] Low: libcrmservice: avoid memory leak on DBus error
---
lib/services/dbus.c | 47 +++++++++++++++++++++++++++++++++++++----------
1 file changed, 37 insertions(+), 10 deletions(-)
diff --git a/lib/services/dbus.c b/lib/services/dbus.c
index fb3e867..58df927 100644
--- a/lib/services/dbus.c
+++ b/lib/services/dbus.c
@@ -23,6 +23,15 @@ struct db_getall_data {
void (*callback)(const char *name, const char *value, void *userdata);
};
+static void
+free_db_getall_data(struct db_getall_data *data)
+{
+ free(data->target);
+ free(data->object);
+ free(data->name);
+ free(data);
+}
+
DBusConnection *
pcmk_dbus_connect(void)
{
@@ -196,6 +205,20 @@ pcmk_dbus_send_recv(DBusMessage *msg, DBusConnection *connection,
return reply;
}
+/*!
+ * \internal
+ * \brief Send a DBus message with a callback for the reply
+ *
+ * \param[in] msg DBus message to send
+ * \param[in,out] connection DBus connection to send on
+ * \param[in] done Function to call when pending call completes
+ * \param[in] user_data Data to pass to done callback
+ *
+ * \return Handle for reply on success, NULL on error
+ * \note The caller can assume that the done callback is called always and
+ * only when the return value is non-NULL. (This allows the caller to
+ * know where it should free dynamically allocated user_data.)
+ */
DBusPendingCall *
pcmk_dbus_send(DBusMessage *msg, DBusConnection *connection,
void(*done)(DBusPendingCall *pending, void *user_data),
@@ -359,11 +382,7 @@ pcmk_dbus_lookup_result(DBusMessage *reply, struct db_getall_data *data)
}
cleanup:
- free(data->target);
- free(data->object);
- free(data->name);
- free(data);
-
+ free_db_getall_data(data);
return output;
}
@@ -424,11 +443,19 @@ pcmk_dbus_get_property(DBusConnection *connection, const char *target,
query_data->name = strdup(name);
}
- if(query_data->callback) {
- DBusPendingCall* _pending;
- _pending = pcmk_dbus_send(msg, connection, pcmk_dbus_lookup_cb, query_data, timeout);
- if (pending != NULL) {
- *pending = _pending;
+ if (query_data->callback) {
+ DBusPendingCall *local_pending;
+
+ local_pending = pcmk_dbus_send(msg, connection, pcmk_dbus_lookup_cb,
+ query_data, timeout);
+ if (local_pending == NULL) {
+ // pcmk_dbus_lookup_cb() was not called in this case
+ free_db_getall_data(query_data);
+ query_data = NULL;
+ }
+
+ if (pending) {
+ *pending = local_pending;
}
} else {
--
1.8.3.1
From 4a774710ec7269ec3a1427ae09fc6ca435c66e92 Mon Sep 17 00:00:00 2001
From: Ken Gaillot <kgaillot@redhat.com>
Date: Thu, 14 Dec 2017 12:44:04 -0600
Subject: [PATCH 4/5] Build: systemd unit files: restore DBus dependency
06e2e26 removed the unit files' DBus dependency on the advice of a
systemd developer, but it is necessary
---
lrmd/pacemaker_remote.service.in | 3 +++
mcp/pacemaker.service.in | 4 ++++
2 files changed, 7 insertions(+)
diff --git a/lrmd/pacemaker_remote.service.in b/lrmd/pacemaker_remote.service.in
index d5717f6..1c596e1 100644
--- a/lrmd/pacemaker_remote.service.in
+++ b/lrmd/pacemaker_remote.service.in
@@ -2,8 +2,11 @@
Description=Pacemaker Remote Service
Documentation=man:pacemaker_remoted http://clusterlabs.org/doc/en-US/Pacemaker/1.1-pcs/html/Pacemaker_Remote/index.html
+# See main pacemaker unit file for descriptions of why these are needed
After=network.target
After=time-sync.target
+After=dbus.service
+Wants=dbus.service
After=resource-agents-deps.target
Wants=resource-agents-deps.target
After=syslog.service
diff --git a/mcp/pacemaker.service.in b/mcp/pacemaker.service.in
index 516de0f..e532ea2 100644
--- a/mcp/pacemaker.service.in
+++ b/mcp/pacemaker.service.in
@@ -14,6 +14,10 @@ After=network.target
# and failure timestamps, so wait until it's done.
After=time-sync.target
+# Managing systemd resources requires DBus.
+After=dbus.service
+Wants=dbus.service
+
# Some OCF resources may have dependencies that aren't managed by the cluster;
# these must be started before Pacemaker and stopped after it. The
# resource-agents package provides this target, which lets system adminstrators
--
1.8.3.1
From 69de188a7263ba66afa0e8a3a46a64f07a7facca Mon Sep 17 00:00:00 2001
From: Ken Gaillot <kgaillot@redhat.com>
Date: Thu, 14 Dec 2017 16:05:12 -0600
Subject: [PATCH 5/5] Low: attrd: avoid small memory leak at start-up
introduced by 3518544
---
attrd/commands.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/attrd/commands.c b/attrd/commands.c
index 0a20b26..20bd82f 100644
--- a/attrd/commands.c
+++ b/attrd/commands.c
@@ -539,6 +539,7 @@ attrd_broadcast_protocol()
crm_xml_add(attrd_op, F_ATTRD_VALUE, ATTRD_PROTOCOL_VERSION);
crm_xml_add_int(attrd_op, F_ATTRD_IS_PRIVATE, 1);
attrd_client_update(attrd_op);
+ free_xml(attrd_op);
}
void
--
1.8.3.1