Blob Blame History Raw
From fa734ee402ee1f41281ac89c3a376b24ae7e9112 Mon Sep 17 00:00:00 2001
From: David Kupka <dkupka@redhat.com>
Date: Wed, 7 Jan 2015 21:34:15 -0500
Subject: [PATCH] Retrieve string value from DBus property interface reply
 correctly.

org.freedesktop.DBus.Properties.Get method always returns variant data type.
The basic type inside it can't be accessed directly.
---
 src/getcert.c |  2 +-
 src/tdbusm.c  | 38 ++++++++++++++++++++++++++++++++++++++
 src/tdbusm.h  |  1 +
 3 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/src/getcert.c b/src/getcert.c
index 5ea5e538e5f3beb840f88e6dbe21957b155b873b..8b2cb8a937947ca3d932cc9405a82c90acefabb3 100644
--- a/src/getcert.c
+++ b/src/getcert.c
@@ -474,7 +474,7 @@ query_prop_s(enum cm_tdbus_type which,
 	DBusMessage *rep;
 	char *s;
 	rep = query_prop(which, path, interface, prop, verbose);
-	if (cm_tdbusm_get_s(rep, parent, &s) != 0) {
+	if (cm_tdbusm_get_vs(rep, parent, &s) != 0) {
 		s = "";
 	}
 	dbus_message_unref(rep);
diff --git a/src/tdbusm.c b/src/tdbusm.c
index dd3e800d1a5f2fe9c2d7feff3e3938a6adb4c1ab..f7aaea82e20994a7382518153980e14fb0405453 100644
--- a/src/tdbusm.c
+++ b/src/tdbusm.c
@@ -175,6 +175,44 @@ cm_tdbusm_get_p(DBusMessage *msg, void *parent, char **p)
 }
 
 int
+cm_tdbusm_get_vs(DBusMessage *msg, void *parent, char **s)
+{
+	DBusError err;
+	DBusMessageIter iter, sub_iter;
+
+	*s = NULL;
+	dbus_error_init(&err);
+
+	if (dbus_message_iter_init(msg, &iter) == FALSE) {
+		if (dbus_error_is_set(&err)) {
+			cm_log(3, "DBus error: %s", err.message);
+			dbus_error_free(&err);
+		} else {
+			cm_log(3, "Unknown DBus error.");
+		}
+		return -1;
+	}
+
+	if (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_VARIANT) {
+		dbus_message_iter_recurse(&iter, &sub_iter);
+		if (dbus_message_iter_get_arg_type(&sub_iter) == DBUS_TYPE_STRING) {
+			dbus_message_iter_get_basic(&sub_iter, s);
+			*s = *s ? talloc_strdup(parent, *s) : NULL;
+			return 0;
+		}
+	}
+
+	if (dbus_error_is_set(&err)) {
+		cm_log(3, "Failed to extract data from DBus message: %s", err.message);
+		dbus_error_free(&err);
+	} else {
+		cm_log(3, "Failed to extract data from DBus message.");
+	}
+	*s = NULL;
+	return -1;
+}
+
+int
 cm_tdbusm_get_s(DBusMessage *msg, void *parent, char **s)
 {
 	DBusError err;
diff --git a/src/tdbusm.h b/src/tdbusm.h
index b926b4941985509696b965fc955b2f204ce856df..813fae2f4a4a72da512e7559b5ed437cab4766e1 100644
--- a/src/tdbusm.h
+++ b/src/tdbusm.h
@@ -22,6 +22,7 @@ int cm_tdbusm_get_b(DBusMessage *msg, void *parent, dbus_bool_t *b);
 int cm_tdbusm_get_n(DBusMessage *msg, void *parent, long *n);
 int cm_tdbusm_get_p(DBusMessage *msg, void *parent, char **p);
 int cm_tdbusm_get_s(DBusMessage *msg, void *parent, char **s);
+int cm_tdbusm_get_vs(DBusMessage *msg, void *parent, char **s);
 int cm_tdbusm_get_bp(DBusMessage *msg, void *parent, dbus_bool_t *b, char **p);
 int cm_tdbusm_get_bs(DBusMessage *msg, void *parent, dbus_bool_t *b, char **s);
 int cm_tdbusm_get_sb(DBusMessage *msg, void *parent, char **s, dbus_bool_t *b);
-- 
2.1.0