From 47e18ab1d1b8a343e7d29f1f3884a040a18147c6 Mon Sep 17 00:00:00 2001 Message-Id: <47e18ab1d1b8a343e7d29f1f3884a040a18147c6.1381871412.git.jdenemar@redhat.com> From: "Daniel P. Berrange" Date: Mon, 14 Oct 2013 16:45:14 +0100 Subject: [PATCH] Change way we fake dbus method calls For https://bugzilla.redhat.com/show_bug.cgi?id=1018730 Ubuntu libdbus.so links with -Bsymbolic-functions, which means that we can only LD_PRELOAD functions that we directly call. Functions which libdbus.so calls internally can not be replaced. Thus we cannot use dbus_message_new_error or dbus_message_new_method_return Signed-off-by: Daniel P. Berrange (cherry picked from commit dbd2bc8c8bdd927f3e9132afc8579dbaa1de91de) Signed-off-by: Jiri Denemark --- tests/virsystemdmock.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/tests/virsystemdmock.c b/tests/virsystemdmock.c index ded52d2..5dbd33f 100644 --- a/tests/virsystemdmock.c +++ b/tests/virsystemdmock.c @@ -65,22 +65,32 @@ dbus_bool_t dbus_message_set_reply_serial(DBusMessage *message ATTRIBUTE_UNUSED, } DBusMessage *dbus_connection_send_with_reply_and_block(DBusConnection *connection ATTRIBUTE_UNUSED, - DBusMessage *message, + DBusMessage *message ATTRIBUTE_UNUSED, int timeout_milliseconds ATTRIBUTE_UNUSED, DBusError *error) { DBusMessage *reply = NULL; - if (getenv("FAIL_BAD_SERVICE")) - reply = dbus_message_new_error(message, - "org.freedesktop.systemd.badthing", - "Something went wrong creating the machine"); - else if (getenv("FAIL_NO_SERVICE")) + if (getenv("FAIL_BAD_SERVICE")) { + DBusMessageIter iter; + const char *error_message = "Something went wrong creating the machine"; + if (!(reply = dbus_message_new(DBUS_MESSAGE_TYPE_ERROR))) + return NULL; + dbus_message_set_error_name(reply, "org.freedesktop.systemd.badthing"); + dbus_message_iter_init_append(reply, &iter); + if (!dbus_message_iter_append_basic(&iter, + DBUS_TYPE_STRING, + &error_message)) { + dbus_message_unref(reply); + return NULL; + } + } else if (getenv("FAIL_NO_SERVICE")) { dbus_set_error(error, "org.freedesktop.DBus.Error.ServiceUnknown", "%s", "The name org.freedesktop.machine1 was not provided by any .service files"); - else - reply = dbus_message_new_method_return(message); + } else { + reply = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_RETURN); + } return reply; } -- 1.8.3.2