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