Blame SOURCES/pacemaker-cb0f29d4.patch

46d66e
From cb0f29d437ded2557d8ae35970fdadf9da7392c1 Mon Sep 17 00:00:00 2001
46d66e
From: David Vossel <dvossel@redhat.com>
46d66e
Date: Fri, 6 Mar 2015 13:19:43 -0500
46d66e
Subject: [PATCH] Fix: systemd: fix crash caused when canceling in-flight
46d66e
 operation
46d66e
46d66e
---
46d66e
 lib/services/dbus.c      |  8 ++++++--
46d66e
 lib/services/pcmk-dbus.h |  3 ++-
46d66e
 lib/services/systemd.c   | 21 +++++++++++++++++----
46d66e
 lib/services/upstart.c   | 14 ++++++++++++--
46d66e
 4 files changed, 37 insertions(+), 9 deletions(-)
46d66e
46d66e
diff --git a/lib/services/dbus.c b/lib/services/dbus.c
46d66e
index f44b590..637f749 100644
46d66e
--- a/lib/services/dbus.c
46d66e
+++ b/lib/services/dbus.c
46d66e
@@ -325,7 +325,7 @@ pcmk_dbus_lookup_cb(DBusPendingCall *pending, void *user_data)
46d66e
 char *
46d66e
 pcmk_dbus_get_property(
46d66e
     DBusConnection *connection, const char *target, const char *obj, const gchar * iface, const char *name,
46d66e
-    void (*callback)(const char *name, const char *value, void *userdata), void *userdata)
46d66e
+    void (*callback)(const char *name, const char *value, void *userdata), void *userdata, DBusPendingCall **pending)
46d66e
 {
46d66e
     DBusMessage *msg;
46d66e
     const char *method = "GetAll";
46d66e
@@ -365,7 +365,11 @@ pcmk_dbus_get_property(
46d66e
     }
46d66e
 
46d66e
     if(query_data->callback) {
46d66e
-        pcmk_dbus_send(msg, connection, pcmk_dbus_lookup_cb, query_data);
46d66e
+        DBusPendingCall* _pending;
46d66e
+        _pending = pcmk_dbus_send(msg, connection, pcmk_dbus_lookup_cb, query_data);
46d66e
+        if (pending != NULL) {
46d66e
+            *pending = _pending;
46d66e
+        }
46d66e
 
46d66e
     } else {
46d66e
         DBusMessage *reply = pcmk_dbus_send_recv(msg, connection, NULL);
46d66e
diff --git a/lib/services/pcmk-dbus.h b/lib/services/pcmk-dbus.h
46d66e
index 468020e..63910f6 100644
46d66e
--- a/lib/services/pcmk-dbus.h
46d66e
+++ b/lib/services/pcmk-dbus.h
46d66e
@@ -8,7 +8,8 @@ DBusMessage *pcmk_dbus_send_recv(DBusMessage *msg, DBusConnection *connection, D
46d66e
 bool pcmk_dbus_type_check(DBusMessage *msg, DBusMessageIter *field, int expected, const char *function, int line);
46d66e
 char *pcmk_dbus_get_property(
46d66e
     DBusConnection *connection, const char *target, const char *obj, const gchar * iface, const char *name,
46d66e
-    void (*callback)(const char *name, const char *value, void *userdata), void *userdata);
46d66e
+    void (*callback)(const char *name, const char *value, void *userdata), void *userdata,
46d66e
+    DBusPendingCall **pending);
46d66e
 
46d66e
 bool pcmk_dbus_find_error(const char *method, DBusPendingCall* pending, DBusMessage *reply, DBusError *error);
46d66e
 
46d66e
diff --git a/lib/services/systemd.c b/lib/services/systemd.c
46d66e
index c0a1721..10c605a 100644
46d66e
--- a/lib/services/systemd.c
46d66e
+++ b/lib/services/systemd.c
46d66e
@@ -363,7 +363,7 @@ systemd_unit_metadata(const char *name)
46d66e
 
46d66e
     if (path) {
46d66e
         /* TODO: Worth a making blocking call for? Probably not. Possibly if cached. */
46d66e
-        desc = pcmk_dbus_get_property(systemd_proxy, BUS_NAME, path, BUS_NAME ".Unit", "Description", NULL, NULL);
46d66e
+        desc = pcmk_dbus_get_property(systemd_proxy, BUS_NAME, path, BUS_NAME ".Unit", "Description", NULL, NULL, NULL);
46d66e
     } else {
46d66e
         desc = g_strdup_printf("Systemd unit file for %s", name);
46d66e
     }
46d66e
@@ -499,6 +499,9 @@ systemd_unit_check(const char *name, const char *state, void *userdata)
46d66e
     }
46d66e
 
46d66e
     if (op->synchronous == FALSE) {
46d66e
+        if (op->opaque->pending) {
46d66e
+            dbus_pending_call_unref(op->opaque->pending);
46d66e
+        }
46d66e
         op->opaque->pending = NULL;
46d66e
         operation_finalize(op);
46d66e
     }
46d66e
@@ -521,14 +524,24 @@ systemd_unit_exec_with_unit(svc_action_t * op, const char *unit)
46d66e
     }
46d66e
 
46d66e
     if (safe_str_eq(op->action, "monitor") || safe_str_eq(method, "status")) {
46d66e
-        char *state = pcmk_dbus_get_property(systemd_proxy, BUS_NAME, unit, BUS_NAME ".Unit", "ActiveState",
46d66e
-                                             op->synchronous?NULL:systemd_unit_check, op);
46d66e
+        DBusPendingCall *pending = NULL;
46d66e
+        char *state;
46d66e
+
46d66e
+        state = pcmk_dbus_get_property(systemd_proxy, BUS_NAME, unit,
46d66e
+                                       BUS_NAME ".Unit", "ActiveState",
46d66e
+                                       op->synchronous?NULL:systemd_unit_check,
46d66e
+                                       op, op->synchronous?NULL:&pending);
46d66e
         if (op->synchronous) {
46d66e
             systemd_unit_check("ActiveState", state, op);
46d66e
             free(state);
46d66e
             return op->rc == PCMK_OCF_OK;
46d66e
+        } else if (pending) {
46d66e
+            dbus_pending_call_ref(pending);
46d66e
+            op->opaque->pending = pending;
46d66e
+            return TRUE;
46d66e
         }
46d66e
-        return TRUE;
46d66e
+
46d66e
+        return FALSE;
46d66e
 
46d66e
     } else if (g_strcmp0(method, "start") == 0) {
46d66e
         FILE *file_strm = NULL;
46d66e
diff --git a/lib/services/upstart.c b/lib/services/upstart.c
46d66e
index 01ff817..9894430 100644
46d66e
--- a/lib/services/upstart.c
46d66e
+++ b/lib/services/upstart.c
46d66e
@@ -322,6 +322,10 @@ upstart_job_check(const char *name, const char *state, void *userdata)
46d66e
     }
46d66e
 
46d66e
     if (op->synchronous == FALSE) {
46d66e
+        if (op->opaque->pending) {
46d66e
+            dbus_pending_call_unref(op->opaque->pending);
46d66e
+        }
46d66e
+        op->opaque->pending = NULL;
46d66e
         operation_finalize(op);
46d66e
     }
46d66e
 }
46d66e
@@ -465,9 +469,11 @@ upstart_job_exec(svc_action_t * op, gboolean synchronous)
46d66e
 
46d66e
         op->rc = PCMK_OCF_NOT_RUNNING;
46d66e
         if(path) {
46d66e
+            DBusPendingCall *pending = NULL;
46d66e
             char *state = pcmk_dbus_get_property(
46d66e
                 upstart_proxy, BUS_NAME, path, UPSTART_06_API ".Instance", "state",
46d66e
-                op->synchronous?NULL:upstart_job_check, op);
46d66e
+                op->synchronous?NULL:upstart_job_check, op,
46d66e
+                op->synchronous?NULL:&pending);
46d66e
 
46d66e
             free(job);
46d66e
             free(path);
46d66e
@@ -476,8 +482,12 @@ upstart_job_exec(svc_action_t * op, gboolean synchronous)
46d66e
                 upstart_job_check("state", state, op);
46d66e
                 free(state);
46d66e
                 return op->rc == PCMK_OCF_OK;
46d66e
+            } else if (pending) {
46d66e
+                dbus_pending_call_ref(pending);
46d66e
+                op->opaque->pending = pending;
46d66e
+                return TRUE;
46d66e
             }
46d66e
-            return TRUE;
46d66e
+            return FALSE;
46d66e
         }
46d66e
         goto cleanup;
46d66e
 
46d66e
-- 
46d66e
1.8.4.2
46d66e